Cubism SDK for Unityで、ポーズのフェードをオフにするには
いつもお世話になっています。
何も表示していない状態から、「腕Bなどの専用パーツを持つモーションを表示」しようとすると
「基本ポーズのパーツが一瞬表示されて、腕Bがフェードインしてくる」という状態になってしまいます。
ポーズ関連のフェードを強制的にオフにした状態で、モーションを開始したいのですが、そういうことは可能でしょうか。
live2d.frameworkのL2DPose.csのコードの中身を見たのですが
public void updateParam(ALive2DModel model) 内で
// 設定から時間を変更すると、経過時間がマイナスになることがあるので、経過時間0として対応。
if (deltaTimeSec < 0) deltaTimeSec = 0;
for (int i = 0; i < partsGroupList.Count; i++)
{
normalizePartsOpacityGroup(model, partsGroupList[i], deltaTimeSec);
copyOpacityOtherParts(model, partsGroupList[i]);
}
で、となっているので、このdeltaTimeSecを大きな値にする(フェード時間を強制的に終わらせる)ようなメソッドを追加すれば一応できはするのですが、
正式な手段があれば教えていただけると助かります。
何も表示していない状態から、「腕Bなどの専用パーツを持つモーションを表示」しようとすると
「基本ポーズのパーツが一瞬表示されて、腕Bがフェードインしてくる」という状態になってしまいます。
ポーズ関連のフェードを強制的にオフにした状態で、モーションを開始したいのですが、そういうことは可能でしょうか。
live2d.frameworkのL2DPose.csのコードの中身を見たのですが
public void updateParam(ALive2DModel model) 内で
// 設定から時間を変更すると、経過時間がマイナスになることがあるので、経過時間0として対応。
if (deltaTimeSec < 0) deltaTimeSec = 0;
for (int i = 0; i < partsGroupList.Count; i++)
{
normalizePartsOpacityGroup(model, partsGroupList[i], deltaTimeSec);
copyOpacityOtherParts(model, partsGroupList[i]);
}
で、となっているので、このdeltaTimeSecを大きな値にする(フェード時間を強制的に終わらせる)ようなメソッドを追加すれば一応できはするのですが、
正式な手段があれば教えていただけると助かります。
0

コメント
deltaTimeSecを大きな値にしても、
最初の1フレームは、基本パーツが表示されてしまうようです。
コードを追ってみたところ、
public void normalizePartsOpacityGroup の
visiblePartsは、2フレーム以降は1になっているのですが、最初の1フレームだけ0になってしまう状態です。
やりたいことは「指定したモーションで表示を開始する」ということです。
Live2Dは補間をあちこちでしているため、全体を把握できていないのですが、
普通にやろうとすると、基本モーションや基本ポーズとの間で、補間やフェードが入ってしまっているため、それを無効化しようとしています。
そういったことは設計的に無理があるのでしょうか。
以下のsetPartsOpacityとsetParamFloat部分を修正すると、一瞬表示される事がなくなるかと思います。
L2DPose.csの89行目あたり
public void initParam(ALive2DModel model) { if (model == null) return; for (int i = 0; i < partsGroupList.Count; i++) { L2DPartsParam[] partsGroup = partsGroupList[i]; for (int j = 0; j < partsGroup.Length; j++) { partsGroup[j].initIndex(model); int partsIndex = partsGroup[j].partsIndex; int paramIndex = partsGroup[j].paramIndex; if (partsIndex < 0) continue;// 存在しないパーツです bool v = (model.getParamFloat(paramIndex) != 0); // model.setPartsOpacity(partsIndex, (v ? 1.0f : 0.0f)); // model.setParamFloat(paramIndex, (v ? 1.0f : 0.0f)); model.setPartsOpacity(partsIndex, 0.5f); model.setParamFloat(paramIndex, 0.0f); } }1)デフォルトの場合2)setPartsOpacity = 0.0f, setParamFloat = 0.0fの場合、逆に一瞬だけ腕が消えます
3)setPartsOpacity = 0.5f, setParamFloat = 0.0fの場合がベストかと
参考にさせていただいて、調整をかけてみます。