实现变换使用旋转矩阵旋转

时间:2018-12-16 19:01:37

标签: unity3d matrix rotation geometry

我正在尝试实现transform.Unity中使用旋转矩阵在y轴上旋转,可以吗?我写了这个函数,但是似乎不起作用,pos是旋转对象的位置,theta是角度

public static MyQuaternion Rotate(Vector3 pos, float theta)
 {
         pos = pos.normalized;
         pos -= pos;
         float[,] m = new float[3, 3];

         m[0, 0] = Mathf.Cos(theta); 
         m[0, 1] = 0; 
         m[0, 2] = Mathf.Sin(theta);
         m[1, 0] = 0; 
         m[1, 1] = 1; 
         m[1, 2] = 0;
         m[2, 0] = -Mathf.Sin(theta); 
         m[2, 1] = 0; 
         m[2, 2] = Mathf.Cos(theta);

         Vector3 newPos = new Vector3();
         float temp;

         for (int i = 0; i < 3; ++i)
         {
             temp = 0;
             for (int j = 0; j < 3; ++j)
             {
                 temp += m[i, j] * pos[j];
             }
             newPos[i] = temp;
         }

         newPos += pos;

         return new MyQuaternion(newPos.x, newPos.y, newPos.z, 0);
 }

你有什么主意吗?谢谢

1 个答案:

答案 0 :(得分:0)

如果您想深入了解如何手动旋转向量,可以做的不错,但是我不确定要返回的MyQuaternion类型。

如果只想将向量旋转任意角度,则可以使用Quaternion类中Unity的构建。 Vector3的乘法定义为该向量的旋转,因此您可以这样做

Quaternion q=Quaternion.Euler(theta,0,0); // or however you want to map it
Vector3 rotatedVector=q*inputVector;
return rotatedVector;

整体旋转通常通过四元数乘法完成。要将其应用于游戏对象,只需将其变换乘以要执行的旋转即可。

transform.rotation*=Quaternion.Euler(0,0,theta);

对象的位置没有旋转的间隙。