2015-02-11 117 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; 
}