从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);
}
}
编写插件从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);
}
}
相关文章推荐
- 从3DS MAX中导出骨骼动画注意的几件事
- 3DS Max中bip动画融合及ogre动画导出
- 关于骨骼动画max数据导出到dx中一些问题总结
- 3DS MAX 导入骨骼动画插件
- 3DS Max中bip动画融合及ogre动画导出
- 3DS Max中bip动画融合及ogre动画导出
- 3ds Max骨骼动画
- 3ds max的动画输出
- coco2d-x 之利用CocoStudio创建骨骼动画特别注意地方
- 3ds max的纹理导出
- 3DS MAX 导出FBX到Unity3D设置
- 用ue4渲染动画 导出视频相关配置和注意点
- 3Ds Max文件导出为Mesh格式文件-OGRE
- 3DS导出到Unity3D的注意事项
- 3ds max 导出插件开发后记
- 3DS导出到Unity3D的注意事项
- 从3DS MAX建模到Ogre实时动画的制作过程
- 用OgreMax插件从3ds max导出ogre模型文件(.mesh/.skeleton)
- 3ds max利用panda插件导出x,网上的很多不行,下面是官方各版本下载地址绝对行
- three for 3ds max 导出three obj 模型文件,插件安装方法