LibGDX Matrix4给定方向向量的三维旋转问题3

LibGDX Matrix4给定方向向量的三维旋转问题3,matrix,3d,rotation,libgdx,transform,Matrix,3d,Rotation,Libgdx,Transform,到现在为止,我是如此困惑,以至于我不再确定我的向量数学。。我有一个Matrix4:MatrixA表示对象(传感器立方体)世界变换。我想放置这个对象,使其前进方向与给定的规范化向量3:VecA指向同一方向。我还想从给定的点:VecB沿VecA的方向平移对象(即4个单位)(平移部分工作,使用相同的方向向量VecA) 我已经尝试了我能想到的所有方法,包括rotate()+translate()、setToWorld()、setToLookAt()、setToRotation()、手动编辑Matrix4

到现在为止,我是如此困惑,以至于我不再确定我的向量数学。。我有一个Matrix4:MatrixA表示对象(传感器立方体)世界变换。我想放置这个对象,使其前进方向与给定的规范化向量3:VecA指向同一方向。我还想从给定的点:VecB沿VecA的方向平移对象(即4个单位)(平移部分工作,使用相同的方向向量VecA)

我已经尝试了我能想到的所有方法,包括rotate()+translate()、setToWorld()、setToLookAt()、setToRotation()、手动编辑Matrix4的值(第3列)(这在旋转方面给出了最好的结果,但我得到了一个倾斜的立方体)

我知道我的方向向量(VecA)是正确的。(通过打印它的值,并通过使用相同的向量查看工作翻译来直观确认)

有人能告诉我应该怎么做才能达到我想要的结果吗,谢谢

假设您未旋转的“前进方向”为(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)

变换矩阵没有“前进方向”,但可以包含旋转。因此,您还必须定义未旋转的前进方向。此外,通常有无限多个可能的变换来表示单个向量(前进方向)的旋转。为了确保得到你想要的结果,你至少应该定义一个额外的(例如“向上”或“向右”)方向(旋转和不旋转)。谢谢,这很有效。有几件事我不明白。m.trn(vecB)不应该和m.translate(vecB)做同样的事情吗?我也不太明白为什么我不能使用Matrix4中的任何一种方法来获得我想要的旋转:即setToLookAt()或setToRotation(),这是因为你提到的未定义的向上/向右方向吗?我以为这就是我在setToLookAt(方向,Vector3.Y)中所做的?使用0,1,0作为up。如有任何澄清,我们将不胜感激,再次感谢。
trn
只需更新位置,
translate
“post multiplies”,因此它将在旋转后(或在旋转的“方向”上)进行平移
setToLookAt
的作用基本相同,只是它将反转z轴(方向)。检查来源: