前提・実現したいこと
以下のようなSlerpメソッドの回転処理を、コルーチンにしたいと思っているのですが、
コードの性質上、ずっとSlerpメソッドが呼び出され続けてしまうので、
ある程度、第1引数のQuaternionが第2引数のQuaternionに近づいたら、
近似判定をして完了処理をし、コルーチンが終了するようにしたいと思っているのですが、
その判定方法が分からない状態です。
ご教示お願いします。
C#
1 [SerializeField] 2 GameObject target; 3 4 float rotateSpeed = 2f; 5 6 void Update () { 7 Vector3 targetDir = target.transform.position - this.transform.position; 8 this.transform.rotation = Quaternion.Slerp ( 9 this.transform.rotation, 10 Quaternion.LookRotation(targetDir), 11 Time.deltaTime * rotateSpeed 12 ); 13 }
試したこと
近似判定して完了処理する以外の部分の実装はできました。
以下のコードのコメントのif文の近似判定方法がわからない状態です。
C#
1 [SerializeField] 2 GameObject target; 3 4 void Start (){ 5 StartCoroutine(EaseOutLookAt(this.transform, target.transform, 2f)); 6 } 7 8 IEnumerator EaseOutLookAt(Transform myTrans, Transform target, float rotateSpeed){ 9 while(true){ 10 Vector3 targetDir = target.position - myTrans.position; 11 myTrans.rotation = Quaternion.Slerp( 12 myTrans.rotation, 13 Quaternion.LookRotation(targetDir), 14 Time.deltaTime * rotateSpeed 15 ); 16 // if(true){ 17 // myTrans.rotation = Quaternion.LookRotation(targetDir); 18 // break; 19 // } 20 yield return null; 21 } 22 Debug.Log("finish"); 23 }
2つのQuaternionの近似判定をすればよいかと思うのですが、どういったコードで実装できますか?
ちなみに、距離の近似判定の場合は以下のように実装すればよいことはわかっています。
C#
1 float distance = (endPoint.position - move.transform.position).sqrMagnitude; 2 if(distance < 0.0001){ 3 move.position = endPoint.position; 4 break; 5 }
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2021/08/15 06:56
2021/08/15 09:57
退会済みユーザー
2021/08/15 11:16