OVRLipSync 無音状態でBlendShapeに100入ってしまう問題の解決方法

CG

OVRLipSyncを導入したら無音の時に一番上のBlendShapeに100が入ってしまい、デフォルトの顔になってくれないという問題が発生しました。

VRMであれば、デフォルトが怒りの表情になってしまうみたいです。

検索しても解決方法を得られず。。

手探りで探すことになり大変だったのでここにシェアします。

【解決方法】OVRLipSyncContextMorphTargetを書き換える

結論から言うと、

OVRLipSyncContextMorphTargetスクリプト内のSetVisemeToMorphTargetに存在するforループの初期値を変えます。

i = 0;i = 1;に書き換えるのみです。

OVRLipSync無音時に数値入っちゃうバグの解説

どうやら、OVRLipSyncのバージョンによって起こるものと起こらないものがあるようです。

古いバージョンではBlendShapeをインデックス番号で指定していました。

VisemeToBlendTarget の「sil」が消えたため

古いバージョンでは「sil」という要素があって、

無音時に設定されているBlendShapeです。(多分「silent」の略)

この古いバージョンではデフォルトで「sil」に「0」が設定されていて、

「0」というのはBlendShape一番上のターゲットを指します。

新しいバージョンでは「sil」の要素がなくなっているのが分かるでしょうか?

番号ではなく名前で選択できるようになっているのが新しいバージョンの特徴です。

先ほど新しいOVRLipSyncのバージョンをインポートして試してみようと思ったのですが、無音バグが再現できませんでした。最新バージョンでは修正されているのかもしれません。

おそらく、名前で選ぶインターフェースに移り変わったばかりのOVRLipSyncバージョンを使っていると、抜け落ちた「sil」の設定が内部で生きていてBlendShape「0」に100が入力されてしまうのです。

「sil」を無視するスクリプトに書き換える

OVRLipSyncスクリプト内のViseme配列に「sil」要素があります。

この「sil」を無視するように書き換えましょう。

BlendShapeに数値を入れるskinnedMeshRenderer.SetBlendShapeWeight()文があるので、このSetVisemeToMorphTarget()内でなんとかできそうです。

for文の初期値i=0をi=1に書き換えることによって配列一つ目の「sil」をスキップするようにしました。

「sil」をスキップしたので無音時に100を入力しなくなるはずです。

なおった

よかったね。

CG
スポンサーリンク
意識の低いCGアニメーターをフォローする
この記事を書いた人
意識の低いCGアニメーター

専門学校から大手CG映像制作会社に就職。

憧れのアニメに参加するも、炎上案件で残業まみれになり、
新卒後2年で転職。
現在はバーチャルYouTuber事業、VR事業に携わって働いている。

意識の低いCGアニメーターをフォローする
意識の低いCGアニメーター

コメント

タイトルとURLをコピーしました