2015-02-11 113 views
2

我目前正在嘗試在世界的x軸上旋轉一個positionVector(0,0,1),然後將其旋轉回原來的位置(試圖讓它工作)。我讀入旋轉矩陣,並得到它的工作(sorta),但我現在很堅持。圍繞世界起源旋轉對象

由於圖像和代碼顯示我在起始點(0,0,1)創建一個立方體,並在此情況下將其旋轉30度。但順時針旋轉時似乎旋轉超過30度。但是,當我將其逆時針旋轉(30度)時,它會旋轉適當的量。這導致它不應該在它的出發點結束,因爲它應該(0,0,1)。

enter image description here


我在想,如果你們能闡明爲什麼發生這種情況,以及如何解決它的一些情況。提前謝謝你們!

public float RotAngle = 330f; 
 

 
public GameObject cube; 
 
public GameObject original; 
 
public GameObject relocator; 
 
public GameObject initialTurn; 
 

 
void Start() 
 
    { 
 
     Vector3 pixelPos = new Vector3(0f, 0f, 1f); 
 
    
 
     original = GameObject.Instantiate(cube,pixelPos,Quaternion.identity) as GameObject; 
 
     original.name = "Original"; 
 

 

 
     initialTurn = GameObject.Instantiate(cube, pixelPos, Quaternion.identity) as GameObject; 
 
     initialTurn.name = "InitialTurn"; 
 

 
     relocator = GameObject.Instantiate(cube, pixelPos, Quaternion.identity) as GameObject; 
 
     relocator.name = "Relocator"; 
 
    } 
 
void Update() 
 
    { 
 
     initialTurn.transform.position = RotateAroundOrigin(original.transform.position, RotAngle*Mathf.Deg2Rad); 
 
     relocator.transform.position = RotateAroundOrigin(initialTurn.transform.position, (RotAngle * -1f) * Mathf.Deg2Rad); 
 
    } 
 

 
Vector3 RotateAroundOrigin(Vector3 startPos,float angle) 
 
    { 
 
     startPos.Normalize(); 
 
     startPos.y = (startPos.y * Mathf.Cos(angle)) - (startPos.z * Mathf.Sin(angle)); 
 
     startPos.z = (startPos.y * Mathf.Sin(angle)) + (startPos.z * Mathf.Cos(angle)); 
 
     return startPos.normalized; 
 
    }

+0

「但是,如果我用手工測量它」通過把量角器在顯示器上樣?我會懷疑任何手部測量。如果由於某種原因需要推出自己的代碼,爲什麼不把它與Unity的內置函數進行比較:'transform.RotateAround(Vector3.zero,Vector3.forward,RotAngle * Mathf.Deg2Rad);'你也不應該規範3D標準化通常僅適用於方向向量。 – Jerdak 2015-02-11 16:22:19

+0

@Jerdak我假設「手工」意味着他檢查檢查器中的值,而不是實際測量它 – 2015-02-11 18:28:15

+0

@DavidReeve提供的代碼或屏幕截圖中沒有提供任何測量方法。沒有公共變量是*計算的旋轉角度。如果該代碼存在,則應該包含實際計算出的角度,而不是像「似乎略微旋轉」這樣的定性度量,但是我懷疑OP只會使角度看起來像眼睛。 – Jerdak 2015-02-11 19:23:16

回答

0

您可以用四元很容易地旋轉的方向向量。

試試這個:

Vector3 RotateAroundOrigin(Vector3 startPos,float angle) 
{ 
    startPos.Normalize(); 
    Quaternion rot = Quaternion.Euler(angle, 0.0f, 0.0f); // Rotate [angle] degrees about the x axis. 
    startPos = rot * startPos; 
    return startPos; 
}