【问题标题】:Change a left handed coordinate matrix to a right handed in python for 3ds max在python中将左手坐标矩阵更改为右手坐标矩阵以实现3ds max
【发布时间】:2017-03-20 00:26:07
【问题描述】:

我正在努力将转换从左坐标系 (unity/maya) 导入到 3ds max,它是一个文件的右手坐标。

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

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

虽然轮换不是那么容易。

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

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

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

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

【问题讨论】:

  • 将旋转矩阵乘以[1 0 0; 0 1 0; -1 0 0],然后将平移向量更改为column([x y -z]) 是否可行?
  • 位置、旋转和缩放都在同一个矩阵中,只是恰好矩阵的最后一行就是位置。也许它有效,但单位矩阵是 (Point3(1, 0, 0),Point3(0, 1, 0),Point3(0, 0, 1),Point3(0, 0, 0) 对于 3ds,即,3列和4行(你可以看到最后一个是0,0,0,所以它在零位置。也许我可以通过对前3行进行乘法然后将最后一行更改为你说。我会试一试
  • 糟糕,搞错了:最后一行应该是; 0 0 -1]。无论如何,我以为你使用的是en.wikipedia.org/wiki/Denavit%E2%80%93Hartenberg_parameters,这就是为什么我认为它是一个 3x3 矩阵,然后是一个 1x3 向量。
  • 很遗憾它不起作用...

标签: python matrix 3dsmax


【解决方案1】:

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

  1. 按原样导入场景/模型。
  2. 如果没有根,请创建它并将所有没有父对象的对象链接到所创建的根。
  3. 旋转根以将该变换应用于所有内容,直到获得所需的结果。

如果您在 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

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

【讨论】:

    猜你喜欢
    • 2014-01-07
    • 1970-01-01
    • 2019-07-26
    • 1970-01-01
    • 2021-04-09
    • 2014-08-17
    • 2020-11-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多