一、Creating Custom Locator
maya提供标准locator定位器,我们也可以自定义定位器
- Draw/Define a shape(Opengl-function->MGLFunctionTable)
- Define a Bounding Box?
- isBounded()
- Define size of Bounding Box(Size of the locator)
- boundingBox()
1.1 Locators
MPxLocatorNode
- draw()
- isBounded()
- boundingBox()
MGLFunctionTable
- 为OpenGL的api提供了包装器
- 我们不用自己进行实例化,只需要获取maya中的一个指针
- MHardwareRenderer() <<OpenMaya Render\
- ptr = OpenMayaRender.MHardwareRenderer.theRenderer()
- ptr link to HardwareRenderer
- glFunctionTable()->Opengl functions
1.2 实现结果
1 | #locators.py |
1 | import maya.cmds as cmds |
有组件,但是无显示,查阅api后发现,其实这个有给出例程,但是也是分了api1.0和api2.0版本的,教程写的大概是api1.0版本,1.0在maya2023、python3.9.3版本上大概不能使用,因此只能后面参考api2.0版的例程了。
而后面的IK部分也是完全无法使用了,需要学习新版本的api。只能笔记记录下思路
二、Maya Callbacks
回调是一种链接方式,链接特定事件的特定函数,并时刻关注这个函数的发生
回调允许我们针对特定的事件注册该函数(和java中的listener、Oracle中的Trigger相似)
OpenMaya中基于事件类别,对回调进行了分类
基类【MMessage】,其他回调的类都是这个基类的派生类callback(event, function)
2.1 Message消息
Message[eg MAnim Message]
Message[eg MCommand Message]
2.2 Callback回调
Removable
Id(callback create)
MAnim Message
- Animation Message Callback
- animation curve editing
- keyframe editing
- baked result change
- Animation Message Callback
MCommand Message
- Command Message Callback
- MEL command excution
- Command Message Callback
MDG Message
- for Dependency Graph Message
- Node added/removed
- Connection established/removed
MDAG Message
- for dependency Graph Message
- (主要跟踪或检查dag节点的切换)
- Parent/child/Instance/added/removed
Event Message
- “script Job”
OpenMaya.MEventMessage.getEventNames()
Lock Message
- for lock message
- plug locked/unlocked
- values cannot be changed
- Node locked/unlocked
- cannot Re-parented/Renamed/deleted
Node Message
- for Dependency Node Message
- Attribute added/removed
- plug of a Node is dirty
- name of a Node is changed
Scene Message
- Scene related Message
- Before/After
- New scene
- Existing scene
- Reference is loaded/unloaded
- Maya is initialized/exist
Timer Message
UI Message
User-event message
三、Inverse-Forward Kinematics Solution
在这个插件中使用回调将IK和FK的功能结合起来
FK mode
- 移动父节点,驱动子结点
IK mode
- 移动子节点,在约束的条件下,自动解算父节点位置
- 在IK和FK中切换
- 选择polar vector/IK handle/子结点关节时,IK mode
- 选择任意一个父节点关节时,FK mode
- 施加约束
Custom-Node (IK FK)<-> Event Callback <-> Selection Change
Custom-Node (delete)<->DG Callback <-> addition/creation/deletion the DG nodes
Creating I-F K solution
Auto IK-FK Switching
- Find out which “Mode” we want to switch to
- Find information of all seven objects of 3-joint chain IK-system
- Perform operation based on the “Mode” we are at
我这里暂时没有poleVectorControl
默认Mode =FK(joint1,joint2)
- Mode = IK
- IK -Handle selected
- Joint3 selected
- Pole-vectorcontrol selected
If Mode = FK
- set ikBlend = 0
- set visibility of Pole Vector Control = 0
If Mode = IK
- set ikBlend = 1
- snap Pole Vector Control to Joint2
set attribute of IK handle to non-Keyable
ikBlend
ikBlend- non-Keyable
Add translation after snapping Pole Vector Control