OpenMaya从矩阵获取Euler旋转时MMatrix参数类型错误如何解决
OpenMaya获取矩阵欧拉旋转参数报错解决方案
问题原因
报错的根本原因是maya.cmds.xform查询返回的变换矩阵是长度为16的一维浮点数序列,OpenMaya 1.x版本的MMatrix构造函数不直接支持该类型参数,你构造的MMatrix对象本身不合法,后续传入MTransformationMatrix时就会触发类型不匹配报错。
解决方案
方案1:兼容OpenMaya 1.x版本(使用MScriptUtil做类型转换)
OpenMaya 1.x需要通过MScriptUtil工具类将一维列表转换为API可识别的4x4矩阵格式,完整可运行代码如下:
import maya.OpenMaya as OpenMaya import maya.cmds as mc import math crcl = mc.circle() # 获取xform返回的一维矩阵列表 mat_list = mc.xform(crcl, q=True, matrix=True) # 构造空MMatrix对象,通过MScriptUtil填充数据 mat_util = OpenMaya.MScriptUtil() matrx = OpenMaya.MMatrix() mat_util.createMatrixFromList(mat_list, matrx) # 构造变换矩阵对象 tMat = OpenMaya.MTransformationMatrix(matrx) # 获取欧拉旋转(返回值为弧度单位的MEulerRotation对象) euler_rotation = tMat.rotation(asQuaternion=False) # 如需转换为角度值列表,可执行下行代码 euler_degree = [math.degrees(angle) for angle in euler_rotation]
方案2:使用OpenMaya 2.0版本(更简洁)
OpenMaya 2.0对Python接口做了优化,MMatrix构造函数直接支持一维列表传参,不需要额外的类型转换:
import maya.api.OpenMaya as OpenMaya2 import maya.cmds as mc import math crcl = mc.circle() mat_list = mc.xform(crcl, q=True, matrix=True) # 直接构造MMatrix对象 matrx = OpenMaya2.MMatrix(mat_list) tMat = OpenMaya2.MTransformationMatrix(matrx) euler_rotation = tMat.rotation(asQuaternion=False) # 转角度值 euler_degree = [math.degrees(angle) for angle in euler_rotation]
注意事项
MTransformationMatrix.rotation方法返回的旋转值默认采用对象自身的旋转顺序,和Maya界面显示的顺序一致- 返回值单位为弧度,需要转角度时必须调用单位转换方法
- 如无特殊的旧版本兼容需求,优先选择OpenMaya 2.0进行开发,API更简洁,性能也更优
内容的提问来源于stack exchange,提问作者Matteo Turrisi
相关产品推荐
相关产品推荐

