2016-09-09 11 views
0

私は、回転することを避けるために、同じ量のZ軸に沿って後方に(spriteは円形ではありません)lerpにします。これを行うには、私はランダムにforward angleを計画し、それにはlerpを保存し、同量のlerpを戻します。しかし、これは、逆回転が始まると始まりの角度が同じではないようにいくつかの奇妙なポップを与える。私がそれを呼び出すとき、私はそれを同じ時間補間する。いくつかのコード:四元とクォータニオンlerp前後

IEnumerator LerpQuat(QuatLerpInput rotThis, float time, float leftBoundary, float rightBoundary) 
{ 
    /* 
    * we want to rotate forward, then backward the same amount 
    * to avoid spinning. we store the given value to both of these. 
    */ 

    Transform stuffToRot = rotThis.godRayGO.transform; 

    float lastTime = Time.realtimeSinceStartup; 
    float timer = 0.0f; 
    switch (rotThis.rotState) 
    { 
     case (QuatLerpInput.RotationStates.rotAway): 
      rotThis.deltaRot = Random.Range(leftBoundary, rightBoundary); 
      while (timer < time) 
      { 
       stuffToRot.rotation = Quaternion.Euler(stuffToRot.rotation.x, stuffToRot.rotation.y, 
        Mathf.LerpAngle(rotThis.idleRot, rotThis.idleRot + rotThis.deltaRot, timer/time)); 
       timer += (Time.realtimeSinceStartup - lastTime); 
       lastTime = Time.realtimeSinceStartup; 
       yield return null; 
      } 
      rotThis.rotState = QuatLerpInput.RotationStates.setBack; 
      break; 
     case (QuatLerpInput.RotationStates.setBack): 
      while (timer < time) 
      { 
       stuffToRot.rotation = Quaternion.Euler(stuffToRot.rotation.x, stuffToRot.rotation.y, 
        Mathf.LerpAngle(rotThis.idleRot + rotThis.deltaRot, rotThis.idleRot, timer/time)); 
       timer += (Time.realtimeSinceStartup - lastTime); 
       lastTime = Time.realtimeSinceStartup; 
       yield return null; 
      } 
      rotThis.rotState = QuatLerpInput.RotationStates.rotAway; 
      break; 
    } 

} 
public class QuatLerpInput 
{ 
    public GameObject godRayGO; 
    public float deltaRot; 
    public float idleRot; 
    public enum RotationStates 
    { 
     rotAway, setBack 
    } 
    public RotationStates rotState = RotationStates.rotAway; 
    public QuatLerpInput(GameObject godRayGO) 
    { 
     this.godRayGO = godRayGO; 
     deltaRot = godRayGO.transform.rotation.z; 
     idleRot = godRayGO.transform.rotation.z; 
    } 
} 

編集switch

switch (rotThis.rotState) 
    { 
     case (QuatLerpInput.RotationStates.rotAway): 
      rotThis.deltaRot = Random.Range(leftBoundary, rightBoundary); 
      Quaternion destination = new Quaternion(rotThis.idleQuat.x, rotThis.idleQuat.y, rotThis.idleQuat.z + rotThis.deltaRot, 1.0f); 
      rotThis.deltaQuat = destination; 
      while (timer < time) 
      { 
       stuffToRot.rotation = Quaternion.Slerp(rotThis.idleQuat, rotThis.deltaQuat, timer/time); 
       //stuffToRot.rotation = Quaternion.Euler(stuffToRot.rotation.x, stuffToRot.rotation.y, 
       // Mathf.LerpAngle(rotThis.idleRot, rotThis.idleRot + rotThis.deltaRot, timer/time)); 
       timer += (Time.realtimeSinceStartup - lastTime); 
       lastTime = Time.realtimeSinceStartup; 

       yield return null; 
      } 
      rotThis.rotState = QuatLerpInput.RotationStates.setBack; 
      break; 
     case (QuatLerpInput.RotationStates.setBack): 
      while (timer < time) 
      { 
       stuffToRot.rotation = Quaternion.Slerp(rotThis.deltaQuat, rotThis.idleQuat, timer/time); 
       //stuffToRot.rotation = Quaternion.Euler(stuffToRot.rotation.x, stuffToRot.rotation.y, 
       // Mathf.LerpAngle(rotThis.idleRot + rotThis.deltaRot, rotThis.idleRot, timer/time)); 
       timer += (Time.realtimeSinceStartup - lastTime); 
       lastTime = Time.realtimeSinceStartup; 

       yield return null; 
      } 
      rotThis.rotState = QuatLerpInput.RotationStates.rotAway; 
      break; 
    } 
+0

誰かがこの問題を遭遇し、助けにならなかった場合は、お気軽に説明を求めてください。私はベストを尽くしましたが、私は自分自身を不明瞭にしているかもしれませんが、私はまだ答えを見つけていません。 – agiro

答えて

0

これを見る人には、解決策が見つかりました。

void LerpQuat(QuatLerpInput rotThis, float time, float leftBoundary, float rightBoundary) 
{ 
    /* 
    * we want to rotate forward, then backward the same amount 
    * to avoid spinning. we store the given value to both of these. 
    */ 

    Transform stuffToRot = rotThis.godRayGO.transform; 

    float lastTime = Time.realtimeSinceStartup; 
    float timer = 0.0f; 

    switch (rotThis.rotState) 
    { 
     case (QuatLerpInput.RotationStates.rotAway): 
      rotThis.deltaRot = Random.Range(leftBoundary, rightBoundary); 
      Quaternion destination = new Quaternion(rotThis.idleQuat.x, rotThis.idleQuat.y, rotThis.deltaRot, 1.0f); 
      rotThis.deltaQuat = destination; 
      rotThis.deltaEulerAngle = Vector3.forward * rotThis.deltaRot;    
      StartCoroutine(RotateMe(rotThis, rotThis.idleQuat, rotThis.deltaEulerAngle, initiateAlphaSwap)); 
      break; 
     case (QuatLerpInput.RotationStates.setBack): 
      StartCoroutine(RotateMe(rotThis, rotThis.deltaQuat,-1.0f * rotThis.deltaEulerAngle, initiateAlphaSwap)); 
      break; 
    } 
} 
IEnumerator RotateMe(QuatLerpInput whatToRotate,Quaternion fromWhere,Vector3 byAngles, float inTime) 
{ 
    Quaternion fromAngle = fromWhere; 
    Quaternion toAngle = Quaternion.Euler(whatToRotate.godRayGO.transform.eulerAngles + byAngles); 
    toAngle = new Quaternion(toAngle.x, toAngle.y, toAngle.z, 1.0f); 

    if(whatToRotate.rotState == QuatLerpInput.RotationStates.setBack) 
    { 
     fromAngle = new Quaternion(whatToRotate.RotEndPos.x, whatToRotate.RotEndPos.y, whatToRotate.RotEndPos.z, 1.0f); 
     toAngle = new Quaternion(0.0f, 0.0f, 0.0f, 1.0f); 
    } 

    for (float t = 0.0f; t < 1.0f; t += Time.deltaTime/inTime) 
    { 
     whatToRotate.godRayGO.transform.rotation = Quaternion.Lerp(fromAngle, toAngle, t); 
     yield return null; 
    } 
    if(whatToRotate.rotState == QuatLerpInput.RotationStates.rotAway) 
    { 
     whatToRotate.rotState = QuatLerpInput.RotationStates.setBack; 
     whatToRotate.RotEndPos = new Vector3(toAngle.x, toAngle.y, toAngle.z); 
    } 
    else 
    { 
     whatToRotate.rotState = QuatLerpInput.RotationStates.rotAway; 
    } 

} 

回避策はloop内に常時Quaternion.Lerpを使用して、ループがを終了した後の状態をを設定しました。こうして私はそれがしたいことをします。

0

代わりに角度をlerpingの、あなたは先の四元数を計算し、ランダムバック四元への補間とするQuaternion.Slerpを使用する必要があります。

+0

努力をいただきありがとうございます。だから私は彼らにまったく同じXとYと異なるZを与えるべきですか? – agiro

+0

Quaternionsのコードで私の質問を編集します。それでも動作せず、非常に強い動きをします。 – agiro

+0

レコードについては、 'Slerp'と全く同じポッピングを行います – agiro

関連する問題