Это взято из одного моего экспортера, который я сделал для игрового движка. Вместо того, чтобы заходить в контроллер для считывания данных, я получаю сам узел и читаю напрямую из узла, это означает, что кости можно анимировать любым способом и при этом экспортировать нормально.
//jountCount is the number of bones in the skin modifier,
for (int currbone=0;currbone<jointCount;currbone++)
{
int time = GetCOREInterface()->GetTime();
INode* boneNode = skin->GetBone(currbone);
//animEnd and anim Begin is set in my GUI. for example frame 10 to 100
int totalKeyframeTime = animEnd - (animBegin);
int myticks = GetTicksPerFrame();
fprintf(s_pStreammma,"\t<Bone id=\"%i\">\n",currbone);
fprintf(s_pStreammma, "\t\t<position num=\"%i\">\n",totalKeyframeTime);
Point3 ang;
Matrix3 nodeTM2;
Matrix3 objTM2;
Point3 objTrans2;
TimeValue tval;
for(int v = 0; v < totalKeyframeTime; ++v)
{
tval = TimeValue(animBegin +v);
nodeTM2 = boneNode->GetNodeTM(tval * myticks);
objTM2 = boneNode->GetObjectTM(tval * myticks);
objTrans2 = objTM2.GetTrans();
INode *parent = node->GetParentNode();
Matrix3 parent_TM = parent->GetNodeTM(tval * myticks);
Matrix3 local_tm = (parent_TM - objTM2);
if(currbone == 0)
{
parent = node;
}
else
{
parent = boneNode->GetParentNode();
}
Matrix3 localTransform = nodeTM2 * Inverse(parent->GetNodeTM(tval * myticks));
Point3 vLocalPos = localTransform.GetTrans();
fprintf(s_pStreammma,"\t\t\t<k t=\"%i\" x=\"%f\" y=\"%f\" z=\"%f\"/>\n",(animBegin +v),vLocalPos.x,vLocalPos.y,vLocalPos.z);
}
fprintf(s_pStreammma,"\t\t</position>\n");
fprintf(s_pStreammma, "\t\t<rotation num=\"%i\">\n",totalKeyframeTime);
for(int v = 0; v < totalKeyframeTime; ++v)
{
tval = TimeValue(animBegin +v);
INode *parent = node->GetParentNode();
Matrix3 parent_TM = parent->GetNodeTM(tval * myticks);
nodeTM2 = boneNode->GetNodeTM(tval * myticks);
objTM2 = boneNode->GetObjectTM(tval * myticks);
if(currbone == 0)
{
parent = node;
}
else
{
parent = boneNode->GetParentNode();
}
Matrix3 local_tm = nodeTM2 * Inverse(parent->GetNodeTM(tval * myticks));
QuatToEuler(local_tm,ang,0,false);
fprintf(s_pStreammma,"\t\t\t<k t=\"%i\" x=\"%f\" y=\"%f\" z=\"%f\"/>\n",(animBegin +v),ang.x /3.14*180,ang.y /3.14*180,ang.z /3.14*180);
}
fprintf(s_pStreammma,"\t\t</rotation>\n");
//scale
fprintf(s_pStreammma, "\t\t<scale num=\"%i\">\n",totalKeyframeTime);
for(int v = 0; v < totalKeyframeTime; ++v)
{
fprintf(s_pStreammma,"\t\t\t<k t=\"%i\" x=\"%f\" y=\"%f\" z=\"%f\"/>\n",(animBegin +v),1.0,1.0,1.0);
}
fprintf(s_pStreammma,"\t\t</scale>\n");
fprintf(s_pStreammma,"\t\t</Bone>\n");
animStartTimeTemp +=1;
}
Чтобы получить ключевые кадры и получить время этих ключевых кадров из объектов кости, вы можете использовать следующий код, не забудьте также настроить ключи вращения и масштабирования.
Control *c;
c = boneNode->GetTMController()->GetPositionController();
IKeyControl *ikeys = GetKeyControlInterface(c);
if (!ikeys) return;
int numkeys = rootBone->NumKeys();
IKey* mykey;
for (int key=0;key < numkeys; key++)
{
ikeys->GetKey(key,mykey);
TimeValue keytime;
keytime = mykey->time;
}
для двуногих он указывает контроллер положения как «BipPositionList», а не как обычный «контроллер положения XYZ», который есть у обычной кости. Поэтому вам нужно настроить код, получив двуногий BipPositionList и выписать данные оттуда.
person
IAmNoone
schedule
19.02.2014