Самый простой способ преобразования между Matrix и Quaternion и EulerRotation в PyMEL

Я знаю, как выполнить математику для преобразования между матрицей 4x4, кватернионом и углами Эйлера при вращении в любой другой форме. Я просто надеялся, что в PyMEL будут встроенные способы конвертации. Ни один действительно не работал для меня до сих пор. Кто-нибудь знает лучший способ или широко используемую библиотеку для этого?

Спасибо!


person Steve Middleton    schedule 04.11.2014    source источник


Ответы (1)


В Pymel есть классы-оболочки для кватерионы и матрицы и вращения Эйлера

следовательно:

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]])

Вы также можете получить прямой доступ к базовым классам API без Pymel, хотя это немного раздражает, потому что вам нужен неприглядный MScriptUtil для предоставления двойных значений.

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

Обновить

В настоящее время все это намного проще, используя версию API 2.0:

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)
person theodox    schedule 04.11.2014
comment
Если преобразовать матрицу в MTransformationMatrix, метод getRotationQuaternion() делает это. - person theodox; 16.03.2015
comment
Да, похоже, это единственный способ, который я нашел - спасибо! - person Steve Middleton; 17.03.2015