PMG

Форумы по созданию игр
Текущее время: 11 ноя 2024 23:42

Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 7 ] 
Автор Сообщение
 Заголовок сообщения: Сохранение ключей вращения - проблема
СообщениеДобавлено: 09 мар 2013 14:49 
Не в сети
Любитель

Зарегистрирован: 19 сен 2008 14:48
Сообщения: 44
Вобщим беру мировую матрицу, которая устанавливаеься при рисовании модели. Из этой матрицы извлекаю ключи вращения и перемещения. Записую в Х файл. Проблема с ключами вращения. Есть две модели - одна после записи в Х файл отображаеться нормально, другая с багами на экране при анимации. Потом меняю код (см.ниже)- одна становиться с багами во время анимации, а другая уже нормально анимируеться.

Сохраняю иерархию и анимацию фреймов (без весов вершин) в .Х файл. Пытаюсь сохранять ключил позиции и ротации фукнциями :

Код:
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;


В чем тут может быть проблема? Кто то с этими вещами рабтал вобще?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сохранение ключей вращения - проблема
СообщениеДобавлено: 11 мар 2013 08:57 
Не в сети
Гуру
Аватара пользователя

Зарегистрирован: 03 авг 2004 10:37
Сообщения: 2694
Не совсем понял начальные условия. Вы делаете типа редактора для создания анимационных моделей?

_________________
С уважением, Сергей


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сохранение ключей вращения - проблема
СообщениеДобавлено: 12 мар 2013 04:52 
Не в сети
Любитель

Зарегистрирован: 19 сен 2008 14:48
Сообщения: 44
Нет, я беру готовую модель, то все ее части- готовые, загружаю из файла игры. Так же все есть готовые позиции модели и есть углы поворотов для каждой части модели. Я сначала складую иерархию костей-фреймов (если помните предыдущий топик мой), потом беру для каждого фрейма его позицию и поворот, и это все записую в файл. Но дело в том, что позиция просто записываеться в ключ транстяции в Х файл. А угол поворота должен быть в виде кватерниона (потому что Х формат понимает только кватернионы) - а из файла я извлекаю углы (перевожу в радианы потом). То есть я беру матрицу единичную, поворачиваю ее на 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);

            


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сохранение ключей вращения - проблема
СообщениеДобавлено: 12 мар 2013 10:31 
Не в сети
Гуру
Аватара пользователя

Зарегистрирован: 03 авг 2004 10:37
Сообщения: 2694
Все равно извени не совсем понял. Т.е. берешь несколько моделей, анимируешь их и каждый шаг анимации тебе надо записать в файл? А модели как разносишь друг от друга или каждую можель в свой файл?

_________________
С уважением, Сергей


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сохранение ключей вращения - проблема
СообщениеДобавлено: 16 мар 2013 11:24 
Не в сети
Любитель

Зарегистрирован: 19 сен 2008 14:48
Сообщения: 44
Значит я беру сначала пробую сохранять одну модель, а потом вторую. Не вместе сохраняю. Я сначала сохранил одну модель, потом что бы проверить свой этот типа экспортер- пробую сохранить другую модель, пробую мой экспортер этот универсально подойдет к любой модели или только к какой- то уникальной. Так вот- беру одну модель сохраняю, нормально. Вторая с глюками небольшими сохраняеться после первой модели.

И я от заметил- что беру мировую матрицу (она исп. при отрисовке модели), извлекаю из нее ключи вращения (кватернионы) и перемещения и записую в Х файл. Так вот я заметил что когда сохраняю первую модель все нормально- но надо инвертировать кватернион. Когда сохраняю вторую модель (тоже инвертирую кватернион)- глюки при сохранении модели. Я что бы избежать клюков при сохранении модели второй не инвертирую кватернион, а саму эту мировую матрицу из которой кватернион извлекаю. После того как инвертировал мировую матрицу а не извлеченный из нее кватернион- вторая модель сохраняеться нормально без глюков. Но первая уже сохраняеться с глюками (когда инвертирую матрицу а не кватернион).

То есть для первой модели что бы ее сохранить правильно надо инвертировать кватернион который извлекаю из мировой матрицы, а что бы нормально сохранить вторую модель- надо код поменять- инвертировать не кватернион, а саму ммровую матрицу.

Мне надо написать какой- то универсальный код, что бы подходил под обе модели, что бы по очереди каждую я сохранял, и код Си++ не менял для каждой модели у себя в программе.

Если еще что не ясно у меня- спрашивайте.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сохранение ключей вращения - проблема
СообщениеДобавлено: 17 мар 2013 13:28 
Не в сети
Любитель

Зарегистрирован: 19 сен 2008 14:48
Сообщения: 44
И еще хотел добавить (тема сложноватая), что когда я в своем экспортере беру эту мировую матрицу и просто вывожу модели на экран- все безупречно, все модели рисуються правильно. Но когда я беру эту матрицу мировую и извлекаю из нее кватернионы и трансляцию- то не все модели рисуються правильно, некоторые криво. Так же из моих наблюдений я заметил, что ключи трансляции правильно размещают все меши моделей (меши из которых состоят модели) в пространстве- значит дело не в трансляции. А вот кватернионы, и ключи перемещения- с глюками извлекаються из мировой матрицы.

Вот я приведу пример где глюки. Пример из сохраненного глючного Х файла модели - анимация левой задней ноги. В Х файлах кватернионы храняться в старом виде 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;;,

Я убераю этот "-" редактирую Х файл- и моделька нормально воспроизводиться - левая задняя нога нормально анимируеться. Если "-" не убераю, оставляю Х файл как есть- то глюки в модельке при анимации.

Откуда может появляться этот знак "-"?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сохранение ключей вращения - проблема
СообщениеДобавлено: 18 мар 2013 12:59 
Не в сети
Гуру
Аватара пользователя

Зарегистрирован: 03 авг 2004 10:37
Сообщения: 2694
Попробуй за один раз экспортировать только одну модель.

_________________
С уважением, Сергей


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 7 ] 

Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения

Найти:
Перейти:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB