gpt4 book ai didi

python - 在 PyMEL 中矩阵和四元数以及 EulerRotation 之间转换的最简单方法

转载 作者:太空宇宙 更新时间:2023-11-04 01:12:43 27 4
gpt4 key购买 nike

我知道如何执行数学运算以在任何其他形式的旋转条件下在 4x4 矩阵、四元数和欧拉角之间进行转换。我只是希望在 PyMEL 中有内置的转换方式。到目前为止,没有一个真正对我有用。有谁知道最好的方法或常用的库吗?

谢谢!

最佳答案

Pymel 有 quaterions 的包装类和 matriceseuler rotations

因此:

import pymel.core.datatypes as dt
quat = dt.Quaternion(.707, 0, 0, .707)
print quat.asEulerRotation()
# dt.EulerRotation([1.57079632679, -0.0, 0.0], unit='radians')
print quat.asMatrix()
# dt.Matrix([[1.0, 0.0, 0.0, 0.0], [0.0, 0.0, 1.0, 0.0], [0.0, -1.0, 0.0, 0.0], [0.0, 0.0, 0.0, 1.0]])

您也可以在没有 Pymel 的情况下直接访问底层 API 类,尽管这有点烦人,因为您需要讨厌的 MScriptUtil 来提供 double 值

def APIQuat(*iterable):
'''
return an iterable as an OpenMaya MQuaternion
'''
opt = None
if isinstance(iterable, OpenMaya.MQuaternion):
opt = iterable
else:
assert len(iterable) == 4, "argument to APIQuat must have 3 or 4 entries"
it = list(copy(iterable))
v_util = OpenMaya.MScriptUtil()
v_util.createFromDouble(it[0], it[1], it[2], it[3])
opt = OpenMaya.MQuaternion(v_util.asDoublePtr())
opt.normalizeIt()
return opt

更新

现在使用 2.0 版本的 api 就容易多了:

from maya.api.OpenMaya import MQuaternion, MEulerRotation
import math

q = MQuaternion (.707, 0, .707, 0)
q.normalizeIt() # to normalize
print q
print q.asEulerRotation()
# (0.707107, 0, 0.707107, 0)
# (-3.14159, -1.5708, 0, kXYZ)

# note that EulerAngles are in radians!
e = MEulerRotation (math.radians(45) ,math.radians(60), math.radians(90), MEulerRotation.kXYZ)
print e
print e.asQuaternion()
# (0.785398, 1.0472, 1.5708, kXYZ)
# (-0.092296, 0.560986, 0.430459, 0.701057)

关于python - 在 PyMEL 中矩阵和四元数以及 EulerRotation 之间转换的最简单方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26727678/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com