はじめに
今回はリップシンクの干渉回避の方法を解説します。
前提条件
Avatar3.0中~上級者向けの記事です。
リップシンクの設定とボタンやハンドサインで表情を変えれることを前提に進めます。
基本的な使い方についてはこちらをご覧ください。

干渉の挙動
通常状態でしゃべると口が動きます。

次に、口が開いた表情にします。

すると、口の開き方が加算されます。
必要以上に口が開きます。
これが干渉です。

喋ってる途中に表情を変えます。
干渉は起こります。
が、しゃべる終わりでリップシンクの影響は無くなります。

干渉の対処法
対処法は下記の2つになります。
・口が開いた表情でリップシンクを行わない設定
・リップシンクの際にリップシンク以外の動きを無効化する設定
前者の方はVRChat公式が非推奨にしたWrite Defaults不要です。
ですが、開いた口はリップシンクで動かなくなります。
後者はWrite Defaultsが必要です。
ですが、開いた口でもリップシンクで口が動きます。
この2つについて見て行きます。
Write Defaultsを使わない対策
口が開いた表情でリップシンクを行わない設定です。
完全な対策はできません。
が、簡単に設定できます。
Hierarchyでアバターを選択。

表情を設定したコントローラー(Fx)を選択。

表情を入れたLayersを開きます。
任意のアニメーションを入れた箱を選択。

Inspectorを確認。
Motionの所のアニメーションを1回クリック。

Projectで強調表示されたアニメーションを選択。

Inspectorを確認。
下の名前の横にあるバーを押します。

Hierarchyよりアバターのデーターをドラッグ&ドロップ。
口の形を確認します。

Hierarchyでアバターを選択。

表情を設定したコントローラー(Fx)をダブルクリック。

Animatorで元のアニメーションを入れた箱を選択。

InspectorでAdd Behaviourをクリック。
VRCAnimatorTrackingControlを選択。

先ほど確認した表情は口を閉じてました。
なのでMouth & JawのTrackingにチェックを入れます。
これで、この表情の時は口が動くようになりました。

この設定を設定した表情全てに行います。

口が閉じてる場合 → Mouth & JawのTrackingにチェック。

口が開いてる場合 → Mouth & JawのAnimationにチェック。
これで口が開いた状態の場合はリップシンクが無効になります。

以上がWrite Defaultsを使わない干渉対策です。
次項のための準備
次はWrite Defaultsを使った対策を紹介します。
追加したVRC Animator Tracking Controlの三つの点を選択。
Removeを押して全てのVRC Animator Tracking Controlを削除してください。

これで『Write Defaultsを使った対策』の事前準備が完了です。
Write Defaultsを使った対策
リップシンクの際にリップシンク以外の動きを無効化する設定です。
Write DefaultsというVRChatで非推奨とされている機能を使います。
これを使う事で綺麗に干渉対策ができます。

仕組みは下記の通りです。
作りながら理解する方が早いと思います。
読み飛ばしてください。
1,リップシンクの口の動きを取得。(Int型Viseme0~14、Viseme=0が口が動いてない状態)
2,リップシンク以外の口の動きを無効化したアニメーションを(閉じた状態の口)を作成
3,リップシンクで口が動いた際にだけそのアニメーションを再生し干渉させる
(if Viseme = 1~14 → リップシンク以外の口の動きを無効)
4,干渉の結果、リップシンクで口が動いた際にそれ以外の口の動きが無効化
5,リップシンクで口が動いてない時は元の表情を表示させる。
(if Viseme = 0 → リップシンク無し+元の口の状態を再生)
6,これで『口の開き』or『リップシンク』のどちらかしか表示されなくなる。
7,干渉対策が完成
Animatorの準備
Hierarchyでアバターを選択。

Fxのコントローラーをダブルクリック。

Animatorを開きます。

Layers上で+ボタンを押して新規Layersを作成。

LipSync_Ctrlなどの名前に変更。

このLayerは表情制御系Layersより下の位置に置いてください。
※特に理由が無ければ動かさなくて大丈夫です。

歯車マークを押します。
Weightを1に変更。

Parameterを押します。

右上の+ボタンを選択。
Intを押します。

名前を『Viseme』に変更。この名前は絶対です。
リップシンクはVisemeという名前のInt 0~14の入力で処理されている為。
(詳細はこちら)

これでAnimatorの準備が完了です。
干渉対策アニメーション作成
Projectを右クリック。
Create → Animatioを選択。

LipSync_Visemeなどの名前のアニメーションを作成。

再生ボタンを押してPlayモード。

Hierarchyの3Dモデルにアニメーションをドラッグ&ドロップ。
Hierarchyで3Dモデルのデータをクリックして選択状態にします。

Animationを開きます。
赤い丸ボタンを押します。

Hierarchyでモデルデータを開きます。
顔のメッシュを選択。

Inspectorを確認。
BlendShapesを開きます。

リップシンク”以外”の口の動きに関係があるシェイプキー選択。
一度0以上の数値に動かして0に戻します。
赤くなり数字が0と表示された状態にします。

一番上のキーフレームを選択。
全選択状態でCtrl+C。

1フレーム動かしてCtrl+V。

再生ボタンを押してPlayモードを解除。

製法上の関係でできたコントローラーを選択。
Deleteキーで削除。

Projectでアニメーションを選択。

Loop Timeにチェックを入れます。

これでリップシンク以外の口の動きを無効化したアニメーションが完成です。
条件分岐の作成
Hierarchyでアバターを選択。

Fxのコントローラーをダブルクリック。

Animatorを開きます。
LipSync_CtrlのLayerの中に作成したアニメーションをドラッグ&ドロップ。

グリッド上を右クリック。
Create State → Emptyを選択。

Make Transitionを使い双方向から白い線で繋ぎます。

アニメーションを読み込んだ箱を選択。
Write Defaultsにチェックを入れます。
※本来はあまりよろしくない設定です。

作成したNew Stateを選択。
Write Defaultsにチェックを入れます。

New Stateに向かう線を選択。
Has Exit Timeのチェックを解除。
Conditions右下の+ボタンを押します。

『Viseme / Equals / 0』を設定。

Settingsを開きます。
Transition Durations (s)を0に設定。

リップシンク以外の口の動きを無効にするアニメーションに向かう線を選択。
Has Exit Timeのチェックを解除。
Conditions右下の+ボタンを押します。

『Viseme / NotEquals / 0』を設定。

Settingsを開きます。
Transition Durations (s)を0に設定。

これでアニメーション再生の条件分岐ができました。
VRChatにアップロード。
動作確認。

以上でリップシンクの干渉対策が完成です。
まとめ
今回はリップシンクの干渉対策について紹介しました。
まばたきの干渉対策はこちらで解説。

ぜひこちらもご覧ください。
コメント