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

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

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

同一モデル内で自動まばたきと寝るモーションを両立させたい

Unity 2017.3.0f3
Cubism 3.1 SDK for Unity
を使用しております。

以下の手順に従って、自動まばたきを設定しました。

自動まばたきの設定
http://docs.live2d.com/cubism-sdk-tutorials/eyeblink/

喜怒哀楽などのモーションの他に、寝た状態で待機するモーションを設定しています。
通常のモーションの場合は、Overrideでまばたきさせて良いのですが、
寝た場合にもまばたきしてしまいます。これを回避したいです。

まずは
EyeBlinkController = gameObject.GetComponent<CubismEyeBlinkController>();
としておき、寝るモーションに入る前に
EyeBlinkController.enabled = false;
寝るモーションから出たあとに
EyeBlinkController.enabled = true;
としてみました。

この場合、寝るモーション中にまばたきはしなくなるのですが、
目が開いたままで期待通りとなりません。
寝ている間は目が閉じてほしいです。

そこで、以下のようにしましたが、変わらず開いたままです。
EyeBlinkController.enabled = false;
EyeBlinkController.EyeOpening = 0.0f;

EyeBlinkController.enabled = true;
EyeBlinkController.EyeOpening = 1.0f;

次にInspectorからAddComponentせずに
寝るモーション以外の際にCubismEyeBlinkControllerを追加し
if (EyeBlinkController == null)
{
EyeBlinkController = gameObject.AddComponent<CubismEyeBlinkController>();
EyeBlinkController.BlendMode = CubismParameterBlendMode.Override;
}
寝るモーションではCubismEyeBlinkControllerを削除しました。
if (EyeBlinkController != null)
{
Destroy(EyeBlinkController);
EyeBlinkController = null;
}

これは寝ている場合は期待通りに動作するのですが、
寝るモーション以外でまばたきをしなくなってしまいました。
おそらくこちらで相談させていただいたものと同じ現象です。
http://forum.live2d.com/discussion/910/

何か良い方法はありませんでしょうか?
自動まばたきを諦め、各モーション内で
目を制御するしかありませんでしょうか?

よろしくお願いします。
以上

コメント

  • @ganessa さん

    CubismEyeBlinkControllerではなく、CubismAutoEyeBlinkInputのenabledを変更してみてください。

    CubismEyeBlinkControllerは、瞬き用に設定されたパラメータの値を操作するだけのコンポーネントで、motin3.jsonに設定された瞬き用の値を設定するのにも使われます。
    Controller自体ではなく、Controllerの値を操作しているコンポーネントの方を切れば、motion3.jsonの値は活かしたまま自動瞬きだけを切ることが出来ます。
  • 早速のご返信、ありがとうございます。
    制御側ではなく入力側を止めるのですね。

    あらかじめコンポーネントを取得し、
    AutoEyeBlinkInput = gameObject.GetComponent<CubismAutoEyeBlinkInput>();

    まばたき中は入力を無効に、
    AutoEyeBlinkInput.enabled = false;

    まばたき中以外は入力を有効にしました。
    AutoEyeBlinkInput.enabled = true;

    残念ながらこのままでは、目は開いたままでした。
    同様に、まばたき中はEyeOpeningを0.0に、まばたき中以外はEyeOpeningを1.0にしました。

    EyeBlinkController = gameObject.GetComponent<CubismEyeBlinkController>();
    EyeBlinkController.EyeOpening = 0.0f;
    EyeBlinkController.EyeOpening = 1.0f;

    これで、目をとじるようになりました。
    まとめますと、以下のような感じです。

    private CubismAutoEyeBlinkInput AutoEyeBlinkInput;
    private CubismEyeBlinkController EyeBlinkController;

    void Start() {
    AutoEyeBlinkInput = gameObject.GetComponent<CubismAutoEyeBlinkInput>();
    EyeBlinkController = gameObject.GetComponent<CubismEyeBlinkController>();
    }

    private void SetSleep (bool isSleep)
    {
    AutoEyeBlinkInput.enabled = !isSleep;
    EyeBlinkController.EyeOpening = isSleep ? 0.0f : 1.0f;
    }

    CubismAutoEyeBlinkInputのenabledをfalseにすると、
    Overrideする前の寝るモーションに戻ると良いのですが、
    EyeOpeningの設定が効いてしまっているようです。
    これは仕方がないのでしょうか?
  • 編集済: 1月 2018
    > CubismAutoEyeBlinkInputのenabledをfalseにすると、
    > Overrideする前の寝るモーションに戻ると良いのですが、
    > EyeOpeningの設定が効いてしまっているようです。
    > これは仕方がないのでしょうか?
    寝るというモーションの場合、
    EyeBlinkController.EyeOpening = 0.0f;
    とすることで対応できます。

    ところが、ウインクというモーションの場合、
    EyeBlinkController.EyeOpeningを
    スクリプトで動的に変化させる必要があります。

    EyeBlinkController.EyeOpeningの設定が効かずに、
    CubismAutoEyeBlinkInputやCubismEyeBlinkControllerを
    アタッチする前の状態になると良いのになぁ・・・
    という意味です。

    Blend ModeにOverrideではなく、Noneのようなものを
    設定すれば無効になるといった方法でもOKです。
    お手軽にまばたきやリップシンクのOn/Offを
    切り替えられるようになると良いです。

    もしかすると、EyeOpeningが効いてしまうのも
    弊社でしか発生しないのでしょうか?
  • EyeOpeningが効いてしまう件は、以下の問題が
    解消した環境でも引き続き発生しております。
    http://forum.live2d.com/discussion/910/目や口が開きっぱなしになる

    原因は別のようでした。
    念のため、報告させていただきます。
  • 最後のご回答から一週間ほど経過しましたので、
    改めてご回答を確認させていただきました。

    > Controller自体ではなく、Controllerの値を操作しているコンポーネントの方を切れば、
    > motion3.jsonの値は活かしたまま自動瞬きだけを切ることが出来ます。
    「motion3.jsonの値は活かしたまま」とご回答いただいていますので、
    EyeOpeningの値が効かずにmotion3.jsonの値が採用されるはず・・・
    ということですね。

    「Controllerの値を操作しているコンポーネントの方を切れば」
    とご回答頂きましたが、現状ではEyeOpeningの値が
    効いてしまっているようですので、他にもControllerの値を
    Overrideしているものがあるのでしょうか?

    EyeOpeningの値をInspector上で0や1に設定すると、
    特に何かに再設定された感じは無さそうです。

    スクリプト側からCubismAutoEyeBlinkInputのenabledをfalseにすると、
    EyeOpeningの値が効かずにmotion3.jsonの値が採用されて欲しいということです。

    この現象はみなさんも発生していますか?
    それとも弊社だけなのでしょうか?
    ご回答いただければ幸いです。

    よろしくお願いします。
    以上
  • @ganessa さん

    モーション側に目の開閉状態が設定されているのであれば、EyeBlinkControllerのBlend ModeをMultiplyに設定してください。
    この設定にすることにより、モーションで設定された値にまばたき用の値(0~1の範囲)が乗算されます。
    つまり、仮にモーションによって目の開閉に0.5が設定されていた場合、表情によって設定された目の開閉の値を維持してまばたきを行わせることができます。
    この設定をすることで、モーションから目の開閉を0にした場合も、EyeBlinkでどのような値が乗算されても目を閉じたままにすることが出来ます。


    ただし、この場合、まばたき用のパラメータに目の開閉を設定しないよう注意してください。
     参照:http://docs.live2d.com/cubism-editor-manual/eye-blink-settings/

    上記のリンク先の方法で、表情としての目の開閉を設定してしまうと、EyeBlinkの操作と競合してしまうため、正常に動作しないことがあります。
  • 上手く話が伝わっていないかもしれません。
    なかなかうまく伝わらずもどかしいです。

    ご連絡いただいた方法では、モーションによって目の開閉に0.5が設定されていた場合、
    まばたき用の値(0~1の範囲)が乗算され、0〜0.5の範囲で開閉してしまうと思われます。
    そうではなく、モーションが0.5であれば、0.5とする方法です。

    私が一貫してお尋ねしているのは、
    一部のモーションにまばたきを乗算をするのではなく、
    まばたきを無効にする方法が知りたいのです。

    motion3.jsonの値と全く同じにする方法です。
    CubismAutoEyeBlinkInputやCubismEyeBlinkControllerを
    AddComponentする前と同じ状態にしたいということです。

    例えば、以下のモーションがある場合に
    ・喜ぶ(自動まばたき有)
    ・怒る(自動まばたき有)
    ・哀しむ(自動まばたき有)
    ・楽しむ(自動まばたき有)
    ・ウインク(自動まばたき無)
    ・寝る(自動まばたき無)
    今回頂いた方法を採用する場合、
    喜怒哀楽と寝るときは期待通り制御できますが、
    ウインクのモーションでは期待動作と異なります。

    モーションに含まれたウインク(片目を閉じる)と
    自動まばたき(両目を閉じる)の両方が行われてしまうということです。
    モーションで閉じた方の目は、閉じっぱなしで問題ありませんが、
    モーションで開閉する方の目は、開閉するモーションと自動まばたきとが乗算され、
    期待とは異なるタイミングで開閉してしまいます。

    これまでに記載したとおり、
    スクリプトから動的に追加削除しても期待通り動作せず、
    スクリプトから動的に有効無効を切り替えても期待通り動作しません。

    まばたきの処理を止めるだけなので、
    無効や削除で簡単に対応できると思っていたのですが・・・

    目の開閉を含むモーションを使用すると
    皆さんこの現象に遭遇すると思いますが、
    弊社だけの問題なのでしょうか?

    それともy_a_s_(Dev Staff) 様の環境でも
    この現象は発生し、回避しようがないということなのでしょうか?

    http://docs.live2d.com/cubism-editor-manual/eye-blink-settings/
    自動まばたき有のモーションではこの方法でまばたきを設定し、
    自動まばたき無のモーションではこの方法でまばたきを設定していません。
    間違っていますでしょうか?
  • @ganessa さん

    ウィンクのモーションですが、片目を閉じる動きはどのように設定していますか?
    もしよろしければモーションのデータを検証用に頂けませんでしょうか?

    よろしくお願いいたします。
  • 編集済: 2月 2018
    そのご質問があるということは、y_a_s_(Dev Staff) 様の環境では
    発生しないということでしょうか?
    このご回答がないため会話が進みません・・・

    残念ながらデータはお渡しすることが出来ません。
    桃瀬ひよりでご確認頂けませんでしょうか?
    一般的なモデルの一般的なモーションについてご教示いただければと思います。

    スクリプトから何かの操作をすれば、自動まばたきが有効になり
    スクリプトから何かの操作をすれば、自動まばたきが無効になり
    motion3.jsonのモーションになれば良いということです。
  • @ganessa さん

    はい、こちらでは現象が確認できません。

    > 桃瀬ひよりでご確認頂けませんでしょうか?
    サンプルモデルとして提供しているひよりのモデルやモーションでも現象は再現するということでしょうか?
  • > はい、こちらでは現象が確認できません。
    このご回答はどの質問に対する回答でしょうか?

    > もしかすると、EyeOpeningが効いてしまうのも
    > 弊社でしか発生しないのでしょうか?
    こちらの質問に対するものでしょうか?

    > ご連絡いただいた方法では、モーションによって目の開閉に0.5が設定されていた場合、
    > まばたき用の値(0~1の範囲)が乗算され、0〜0.5の範囲で開閉してしまうと思われます。
    > そうではなく、モーションが0.5であれば、0.5とする方法です。
    それともこちらの現象についてでしょうか?

    お話が伝わっていないことが良く解りました。
    乗算の件は、発生しないということは無いはずです。
    乗算とはそういうものだからです。

    hiyori_freeのhiyori_m01の場合、モーションの左右の目の開閉は
    0:00〜3:14 1
    3:14〜3:18 1→0
    3:18〜3:20 0
    3:20〜3:26 0→1
    のように変化しています。
    これをmotion3.jsonの値とおっしゃっていると思います。

    乗算してしまった場合、自動まばたきで指定されたタイミングと
    モーションの3:14〜3:26で行われるタイミングの両方で
    まばたきが行われてしまいます。これではまずいのです。

    先の例でウインクを出してしまったので伝わらなかったのかもしれません。
    今度は白目モーション(目が半分開いている)を例にしてみたいと思います。

    モーションの左右の目の開閉には常に0.5が設定されています。
    この状態で自動まばたきを乗算してしまうと、0.0〜0.5で開閉してしまいます。
    自動まばたきを乗算ではなく無効にして、常に0.5が設定されるようにしたいということです。

    無効にする方法をお尋ねしたのに、なぜ乗算の方法を
    ご回答になったのか全く理解できておりません。

    質問を投稿してから3週間が経ちますが、
    まだ質問内容すら伝わっていないようでがっかりです。
    もう疲れました。自動まばたきは使用しません。
コメントするにはサインインまたは登録して下さい。