我正在尝试实现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);
}
你有什么主意吗?谢谢
答案 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);
对象的位置没有旋转的间隙。