您的位置:首页 > 其它

从3DS MAX中导出骨骼动画注意的几件事

2012-09-02 16:10 465 查看
http://blog.csdn.net/windyxu/article/details/779967





编写插件从MAX中导出骨骼动画的几点注意事项.

1.首先要遍历所有的MESH,和BONE,并导出0时刻的MESH所有顶点位置及索引,和BONE的世界变换矩阵的逆矩阵.这些信息可以单独放到一个文件中,以后加入动作时,每个动作可以做为一个文件.

2.如果使用Physique做为蒙皮插件以下是寻找该修改器的代码:

Modifier* FindPhysiqueModifier (INode* nodePtr)

{

// Get object from node. Abort if no object.

Object* ObjectPtr = nodePtr->GetObjectRef();

if (!ObjectPtr) return NULL;

// Is derived object ?

while (ObjectPtr->SuperClassID() == GEN_DERIVOB_CLASS_ID && ObjectPtr)

{

// Yes -> Cast.

IDerivedObject *DerivedObjectPtr = (IDerivedObject *)(ObjectPtr);

// Iterate over all entries of the modifier stack.

int ModStackIndex = 0;

while (ModStackIndex < DerivedObjectPtr->NumModifiers())

{

// Get current modifier.

Modifier* ModifierPtr = DerivedObjectPtr->GetModifier(ModStackIndex);

// Is this Physique ?

if (ModifierPtr->ClassID() == Class_ID(PHYSIQUE_CLASS_ID_A, PHYSIQUE_CLASS_ID_B))

{

// Yes -> Exit.

return ModifierPtr;

}

// Next modifier stack entry.

ModStackIndex++;

}

ObjectPtr = DerivedObjectPtr->GetObjRef();

}

// Not found.

return NULL;

}

3.在导出动画时,MAX中的四元数是反向的.比如我们对骨骼以轴(0,0,1)旋转(90)度.通过Control * rotCont = iBone->GetTMController()->GetRotationController();

iNumKeys = ctlRot->NumKeys();

for( i=0; i < iNumKeys; i++ ) {

TimeValue t = ctlRot->GetKeyTime( i );

Interval valid;

Quat q;

ctlRot->GetValue( t, &q, valid );

}

得到的是 以轴(0,0,-1)旋转(90)度

所以要对四元数的X,Y,Z分量,(也就是轴方向分量与角度一半的正弦积)求负.才能正常的显示动画.

4.GetNodeTM 函数得到的是节点相对世界空间的变换,在导出动画的时候往往要得到相对于它的父节点的变换.所以要做如下变换:

Matrix3 matRelativeTM;

Matrix3 matParentTM;

Matrix3 matTM = GetBoneTM(pNode,keyTime);





if (boneNode.mParentID == -1)

{

matRelativeTM = matTM;

}

else

{

matParentTM = GetBoneTM(pNode->GetParentNode(),keyTime);

if( memcmp(&matTM,&matParentTM,12*sizeof(float)) == 0 )

{

matRelativeTM.IdentityMatrix();

}

else

{

matRelativeTM = matTM * Inverse(matParentTM);

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: