オブジェクトA(this)をオブジェクトB(target)と同じ角度になるように回転させる方法を模索しています。
具体的な条件は以下の通りです。
・指定したオブジェクトBと同じ角度になるようにオブジェクトAを回転させる
・オブジェクトAは滑らかに回転する(a.transform.rotation=b.transform.rotation とはしない)
・回転する途中、回転した後において、物理演算の影響(この表現であっているのかわかりませんが)を受ける。
そのため、回転中に壁などに引っかかった場合回転は止まる(もしくは回転の動きが変化する)
何通りかのスクリプトを書いてみましたが、全て回転がおかしくなりました。
調べてみた所、クォータニオンをオイラー角に変換している所が問題なようです。
クォータニオン型で角速度を与える方法、また他にも何か良い方法がございましたら、教えていただけると幸いです。
1例
1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5//回転させるオブジェクト(A)にくっつける 6public class f_quaternion_rotate : MonoBehaviour 7{ 8 public GameObject follow_target; 9 public float sokudo; 10 11 public bool rotate_velo; //trueに設定 12 13 // Start is called before the first frame update 14 void Start() 15 { 16 17 } 18 19 // Update is called once per frame 20 void Update() 21 { 22 Vector3 angle_velo; 23 Quaternion angle; 24 25 Quaternion this_Quat = this.transform.rotation; ///aにあたる 26 Quaternion target_Quat = follow_target.transform.rotation; //bにあたる 27 28 //thisは逆数にする 29 this_Quat = Quaternion.Inverse(this_Quat); 30 31 angle = Get_OuterProduct(this_Quat, target_Quat); 32 33 angle_velo = angle.eulerAngles; 34 { 35 if (angle_velo.x > 180) 36 angle_velo.x -= 360; 37 if (angle_velo.y > 180) 38 angle_velo.y -= 360; 39 if (angle_velo.z > 180) 40 angle_velo.z -= 360; 41 } 42 43 if(rotate_velo==true) 44 { 45 angle_velo = angle_velo / 180 * Mathf.PI; 46 this.GetComponent<Rigidbody>().angularVelocity = angle_velo * 20f * sokudo * Time.deltaTime; 47 } 48 else 49 { 50 this.transform.Rotate(angle_velo); 51 } 52 53 Debug.Log("target: " + follow_target.transform.rotation + "\nthis: " + this.transform.rotation + 54 "\nangle_velo: " + angle_velo); 55 } 56 57 58 Quaternion Get_OuterProduct(Quaternion a, Quaternion b) //クォータニオン型でabの外積を返す 59 { 60 Quaternion c; 61 62 c.x = (a.w * b.x) + (a.x * b.w) + (a.y * b.z) - (a.z * b.y); 63 c.y = (a.w * b.y) + (a.y * b.w) - (a.x * b.z) + (a.z * b.x); 64 c.z = (a.w * b.z) + (a.z * b.w) + (a.x * b.y) - (a.y * b.x); 65 c.w = (a.w * b.w) - (a.x * b.x) - (a.y * b.y) - (a.z * b.z); 66 67 return c; 68 } 69} 70
Transform を回す = 物理挙動ではない、です。Transform を動かすのが物理挙動でないのと同じです。
物理挙動として回すには Rigidbody を使って Torque を操作します。
回答1件
あなたの回答
tips
プレビュー