如何仅翻转变换矩阵的一个轴?

How to flip only one axis of transformation matrix?

我有一个 4x4 变换矩阵。然而,在尝试转换后,我注意到 Y 轴的 旋转方向相反。其余的是正确的。

我从其他人那里得到这个矩阵 API 所以可能是坐标系的不同。那么,如何翻转变换矩阵的轴?

如果只有平移,我可以在 Y 平移上添加减号,但我不知道只有一个轴的反向旋转,因为所有旋转都在同一个 3x3 区域中表示。我认为可能有某种方式甚至可以同时影响平移和旋转。 (真正翻转轴)

编辑:我很确定您正在寻找的操作是在保持 Z-up 或 Y-up 的同时更改坐标系。在这种情况下,请尝试将矩阵第二列(或行)的所有元素设置为它们的倒数。


这道题用Math StackExchange 会更好。首先,a really helpful read on rotation matrices.

第一个问题就是轮换顺序的问题。我将采用 XYZ 旋转顺序。我们知道每个轴的旋转矩阵如下:

给定一个从相同旋转顺序导出的矩阵,得到的矩阵如下,其中 alpha 是 X 角,beta 是 Y 角,gamma 是 Z 角:

您可以从此矩阵导出每个轴角的各个分量。例如,您可以使用一些反三角从 -sin(beta) 导出 Y 角。给定 beta,您可以从 cos(beta)sin(alpha) 导出 alpha。您还可以从 cos(beta)sin(gamma) 导出伽马。请注意,矩阵中的相同数字可以表示多个值(例如 sin(0)=0sin(180)=0)。

现在您已经了解了 alpha、beta 和 gamma,您可以反转 beta 并重新制作旋转矩阵。

很可能有更好的方法使用四元数来执行此操作,但您应该向 Math StackExchange 询问这些与语言无关的问题。

更简短的答案:如果您不注意框架的方向,那么您管道中的许多事情可能都会有糟糕的一天。原因是"parity"、a.k.a。 "frame orientation"、a.k.a。 “right-handedness”(或很少用左手)。大多数协同工作的 3D 几何工具和库通常都隐含地假设所有坐标系都是右手坐标系(或至少始终是惯用坐标系)。在坐标系中仅反转一个轴的方向会将其方向从右手更改为左手或反之亦然。

所以,关于检查和尝试解决您的问题的建议:

  • 检查您从 API 获得的框架是否为右手框架。你这样做 通过计算 4x4 变换矩阵的 3x3 旋转部分的行列式:它必须是 +1 或非常接近它。

  • 如果是-1,则翻转其轴,即改变3x3旋转的其中一列的符号。

  • 注意:我说 "columns" 是因为我假设您通过乘以 Q * x 将变换 Q 应用于点 x,x 是一个 4x1 列向量,最后一个分量等于一。如果您使用左乘 Q 的行向量,则需要翻转一行。

  • 如果行列式为 +1,则说明您在其他地方有错误。