You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 08:21:02