5ar*_*gon 5 opengl graphics computer-vision
我有一个 4x4 变换矩阵。但是,在尝试转换后,我注意到Y 轴的移动和旋转方向相反。其余的是正确的。
我从其他一些 API 得到了这个矩阵,所以可能是坐标系的不同。那么,如何翻转变换矩阵的轴?
如果只有平移,我可以在 Y 平移上添加减号,但我不知道只有一个轴的反向旋转,因为所有旋转都在同一个 3x3 区域中表示。我认为可能有某种方式甚至同时影响平移和旋转。(真正翻转轴)
答案要短得多:如果你不小心调整框架的方向,你的管道中的许多东西可能会遇到糟糕的发型。原因是“奇偶性”,又名“框架方向”,又名“右手性””(或很少是左撇子)。大多数协同工作的 3D 几何工具和库通常隐含地假设所有正在使用的坐标系都是右手坐标系(或至少是一致的右手坐标系)。仅反转坐标系中一个轴的方向即可将其方向从右手更改为左手,反之亦然。
因此,建议检查并尝试解决您的问题:
检查从 API 获得的框架是否为右手框架。您可以通过计算 4x4 变换矩阵的 3x3 旋转部分的行列式来实现这一点:它必须为 +1 或非常接近它。
如果为-1,则将其轴翻转一,即更改 3x3 旋转的其中一列的符号。
请仔细注意:我说“列”是因为我假设您通过乘以 Q * x 将变换 Q 应用于点 x,x 是一个 4x1 列向量,最后一个分量等于 1。如果您使用行向量左乘 Q,则需要翻转一行。
如果该行列式是+1,则说明其他地方存在错误。
编辑:我很确定您正在寻找的操作是在保持 Z 向上或 Y 向上的同时更改坐标系。在这种情况下,尝试将矩阵第二列(或行)的所有元素设置为其逆矩阵。
这个问题对于Math StackExchange来说会更好。首先,关于旋转矩阵的读物非常有用。
第一个问题是轮换顺序的问题。我将假设 XYZ 旋转顺序。我们知道每个轴的旋转矩阵如下:
给定从相同旋转顺序导出的矩阵,所得矩阵如下,其中 alpha 是 X 角度,beta 是 Y 角度,gamma 是 Z 角度:
您可以从此矩阵导出每个轴角度的各个分量。例如,您可以-sin(beta)使用某些反三角导出 Y 角。给定 beta,您可以从 导出 alpha cos(beta)sin(alpha)。您还可以从 导出伽马值cos(beta)sin(gamma)。请注意,矩阵中的相同数字可以代表多个值(例如sin(0)=0和sin(180)=0)。
现在您知道了 alpha、beta 和 gamma,您可以反转 beta 并重新创建旋转矩阵。
很有可能有更好的方法使用四元数来做到这一点,但您应该向 Math StackExchange 询问这些与语言无关的问题。