【问题标题】:LibGDX Matrix4 3d rotation problems given direction vector3给定方向vector3的LibGDX Matrix4 3d旋转问题
【发布时间】:2014-07-31 15:39:56
【问题描述】:

现在我很困惑,我不确定我的向量数学了。我有一个 Matrix4: MatrixA 代表一个对象(传感器立方体)世界变换。我想放置这个对象,以便它的正向指向与给定的标准化 Vector3: VecA 相同的方向。我还想从给定点沿 VecA 的方向平移对象(即 4 个单位):VecB(平移部分工作,使用相同的方向向量,VecA)

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

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

谁能告诉我应该怎么做才能达到我想要的结果,谢谢!

【问题讨论】:

  • 变换矩阵没有“正向”,但可以包含旋转。因此,您还必须定义未旋转的前进方向。此外,通常有无数种可能的变换来表示单个向量的旋转(您的正向)。为了确保得到你想要的结果,你至少应该定义一个额外的(例如“向上”或“向右”)方向(旋转和非旋转)。

标签: matrix 3d rotation libgdx transform


【解决方案1】:

假设您未旋转的“正向”为 (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(direction, Vector3.Y) 中所做的事情?向上使用 0,1,0。任何澄清将不胜感激,再次感谢。
  • trn 只是更新位置,translate "post-multiplies" 所以它会在旋转后平移(或在旋转的“方向”上)。 setToLookAt 的作用基本相同,只是它会反转 z 轴(方向)。查看来源:github.com/libgdx/libgdx/blob/master/gdx/src/com/badlogic/gdx/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多