[Unity]OculusRiftでモデルの首をスクリプトで動かせないときの対処

OculusRift でプレイヤーモデルの首を動かしたいのにうまく動かない、というときのための対処法です。

基本的にプレイヤーモデルの顔はカメラに映りませんが、カメラを目の位置=顔の中心からずれた位置に設置している場合、OculusRift の回転に合わせて顔も回転させておかないと、上を向いたときに髪の毛が映ったり頭の中が見えたりしてしまいます。


(モデルは Mukilus でお借りした Tda 式ミク さんと hzeo 式 KAITO さん)

カメラが顔の中心ではないため NearClip では対処しづらく、特に借り物のモデルでは顔だけを非表示にするのは難しいと思います。

そこで顔は表示させたまま首を動かし、カメラとモデルの目の位置が合っている状態を維持しようと考えるのですが、普通にやると初めは以下のような問題にぶつかるのではないかと思います。
  • OculusRift のカメラの Rotation をモデルの首に代入するスクリプトを作成し、単体では正しく動く
  • モデルにメカニムアニメーションを適用すると、アニメーションによって首が制御されスクリプトがうまく動かない
これについては、まずは以下のサイトなどを参考に、アニメーション側で首ボーンを動かさないように設定できるか試してみるのがよいと思います。

MMD for Unity を使って Oculus 用アプリを作ってみた - 凹みTips

メカ徒然日記 OculusRift+Unity失敗 解決事例 主にカメラ


しかし、自分のケースでは上記がうまく行かなかった(アニメーション側のマスク設定で、首のチェックを外せなかった)ため、以下のようなちょっと強引な方法で解決しました。


画像のように、アバターの Head にモデルの Neck を関連付けることでモデルの Head をメカニム制御対象外として、スクリプトではモデルの Head を回転させるという方法です。

トライ&エラーの上でのいわゆる dirty hack のため、詳細はあまり書いても仕方がないですが、

  • アバターの Head は必須
  • アバターの Head を正しく設定したまま Neck だけ外し、スクリプトで Neck を制御するのはうまく行かない
といったことを挙げておきます。


余談として、メカニムで特定の部位だけを動かすのはアバターボディマスクを使うのが正当なやり方ですが、Base Layer にはマスクを設定できません。

今回は試していませんが、Base Layer にはアニメーションを全く設定せずに、頭部を除外したボディマスクを指定したレイヤにのみアニメーションを設定すれば、こちらでもうまく行くかもしれません。(2013/3/23 追記 : これはうまく行かなさそうです)

スクリプトで直接 rotation を操作するのではなく、各向きの顔アニメーションを用意して 2D ブレンディング を使うのが真っ当なやり方のような気はしますが、これはけっこう面倒なので…。


2014/3/23 : ボディマスクの方法も試したので追記

コメント