現在、顔の動きをWEBカメラで認識し、その動きをUnityのゲームオブジェクト上に反映させるシステムの構築を行っています。
その際に、顔の位置の移動に合わせたゲームオブジェクトの移動は成功しています。
ただし、顔の座標の回転(右を向く等)に合わせた、ゲームオブジェクトの回転において、下記のエラーが発生しています。
・顔座標を回転させたのちにゲームオブジェクトがその方向に回り続ける。試した対処方法は下記になります。
以前2Dのゲームオブジェクトを作成した際に、慣性により回転し続けるという問題が生じたため、それと同様の問題であると考えてました。
2Dの際はRigidBody2Dをアタッチして、FreezeRotationのZ軸にチェックを入れる方法で慣性を削除できた記憶があるので、
同様の手法としてRigidBodyをアタッチし、各FreezeRotationにチェックを入れてみましたが、やはり回転し続けました。
また、下記コードのように、顔の座標の回転量によるゲームオブジェクトの回転量には制限を設けているため、やはり慣性が原因ではないかと考えています。
下記コードにおいて、CurrentFaceRotationが顔座標の回転を考慮した数値、BaseFaceRotationが基準となるゲームオブジェクトのもともとの数値です。
まず顔座標が変化していること(0.1f以上かどうか)を確認し、変化量が一定以下(35)である場合にゲームオブジェクトを回転させるプログラムです。
C++
1 void Update() 2 { 3 if (Mathf.Abs(Mathf.DeltaAngle(CurrentFaceRotation.x, BaseFaceRotation.x)) > 0.1f) 4 { 5 int bairitsu = 1; 6 if ((Mathf.DeltaAngle(Mathf.Abs(CurrentFaceRotation.x), Mathf.Abs(BaseFaceRotation.x)) < 35) && (Mathf.DeltaAngle(Mathf.Abs(CurrentFaceRotation.x), Mathf.Abs(BaseFaceRotation.x)) > -35)) 7 { 8 CurrentFaceTransform.Rotate(new Vector3(CurrentFaceRotation.x * bairitsu, 0, 0)); 9 } 10 } 11 if (Mathf.Abs(Mathf.DeltaAngle(CurrentFaceRotation.y, BaseFaceRotation.y)) > 0.1f) 12 { 13 int bairitsu = 1; 14 if ((Mathf.DeltaAngle(Mathf.Abs(CurrentFaceRotation.y), Mathf.Abs(BaseFaceRotation.y)) < 35) && (Mathf.DeltaAngle(Mathf.Abs(CurrentFaceRotation.y), Mathf.Abs(BaseFaceRotation.y)) > -35)) 15 { 16 CurrentFaceTransform.Rotate(new Vector3(0, CurrentFaceRotation.y * bairitsu, 0)); 17 } 18 } 19 if (Mathf.Abs(Mathf.DeltaAngle(CurrentFaceRotation.z, BaseFaceRotation.z)) > 0.1f) 20 { 21 int bairitsu = 1; 22 if ((Mathf.DeltaAngle(Mathf.Abs(CurrentFaceRotation.z), Mathf.Abs(BaseFaceRotation.z)) < 35) && (Mathf.DeltaAngle(Mathf.Abs(CurrentFaceRotation.z), Mathf.Abs(BaseFaceRotation.z)) > -35)) 23 { 24 CurrentFaceTransform.Rotate(new Vector3(0, 0, CurrentFaceRotation.z * bairitsu)); 25 } 26 } 27 }
慣性の制御方法(できれば挙動が重くなりすぎないものがいいです)と、そもそも慣性が原因ではなく他に調べるべきことがあるなどあれば
ご指導ご鞭撻のほどよろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー