PMG https://forum.pmg.org.ru/ |
|
Сохранение ключей вращения - проблема https://forum.pmg.org.ru/viewtopic.php?f=2&t=9449 |
Страница 1 из 1 |
Автор: | kurlyak [ 09 мар 2013 14:49 ] |
Заголовок сообщения: | Сохранение ключей вращения - проблема |
Вобщим беру мировую матрицу, которая устанавливаеься при рисовании модели. Из этой матрицы извлекаю ключи вращения и перемещения. Записую в Х файл. Проблема с ключами вращения. Есть две модели - одна после записи в Х файл отображаеться нормально, другая с багами на экране при анимации. Потом меняю код (см.ниже)- одна становиться с багами во время анимации, а другая уже нормально анимируеться. Сохраняю иерархию и анимацию фреймов (без весов вершин) в .Х файл. Пытаюсь сохранять ключил позиции и ротации фукнциями : Код: D3DXQUATERNION Quat; D3DXQuaternionIdentity(&Quat); D3DXVECTOR3 vTr, vSc; D3DXMatrixDecompose(&vSc, &Quat , &vTr, &mRes); D3DXQuaternionNormalize(&Quat, &Quat); D3DXKEY_QUATERNION **pRot; //число ключей анимации ходьба D3DXKEY_VECTOR3 **pTran; //число ключей анимации ходьба pRot[NumberBone][NumberKey].Time =(float) nTime; pRot[NumberBone][NumberKey].Value =Quat; pTran[NumberBone][NumberKey].Time =(float) nTime; pTran[NumberBone][NumberKey].Value = vTr; KeyFrameSet->RegisterAnimationSRTKeys(); D3DXSaveMeshHierarchyToFile(); Когда в этом коде инвертирую кватернион одна модель нормально анимируеться потом при загрузке, вторая нет: Код: D3DXQUATERNION Quat; D3DXQuaternionIdentity(&Quat); D3DXVECTOR3 vTr, vSc; D3DXMatrixDecompose(&vSc, &Quat , &vTr, &mRes); D3DXQuaternionNormalize(&Quat, &Quat); D3DXQuaternionInverse(&Quat, &Quat); pRot[k1][nk].Time =(float) nTime; pRot[k1][nk].Value =Quat; Когда инвертирую саму мировую матрицу, а не кватернион, то первая модель с багами получаеться, вторая нормальная: Код: D3DXQUATERNION Quat; D3DXQuaternionIdentity(&Quat); D3DXVECTOR3 vTr, vSc; D3DXMatrixInverse(&mRes, NULL, &mRes); D3DXMatrixDecompose(&vSc, &Quat , &vTr, &mRes); D3DXQuaternionNormalize(&Quat, &Quat); pRot[k1][nk].Time =(float) nTime; pRot[k1][nk].Value =Quat; В чем тут может быть проблема? Кто то с этими вещами рабтал вобще? |
Автор: | MagicWolf [ 11 мар 2013 08:57 ] |
Заголовок сообщения: | Re: Сохранение ключей вращения - проблема |
Не совсем понял начальные условия. Вы делаете типа редактора для создания анимационных моделей? |
Автор: | kurlyak [ 12 мар 2013 04:52 ] |
Заголовок сообщения: | Re: Сохранение ключей вращения - проблема |
Нет, я беру готовую модель, то все ее части- готовые, загружаю из файла игры. Так же все есть готовые позиции модели и есть углы поворотов для каждой части модели. Я сначала складую иерархию костей-фреймов (если помните предыдущий топик мой), потом беру для каждого фрейма его позицию и поворот, и это все записую в файл. Но дело в том, что позиция просто записываеться в ключ транстяции в Х файл. А угол поворота должен быть в виде кватерниона (потому что Х формат понимает только кватернионы) - а из файла я извлекаю углы (перевожу в радианы потом). То есть я беру матрицу единичную, поворачиваю ее на X,Y,Z которые у модели (ее частей то есть) то есть углы я извлек из файла уровня, затем делаю DecomposeMatrix() этой матрице вращения и получаю готовый кватернион (DecomposeMatrix возвращает кватернион). Но вот беда в том, что что бы сохранить одну модель нормально- надо перед извлечением кватерниона инвертировать матрицу вращения, а что бы другую модель сохранить нормально- надо кватернион инвертировать а не матрицу поворота. Мне надо универсальный код, что бы сохранял обе модели без моего участия. Я пишу код, который сохраняет модели в формате Х -а сами модели готовые со всеми данными я беру из файла уровня игры Томб Райдер (если слышали). Если конкретно вот мой код- я перевожу его из ОГЛ в ДиректХ. Насколько я знаю в ОГЛ glRotate вращает в градусах, поэтому я все градусы перевожу в радианы. Код: //проходим в цикле все меши
for(UINT k1 = 0; k1< Level->Moveables[w].NumMeshes; k1++) { ID3DXMatrixStack * pMatrixStack; D3DXCreateMatrixStack( 0, &pMatrixStack ); pMatrixStack->LoadIdentity( ); //если это корневой мешь- задаем абсолютную позицию if(k1 == 0) { pMatrixStack->TranslateLocal((float)ItemAnimX, (float)ItemAnimY, (float)ItemAnimZ); } //берем загруженные из файла ключи трансляции и создаем матрицу перемещения pMatrixStack->TranslateLocal( vTransl[k1].x, vTransl[k1].y, vTransl[k1].z); //берем загруженные из файла ключи вращения if (FrameRotationY[k1]) { pMatrixStack->RotateAxisLocal(&(D3DXVECTOR3(0, 1, 0)),D3DXToRadian((float) FrameRotationY[k1])); //glRotated(FrameRotationY[i], 0, 1, 0); } if (FrameRotationX[k1]) { pMatrixStack->RotateAxisLocal(&(D3DXVECTOR3(1, 0, 0)),D3DXToRadian((float) FrameRotationX[k1])); //glRotated(FrameRotationX[i], 1, 0, 0); } if (FrameRotationZ[k1]) { pMatrixStack->RotateAxisLocal(&(D3DXVECTOR3(0, 0, 1)),D3DXToRadian((float) FrameRotationZ[k1])); //glRotated(FrameRotationZ[i], 0, 0, 1); } D3DXMATRIX mRes; D3DXMatrixIdentity(&mRes); //получаем матрицу из стека матриц mRes = *pMatrixStack->GetTop(); //извлекаем ключи перемещения и вращения D3DXQUATERNION Quat, Quat1; D3DXVECTOR3 vTr, vTr1, vSc; D3DXMatrixDecompose(&vSc, &Quat , &vTr, &mRes); D3DXQuaternionNormalize(&Quat, &Quat); //заносим значения ключей pRot[k1][nk].Time =(float) nTime; pRot[k1][nk].Value =Quat; pTran[k1][nk].Time =(float) nTime; pTran[k1][nk].Value = vTr; } //переходим к новому ключу анимации nTime += 200; .............................................. //все данные записываем в Х файл for(UINT nb=0; nb<nNumFrame; nb++) { char szBuff[256]; sprintf_s(szBuff, 256, "Frame_%d", nb); KeyFrameSet->RegisterAnimationSRTKeys(szBuff,0, nNumKey, nNumKey, 0, pRot[nb], pTran[nb], &dwIndx ); } AnimContr->RegisterAnimationSet(KeyFrameSet); D3DXSaveMeshHierarchyToFile("Model.x", D3DXF_FILEFORMAT_TEXT|D3DXF_FILESAVE_TOFILE,mRootFrame, AnimContr, NULL); |
Автор: | MagicWolf [ 12 мар 2013 10:31 ] |
Заголовок сообщения: | Re: Сохранение ключей вращения - проблема |
Все равно извени не совсем понял. Т.е. берешь несколько моделей, анимируешь их и каждый шаг анимации тебе надо записать в файл? А модели как разносишь друг от друга или каждую можель в свой файл? |
Автор: | kurlyak [ 16 мар 2013 11:24 ] |
Заголовок сообщения: | Re: Сохранение ключей вращения - проблема |
Значит я беру сначала пробую сохранять одну модель, а потом вторую. Не вместе сохраняю. Я сначала сохранил одну модель, потом что бы проверить свой этот типа экспортер- пробую сохранить другую модель, пробую мой экспортер этот универсально подойдет к любой модели или только к какой- то уникальной. Так вот- беру одну модель сохраняю, нормально. Вторая с глюками небольшими сохраняеться после первой модели. И я от заметил- что беру мировую матрицу (она исп. при отрисовке модели), извлекаю из нее ключи вращения (кватернионы) и перемещения и записую в Х файл. Так вот я заметил что когда сохраняю первую модель все нормально- но надо инвертировать кватернион. Когда сохраняю вторую модель (тоже инвертирую кватернион)- глюки при сохранении модели. Я что бы избежать клюков при сохранении модели второй не инвертирую кватернион, а саму эту мировую матрицу из которой кватернион извлекаю. После того как инвертировал мировую матрицу а не извлеченный из нее кватернион- вторая модель сохраняеться нормально без глюков. Но первая уже сохраняеться с глюками (когда инвертирую матрицу а не кватернион). То есть для первой модели что бы ее сохранить правильно надо инвертировать кватернион который извлекаю из мировой матрицы, а что бы нормально сохранить вторую модель- надо код поменять- инвертировать не кватернион, а саму ммровую матрицу. Мне надо написать какой- то универсальный код, что бы подходил под обе модели, что бы по очереди каждую я сохранял, и код Си++ не менял для каждой модели у себя в программе. Если еще что не ясно у меня- спрашивайте. |
Автор: | kurlyak [ 17 мар 2013 13:28 ] |
Заголовок сообщения: | Re: Сохранение ключей вращения - проблема |
И еще хотел добавить (тема сложноватая), что когда я в своем экспортере беру эту мировую матрицу и просто вывожу модели на экран- все безупречно, все модели рисуються правильно. Но когда я беру эту матрицу мировую и извлекаю из нее кватернионы и трансляцию- то не все модели рисуються правильно, некоторые криво. Так же из моих наблюдений я заметил, что ключи трансляции правильно размещают все меши моделей (меши из которых состоят модели) в пространстве- значит дело не в трансляции. А вот кватернионы, и ключи перемещения- с глюками извлекаються из мировой матрицы. Вот я приведу пример где глюки. Пример из сохраненного глючного Х файла модели - анимация левой задней ноги. В Х файлах кватернионы храняться в старом виде w,x,y,z. Первый раздел AnimationKey это ключи вращения, кватернионы, второй AnimationKey это ключи трансляции. Что тут не правильно в первом AnimationKey: Animation { AnimationKey { 0; 11; 0;4;0.687315,0.726359,0.000000,-0.000000;;, 960;4;0.667000,0.745058,0.000000,-0.000000;;, 1920;4;0.901349,-0.433094,0.000000,0.000000;;, 2880;4;0.912962,-0.408044,0.000000,0.000000;;, 3840;4;0.912962,-0.408044,0.000000,0.000000;;, 4800;4;0.959572,0.281465,0.000000,0.000000;;, 5760;4;0.887640,0.460539,0.000000,0.000000;;, 6720;4;0.857729,0.514103,0.000000,0.000000;;, 7680;4;0.829761,0.558119,0.000000,0.000000;;, 8640;4;0.767139,0.641481,0.000000,0.000000;;, 9600;4;0.702755,0.711432,0.000000,-0.000000;;; } AnimationKey { 2; 11; 0;3;0.000000,-90.000000,3.000000;;, 960;3;0.000000,-90.000000,3.000000;;, 1920;3;0.000000,-90.000000,3.000000;;, 2880;3;0.000000,-90.000000,3.000000;;, 3840;3;0.000000,-90.000000,3.000000;;, 4800;3;0.000000,-90.000000,3.000000;;, 5760;3;0.000000,-90.000000,3.000000;;, 6720;3;0.000000,-90.000000,3.000000;;, 7680;3;0.000000,-90.000000,3.000000;;, 8640;3;0.000000,-90.000000,3.000000;;, 9600;3;0.000000,-90.000000,3.000000;;; } { Frame_22 } } Не правильные третий, четверный и пятый ключи потому что x кватерниона идет со знаком "-": 1920;4;0.901349,-0.433094,0.000000,0.000000;;, 2880;4;0.912962,-0.408044,0.000000,0.000000;;, 3840;4;0.912962,-0.408044,0.000000,0.000000;;, Я убераю этот "-" редактирую Х файл- и моделька нормально воспроизводиться - левая задняя нога нормально анимируеться. Если "-" не убераю, оставляю Х файл как есть- то глюки в модельке при анимации. Откуда может появляться этот знак "-"? |
Автор: | MagicWolf [ 18 мар 2013 12:59 ] |
Заголовок сообщения: | Re: Сохранение ключей вращения - проблема |
Попробуй за один раз экспортировать только одну модель. |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа [ Летнее время ] |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |