【发布时间】:2018-12-18 18:39:47
【问题描述】:
我正在尝试使用旋转矩阵在 Unity 中的 y 轴上实现 transform.Rotate,这可能吗?我写了这个函数,但它似乎不起作用,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);
}
你有什么想法吗?谢谢
【问题讨论】:
-
but it doesn't seems to work- 以什么方式?最终结果不正确吗?你从哪里得到这个等式?您是要旋转点pos本身,还是创建一个围绕pos旋转对象的矩阵? -
您似乎在旋转矢量排序,但最后您将旋转的矢量推入四元数 - 这显然是错误的。您的方法返回 Vector3,而不是旋转。如果您需要旋转,已经有一些方法可以从内置到 Quaternion 类中的方向生成四元数
-
@meowgoesthedog 我想将对象本身旋转 90 度,所以我获取它的坐标并使用它来平移到原点并为 y 轴应用基本旋转矩阵,然后我转换位置将对象转换为将应用于对象的四元数(不确定转换)。问题是对象不旋转,它只是保持静止。
-
为此,您需要返回一个 4x4(不是 3x3)变换矩阵,即 3-D 中的 仿射 变换。仅仅返回一个四元数是不够的,更不用说你以
@zambari提到的错误方式构造它了。 -
你为什么要这样做:
pos -= pos;?
标签: unity3d matrix rotation geometry