ゲーム制作日誌003 外積を使ったカメラ位置によって顔の形を変形させる仕組み作り

アニメっぽいキャラクターを3D上で再現する場合カメラ位置によって顔を変形させるのは避けては通れないので足りない頭で頑張って実装してみました。

まずBlederで各方向から見た顔をシェイプキーで作ります。調子に乗って変形させるとまばたきとの整合性がとれなくなるんでまばたきシェイプキーを確認しながら作業します。髪の毛のモデルも一緒に変形させなければないんでそのような部分はラティス変形を使用します。
出来上がったモデルをUnityのアニメーターのブレンドツリーでまぜれば完成……なんですがそもそもそのまぜる数値をどうやってとればいいのかよくわかりません。


そこで出てきたのが外積。高校で習ったという話ですが何一つ覚えていません。
まあ知らなくてもどういう値が返ってくるのか分かればゲームでは問題ないでしょう。以下図にまとめてみました。

赤矢印がオブジェクト正面で青矢印がそのオブジェクトから見たターゲットの角度です。これを見ると外積は左右、あるいは上下の判定に使えそうです。内積は前後の判定に使えそうです。

スクリプトは打てないんでPlaymakerでやってます。
Unity標準のBoltと比べると易しくおすすめ。
で、四苦八苦して作った計算式です。

あってるかどうかわかりませんしもうちょういスマートにできないものかと思うものの機能はしているんでとりあえずこれで良しとします。
何をしているかというと顔とカメラの外積を計算してアニメーターのパラメーターに入れています。
苦労したのはFixed Updateを使わないとポーズなどアニメーションの変形を計算に入れてくれないこと。色々検索して英語の掲示板で解決方法が書いてあるレスが1件だけヒットしました。このへんもよくわかりませんがFixed Updateでないとアニメーション変形後の値をとってこれないんでしょうね。
ちなみに前後の判定はしてないのでカメラがオブジェクトの後ろに回っても変形します。でもまあそれは映らないし問題なさそうなんで今回は無しとしました。必要であれば内積の値を使って乗算したら良いかと思います。