2014-11-04 3 views
1

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

Спасибо!

ответ

2

Pymel имеет классы-оболочки для quaterions и matrices и euler 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]]) 

Вы также можете получить прямой доступ к базовым классам 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 

Обновление

Это все гораздо проще в настоящее время с помощью версии 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) 
+0

Я предполагаю, что я специально искал dt.Matrix для преобразования dt.Quaternion ... –

+0

Если преобразовать матрица в [MTransformationMatrix] (http://download.autodesk.com/us/maya/2010help/API/class_m_transformation_matrix.html), метод getRotationQuaternion() 'делает это. – theodox

+0

Да, это, кажется, единственный способ, который я нашел - спасибо! –

 Смежные вопросы

  • Нет связанных вопросов^_^