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

如何在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))

问题根源

  1. 旋转空间错误:使用om.MSpace.kTransform执行旋转时,旋转是围绕对象自身的局部原点,而非你设置的自定义枢轴。
  2. 枢轴设置逻辑缺失:仅调用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 00:07:12