将 3ds max 的左手坐标矩阵更改为 python 中的右手坐标矩阵

Change a left handed coordinate matrix to a right handed in python for 3ds max

我正在努力从文件中导入从左坐标系 (unity/maya) 到右手坐标系 3ds max 的变换。

3ds Max 使用 3x4 矩阵,但它与 4x4 矩阵相同,但删除了最后一列(实际上没有任何作用,因此没有数据丢失)

矩阵中的转换有点简单,因为我只需要在获取原始矩阵时将最后一行从 [x y z] 交换到 [-x z y],将 y 值交换为 z 值并设置x 为负。

虽然旋转并不容易。

我尝试了一种解决方法,通过获取矩阵的四元数,将其更改为欧拉,进行与之前所述相同的交换并再次将其作为四元数,旋转有点偏离。

我想知道是否可以对原始矩阵执行一系列矩阵运算以使其准备好设置右手 3ds max 坐标,因为初始坐标是左手的。

我在一些文档中看到将 z 值设置为负数,但这并没有真正起作用。

关于这个或任何我可以关注的地方有什么好的文档吗?我看的每个文档都有不同的解决方案,这开始令人困惑。

我通过执行以下操作解决了这个问题:

  1. 按原样导入 scene/models。
  2. 如果没有根,则创建它并link所有没有创建根的父对象的对象。
  3. 旋转根以将变换应用于所有内容,直到获得所需的结果。

如果您使用的是 3ds Max,则可以转到 maxscript 侦听器并键入:“$.transform”。这将为您提供当前正在 selecting 的对象的转换,因此 select 根并将其写入控制台,您将获得需要应用的转换矩阵。

现在,您可以将此矩阵保存在文件中并应用它,或者如果您想要更精确,每次您要使用它时,在脚本中执行上面的第三步到一个虚拟对象对象然后你可以将它乘以场景中的任何对象。例如:

root = Dummy()
root.rotation = (quat 0 -0.707107 0.707107 0)
root.scale = Point3 -1 -1 -1

每个坐标系都是它自己的东西,所以你会得到不同的值。现在您只需对任何对象执行以下操作:

object.transform *= root.transform

这将为您提供所需的适当转换。