到现在为止,我很困惑,我不再确定我的矢量数学了。我有一个Matrix4:MatrixA代表一个物体(传感器立方体)世界变换。我想放置这个对象,使它的正向指向与给定的标准化Vector3:VecA相同的方向。我还想从给定点转换VecA方向上的对象(即4个单位):VecB(翻译部分工作,使用相同的方向向量,VecA)
我已经尝试了所有我能想到的方法,包括rotate()+ translate(),setToWorld(),setToLookAt(),setToRotation(),手动编辑Matrix4的值(第3列)(这给了最好的)旋转方面的结果,但我得到一个倾斜的立方体)
我知道我的方向向量(VecA)没问题。 (通过打印它的值并通过使用相同的向量查看工作翻译来直观地确认它)
有人可以告诉我应该如何实现我想要的结果,谢谢!
答案 0 :(得分:0)
假设你没有旋转"前进方向"是(0,0,1),你没有旋转"向上的方向"是(0,1,0)并且你不想旋转向上方向(如果可能的话),那么这样的东西(未经测试的代码)应该是你需要的:
Vector3 vx = new Vector3(), vy = new Vector3(), vz = new Vector3();
Matrix4 m = new Matrix4();
...
vecB.set(vecA).scl(4.f); // if understand correctly, this is what you want
vz.set(vecA).nor();
vx.set(vz).crs(0, 1, 0).nor();
vy.set(vz).crs(vx).nor();
m.idt();
m.val[Matrix4.M00] = vx.x; m.val[Matrix4.M01] = vx.y; m.val[Matrix4.M02] = vx.z;
m.val[Matrix4.M10] = vy.x; m.val[Matrix4.M11] = vy.y; m.val[Matrix4.M12] = vy.z;
m.val[Matrix4.M20] = vz.x; m.val[Matrix4.M21] = vz.y; m.val[Matrix4.M22] = vz.z;
m.trn(vecB);
您可能需要切换crs
参数(例如vy.set(vx).crs(vz).nor()
,以防轮换颠倒)。或者,您可以使用Quaternion
指定轮播并使用m.set(vecB, rotationQuaternion);
。