モトブログ用のバーチャルスタジオを作成しています。
今回は1から再構築しており、同時にキャラクターの表現力を少しアップさせようとしています。
今までの仮想スタジオでもキャラクターの指の動きは自分の手の動きに連動していましたが、実装方法としてはキャラクターの手を削除し、VRフレームワークに付属しているハンドにキャラクターの手のマテリアルを適用、モデルの手の位置に無理やり動かしてくっつけていました。
なので手を伸ばしたりすると手首と手が離れてしまったりして、あまり自由に手を動かすことができませんでした。
今回はVRハンドの各指の関節の角度を取得し、キャラクターの各指関節にマッピングさせることで指の動きを実現します。
実装方法
実装方法は力業となっており
・VRハンドの親指第一関節の角度を取得
・キャラクターハンドのボーンと座標があるように一定角度回転させる
・キャラクターハンドの親指第一関節に回転を適用
以下第二関節、第三関節、ほかの指に続く・・・
という実装です。
失敗例:グローバル座標系を使う
最初の実装方法では「transform.rotation」を利用して座標系を変換し、適用しました。結果、一定方向の時のみ指の曲げ伸ばしが正常に動作しますが、手を傾けたりすると指も曲がりがおかしくなりました。
// 実装例
// 親指
targetRotation = rtThumb1.transform.rotation;
yuukoThumb1R.transform.rotation =
targetRotation * Quaternion.Euler(calibrationThumbR_1);
targetRotation = rtThumb2.transform.rotation;
yuukoThumb2R.transform.rotation =
targetRotation * Quaternion.Euler(calibrationThumbR_2);
targetRotation = rtThumb3.transform.rotation;
yuukoThumb3R.transform.rotation =
targetRotation * Quaternion.Euler(calibrationThumbR_3);
改良版:ローカル座標系を使う
グローバル座標系がダメなら、ローカル座標系で処理すればいいじゃない。という安易な考えでローカル座標系を適用してみました。
tmp = rtThumb1.transform.localEulerAngles;
yuukoThumb1R.transform.localEulerAngles =
new Vector3(tmp.y * calibrationThumbR_1.x,
tmp.x * calibrationThumbR_1.y,
tmp.z * calibrationThumbR_1.z);
結果はこんな感じで、親指の曲がり方に違和感はあれど、それ以外の指についてはきちんとVRハンドの指の曲がり方に追従してくれました。
こだわってしまうといつまでも完成しないため、いったん調整はここまでにして次の機能を作っていきたいと思います。
ということで、いったん手の動きは完成。とはいえ、VRスタジオとして利用するには、まだまだ足りない機能があるので、もうちょっと作りこみは必要です
Meta Quest 2の困ったこと
最近Unity開発をしていると、Meta QuestのPC Linkが切れまくります。
Meta Quest事態にファームウェアアップデートが来ているわけでもなく、PCにインストールしたOculusソフトも最新にしています。
ちょっとめんどくさいですが、後ほど以下を試してみたいと思います
私は一般的なデバイスの問題を抱えています:オクルスクエスト (reddit.com)