如何使用python在Maya等软件中将三维向量转换为Euler旋转

时间:2014-05-08 03:41:00

标签: python vector maya

有一个给定的三维向量。 我想将这个向量转换为一个旋转,它可以使该多维数据集的局部轴(如X轴)与向量的方向匹配。

我准备了两张照片。但由于我的声誉,我无法粘贴它们。我是新生。

我尝试了很多次,但仍然无法让它发挥作用。我认为这可能涉及旋转立方体时立方体的旋转顺序。

3 个答案:

答案 0 :(得分:3)

您可以使用an aim constraint获得所需内容。如果您想将其作为一次性操作(没有在场景中激活约束,您可以这样做:

 lc = cmds.aimConstraint( 'your_object_here', 'target_object_here') 
 cmds.delete(*lc)

但是,如果您想在数学代码中使用数学,则可以在没有欧拉角的情况下进行。欧拉很难构造,因为有许多欧拉组合对于任何给定的方向同样有效。通过直接设置对象的矩阵使其本地轴指向您想要的方式更容易。

在maya中,矩阵的作用是这样的:

Xx  Xy  Xz  0
Yx  Yy  Yz  0
Zx  Zy  Zz  0
Tx  Ty  Tz  1

其中

  • (Xx,Xy,Xz)是矩阵
  • 的局部X向量
  • (Yx,Yy,Yz)是矩阵的局部Y向量
  • (Zx,Zy,Zz)是矩阵的局部Z向量
  • (Tx,Ty,Tz)是矩阵的翻译

缩放(如果有的话)以向量的大小编码;对于比例为1且没有旋转的矩阵,向量被归一化,因此矩阵将是

1 0 0 0 
0 1 0 0
0 0 1 0 
0 0 0 1

您可以像这样使用Pymel制作矩阵,其中4个元组代表行:

import pymel.core as pm
# in practice these vectors would reflect the orientation you want
new_mat = pm.core.matrix  (
    ( 1, 0, 0, 0),
    ( 0, 1, 0, 0), 
    ( 0, 0, 1, 0),
    ( 0, 0, 0, 1) 
    )

使用xform命令将其应用于对象:

pm.xform(my_object, matrix = new_mat)

答案 1 :(得分:1)

使用约束作为 @theodox 表示完全有效,就像使用xform一样。只提供一些备用信息(请参阅下面的附言以获取更多信息)。

但是,Maya有一个名为 decomposeMatrix 的节点,如果这是您追求的唯一内容,它将为您进行转换。 Maya API 还具有分解功能:

import maya.OpenMaya as om

util = om.MScriptUtil()

mat = om.MMatrix()
util.createMatrixFromList(
    [
    1., 0., 0., 0., 
    0., 1., 0., 0.,
    0., 0., 1., 0.,
    0., 0., 0., 1.
    ], mat)
rot = om.MEulerRotation.decompose(mat, om.MEulerRotation.kXYZ)

# result in radians which in this are is known but my example is just a placeholder
print rot.x, rot.y, rot.z

您应该更喜欢节点,因为它们会在您的需求更新时更新,除非您执行的操作从不动画或执行导出操作。

无论如何,你可能有一天会在Maya之外做这个,或者使用不同的缩放和剪切组合顺序示例然后我会指向Christoph Gohlke's homepage,并看到 Transformations.py transformations.c 它们提供了大量有关所需矩阵数学和原始资料来源的信息,例如Ken Shoemakes在旋转方面的出色分析。

PS:这是near duplicate,它还包含矩阵数学的一些信息,就像 @theodox' s 答案一样。

答案 2 :(得分:0)

我建议使用NumPy或等效的库进行数学运算,因为它们经过高度优化并实现了各种函数和运算符。

要解决python中的矩阵和向量乘法,我们假设:

  • 向量是一维列表,并被视为列向量
  • 矩阵是二维列表,其中m [R] [C]表示第R行和第C列上的元素

然后,rotation_matrix * some_vector的产品是

[
  sum([m * v for m, v in zip(m_column, some_vector)]) 
      for m_column in rotation_matrix
]

一些方便的链接:zip - manualPython List Comprehension