如何在Maya Python API 2.0中基于自定义枢轴旋转节点
自定义枢轴旋转的Maya Python API 2.0解决方案
问题复盘
你尝试通过Maya Python API 2.0实现对象围绕自定义枢轴旋转,但当前代码生成的定位器未按预期围绕指定枢轴运动。原代码如下:
import maya.OpenMaya as om import maya.cmds as cmds object_position = om.MVector(0.0, 1.0, 0.0) pivot_pos = om.MVector(0.0, 0.0, 0.0) twist_axis = om.MVector(0.0, 0.0, 1.0) twist_value = 1 transform = om.MTransformationMatrix() transform.setTranslation(object_position, om.MSpace.kWorld) transform.setRotatePivot( om.MPoint(pivot_pos), om.MSpace.kWorld, True) rotation_quat = om.MQuaternion(twist_value, twist_axis) transform.rotateBy(rotation_quat, om.MSpace.kTransform) final_pos = transform.translation(om.MSpace.kTransform) cmds.spaceLocator(p=(final_pos.x, final_pos.y, final_pos.z))
问题根源
- 旋转空间错误:使用
om.MSpace.kTransform执行旋转时,旋转是围绕对象自身的局部原点,而非你设置的自定义枢轴。 - 枢轴设置逻辑缺失:仅调用
setRotatePivot不足以让旋转围绕该枢轴生效,需要配合枢轴偏移设置,或者采用更直观的「平移-旋转-平移」逻辑。
修正方案
方案一:平移-旋转-平移(直观逻辑)
这是最容易理解的自定义枢轴旋转实现方式,通过三次变换模拟围绕枢轴旋转:
import maya.OpenMaya as om import maya.cmds as cmds object_position = om.MVector(0.0, 1.0, 0.0) pivot_pos = om.MVector(0.0, 0.0, 0.0) twist_axis = om.MVector(0.0, 0.0, 1.0) twist_value = 1 # 单位为弧度,如需角度可转成弧度:om.MAngle(90, om.MAngle.kDegrees).asRadians() # 初始化变换矩阵,设置对象初始位置 transform = om.MTransformationMatrix() transform.setTranslation(object_position, om.MSpace.kWorld) # 计算对象到枢轴的偏移量 offset = object_position - pivot_pos # 1. 将对象平移至枢轴原点(临时让枢轴与世界原点重合) transform.translateBy(-offset, om.MSpace.kWorld) # 2. 执行旋转 rotation_quat = om.MQuaternion(twist_value, twist_axis) transform.rotateBy(rotation_quat, om.MSpace.kWorld) # 3. 将对象平移回枢轴位置,完成旋转 transform.translateBy(offset, om.MSpace.kWorld) # 获取最终世界空间位置并创建定位器 final_pos = transform.translation(om.MSpace.kWorld) cmds.spaceLocator(p=(final_pos.x, final_pos.y, final_pos.z))
方案二:配合旋转枢轴与偏移(API原生方法)
直接使用Maya变换矩阵的枢轴属性,需要同时设置rotatePivot和rotatePivotTranslate:
import maya.OpenMaya as om import maya.cmds as cmds object_position = om.MVector(0.0, 1.0, 0.0) pivot_pos = om.MVector(0.0, 0.0, 0.0) twist_axis = om.MVector(0.0, 0.0, 1.0) twist_value = 1 transform = om.MTransformationMatrix() transform.setTranslation(object_position, om.MSpace.kWorld) # 设置世界空间下的旋转枢轴 transform.setRotatePivot(om.MPoint(pivot_pos), om.MSpace.kWorld, True) # 计算并设置枢轴平移量(对象位置到枢轴的反向偏移) pivot_translate = pivot_pos - object_position transform.setRotatePivotTranslate(om.MVector(pivot_translate), om.MSpace.kWorld, True) # 使用世界空间执行旋转 rotation_quat = om.MQuaternion(twist_value, twist_axis) transform.rotateBy(rotation_quat, om.MSpace.kWorld) # 获取最终世界空间位置并创建定位器 final_pos = transform.translation(om.MSpace.kWorld) cmds.spaceLocator(p=(final_pos.x, final_pos.y, final_pos.z))
关键说明
- 注意
twist_value的单位是弧度,如果需要使用角度值,需通过om.MAngle类进行转换。 - 获取最终位置时需指定
om.MSpace.kWorld,确保得到的是世界空间坐标,与Maya视图中的位置对应。
内容的提问来源于stack exchange,提问作者MyHornCanPierceTheSky
相关产品推荐
相关产品推荐

