field节点相比创建polymesh之类的节点而言要复杂一些。主要有以下几点不同:
1、多加入了openMayaFX库;
2、在初始化插件时也有一些不同;
MStatus initializePlugin( MObject obj )
{
MStatus status;
MFnPlugin plugin(obj, "","2012", "Any");
status = plugin.registerNode( "DynExprField",DynExprField::id,&DynExprField::creator,
&DynExprField::initialize,MPxNode::kFieldNode );
if (!status) {
status.perror("registerNode");
return status;
}
}
registerNode参数列表最后加上MPxNode::kFieldNode,表明是field节点。相应地,在.h文件中继承的基类MPxNode也需改为MPxFieldNode;
class dynExprField: public MPxFieldNode
3、在field节点中增加了一个函数成员MStatusApply(MDataBlock &,MVectorArray &,...),用于施力;
4、API会从MPxFieldNode中获取一些参数来构建节点,如:
mMagnitude--magnitude大小
mAttenuation--attenuation大小
mOwnerPosData--各个owner的位置
mInputData--包含刚体粒子的位置\速度\质量等信息
mOwnerCentroid-- applyVertex打开时,owner的中心位置
mOutputForce(important)--输出outputForce,是作用力的向量队列而不是受力物位置的向量队列,受力物为粒子或刚体,连接至particleShape或rigidBody的inputForce上;
对于field node来说,可以用各种数学公式、各种算法来实现,但其核心就是要得到outputForce向量队列,从而控制粒子或刚体的运动。
看了两个field例子,越来越觉得mayaAPI像八股,核心算法比重少,形式却很繁杂。写起来费力不讨好,看来再熟悉熟悉就得转向python了。继续~