我有一个4x4转换矩阵。然而,在尝试转换之后,我注意到Y轴的运动和旋转正好相反。其余的都是正确的。
我从其他API获得了这个矩阵,所以可能是坐标系统的差异。那么,我该如何翻转变换矩阵的轴?
如果只翻译我可以在Y平移上添加减号,但我不知道只有一个轴的反向旋转,因为所有旋转都在同一个3x3区域中表示。我认为可能会有某种方式同时影响平移和旋转。 (真正翻转轴)
答案 0 :(得分:4)
编辑:我很确定您正在寻找的操作是在保持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)=0
和sin(180)=0
)。
现在您已了解alpha,beta和gamma,您可以反转beta并重新制作旋转矩阵。
使用四元数有一个更好的方法可以做到这一点,但你应该向Math StackExchange询问这些与语言无关的问题。
答案 1 :(得分:4)
答案简短得多:如果你对框架方向不小心,很多事情可能会让你头发很糟糕。原因是“平价”,a.k.a。“框架方向”,a.k.a。“right-handedness”(或很少左撇子)。大多数3D几何工具和库一起工作通常隐含地假设所有坐标系统都是右手(或至少是一致的)。在坐标系中仅反转一个轴的方向会改变其方向,从右到左或反之。
所以,建议检查和检查的事情试试你的问题:
检查您从API获得的框架是否合适。你这样做了 通过计算4x4变换矩阵的3x3旋转部分的行列式:它必须是+1或非常接近它。
如果它是-1,则在其轴上翻转一个,即改变3x3旋转的一列的符号。
请注意:我说“列”是因为我假设你将变换Q应用到点x,乘以Q * x,x是4x1列向量,最后一个分量等于1。如果你使用左乘Q的行向量,你需要翻转一行。
如果该决定因素为+1,那么其他地方就有错误。