★お知らせ(2023/12/27)
いつもLive2D公式コミュニティをご利用いただき誠にありがとうございます。
本コミュニティは2023年12月27日 11:00をもって閉鎖いたしました。
今後の運営はすべて新Live2D公式クリエイターズフォーラムに移行します。
閉鎖に伴い、以下機能は利用不可となります。
・アカウントの新規作成
・トピック投稿、返信
たくさんのご利用誠にありがとうございました。

新Live2D公式クリエイターズフォーラムは以下バナーよりご利用いただけます。
Live2D公式クリエイターズフォーラム

なお、本コミュニティに投稿されたトピックはすべて残りますが、今後削除する可能性がございますので予めご了承ください。
閉鎖に関するお問い合わせにつきましてはLive2D公式クリエイターズフォーラムへご連絡ください。

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を大きな値にする(フェード時間を強制的に終わらせる)ようなメソッドを追加すれば一応できはするのですが、
正式な手段があれば教えていただけると助かります。


コメント

  • 追記になります。
    deltaTimeSecを大きな値にしても、
    最初の1フレームは、基本パーツが表示されてしまうようです。

    コードを追ってみたところ、
    public void normalizePartsOpacityGroup の
    visiblePartsは、2フレーム以降は1になっているのですが、最初の1フレームだけ0になってしまう状態です。


    やりたいことは「指定したモーションで表示を開始する」ということです。

    Live2Dは補間をあちこちでしているため、全体を把握できていないのですが、
    普通にやろうとすると、基本モーションや基本ポーズとの間で、補間やフェードが入ってしまっているため、それを無効化しようとしています。
    そういったことは設計的に無理があるのでしょうか。

  • @rodostw さん

    以下の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の場合がベストかと

  • ありがとうございます!
    参考にさせていただいて、調整をかけてみます。
コメントするにはサインインまたは登録して下さい。