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

时间:2016-11-06 16:59:38

标签: python matrix 3dsmax

我正在尝试从左坐标系统(unity / maya)导入到3ds max的转换,这是从文件右手。

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

矩阵中的平移很容易,因为我只需要在获取原始矩阵时将最后一行从[xyz]交换到[-xzy],交换z值的y值并将x设置为负

虽然旋转并不容易。

我尝试做一个变通方法,通过获取矩阵的四元数,将其更改为euler,执行前面所述的相同交换并再次将其作为四元数,并且旋转稍微偏离。

我想知道是否有一系列矩阵运算可以对原始矩阵进行,以便为右手3ds max坐标做好准备,因为最初的是左手。

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

关于这个或我可以遵循的任何地方是否有任何好的文件?我看的每个文档都有不同的解决方案,这开始令人困惑。

1 个答案:

答案 0 :(得分:0)

我通过执行以下操作来修复此问题:

  1. 按原样导入场景/模型。
  2. 如果没有根,请创建它并将所有没有父级的对象链接到创建的根目录。
  3. 旋转根以将该变换应用于所有内容,直到获得所需结果。
  4. 如果你在3ds Max中,你可以转到maxscript监听器并输入:" $ .transform"。这将为您提供当前正在选择的对象的转换,因此选择根并将其写入控制台,您将获得需要应用的转换矩阵。

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

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

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

    object.transform *= root.transform
    

    这将为您提供所需的正确转换。