有一个给定的三维向量。 我想将这个向量转换为一个旋转,它可以使该多维数据集的局部轴(如X轴)与向量的方向匹配。
我准备了两张照片。但由于我的声誉,我无法粘贴它们。我是新生。我尝试了很多次,但仍然无法让它发挥作用。我认为这可能涉及旋转立方体时立方体的旋转顺序。
答案 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
其中
缩放(如果有的话)以向量的大小编码;对于比例为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中的矩阵和向量乘法,我们假设:
然后,rotation_matrix * some_vector的产品是
[
sum([m * v for m, v in zip(m_column, some_vector)])
for m_column in rotation_matrix
]