如何只翻转变换矩阵的一个轴?
Posted
技术标签:
【中文标题】如何只翻转变换矩阵的一个轴?【英文标题】:How to flip only one axis of transformation matrix? 【发布时间】:2016-06-29 10:16:38 【问题描述】:我有一个 4x4 变换矩阵。但是,在尝试转换后,我注意到 Y 轴的移动 和 旋转方向相反。其余的都是正确的。
我从其他一些 API 获得了这个矩阵,所以可能是坐标系的差异。那么,如何翻转变换矩阵的轴呢?
如果只有平移,我可以在 Y 平移上添加减号,但我不知道只有一个轴的相反旋转,因为所有旋转都表示在同一个 3x3 区域中。我认为可能有某种方式甚至可以同时影响平移和旋转。 (真正的翻转轴)
【问题讨论】:
【参考方案1】:编辑:我很确定您正在寻找的操作是在保持 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)
导出 gamma。请注意,矩阵中的相同数字可以表示多个值(例如sin(0)=0
和sin(180)=0
)。
现在您已经了解了 alpha、beta 和 gamma,您可以反转 beta 并重新制作旋转矩阵。
很有可能有更好的方法使用四元数来做到这一点,但您应该向 Math StackExchange 询问这些与语言无关的问题。
【讨论】:
【参考方案2】:更简短的答案:如果您不注意框架方向,您的管道中的许多事情可能会遇到糟糕的一天。原因是“平价”,又名“框架方向”,又名“right-handedness”(或很少使用左撇子)。大多数协同工作的 3D 几何工具和库通常隐含地假设所有正在运行的坐标系都是右手的(或至少是一致的)。在坐标系中仅反转一个轴的方向会将其方向从右手更改为左手,反之亦然。
所以,建议您检查和尝试解决您的问题:
检查您从 API 获得的帧是否是右手的。你这样做 通过计算 4x4 变换矩阵的 3x3 旋转部分的行列式:它必须是 +1 或非常接近它。
如果是 -1,则如果它的轴翻转一个,即更改 3x3 旋转的列之一的符号。
请注意:我说“列”是因为我假设您通过乘以 Q * x 将变换 Q 应用于点 x,x 是一个 4x1 列向量,最后一个分量等于 1。如果使用行向量左乘 Q,则需要翻转一行。
如果该行列式是 +1,那么您在其他地方就有错误。
【讨论】:
以上是关于如何只翻转变换矩阵的一个轴?的主要内容,如果未能解决你的问题,请参考以下文章