Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Программирование игр, графики и искусственного интеллекта > Кватерионы и камера в DirectX


Автор: ZC1989 21.8.2006, 15:10
Подскажите, как пользоваться кватерионами!? есть функции работы с кватерионами... перевод из мартицы в них и обратно, но как их использовать?! приведите если можно парачку примеров, а то я принцип-то понял работы, но как использовать их вместо матрицы напонятно  smile пишу на Visual C++

Автор: NikotiN 21.8.2006, 18:19
ну в инете посмотри про кватернионы, углы эйлера и т.д. имхо, с матрицами привычнее ))

Автор: ZC1989 21.8.2006, 21:57
NikotiN, я смотрел про это всё статьи... с примерами функций обработки и вего того... углы эйлера мне не подходят... камеру надо вращать по сфере, а родные матрицы почему-то у меня этого не дают... 

я въехал в принцип работы... но вот нормального примера как эти каватерионы использовать для вращения камеры нигда не смог найти... smile 

Автор: mr.DUDA 22.8.2006, 09:32
Кватернион задаёт относительное трёхмерное вращение вокруг любой оси на любой угол. Следовательно, если есть точка с заданным положением относительно центра вращения, её текущее положение также может быть выражено кватернионом. Итого, чтобы повернуть точку из текущего положения в другое положение, имея кватернион вращения Qrot нужно:

1) по нормализованному вектору положения точки определить кватернион тек. положения точки Q
2) умножить Q на кватернион вращения Qrot - получим кватернион итогового углового положения точки Qres
3) зная расстояние от центра вращения до точки (оно не менялось), умножить его на Qres - получим итоговое положение точки после поворота

Вроде так.

З.Ы. хорошие туториалы по кватернионам лежат на http://www.ogre3d.org в разделе Wiki

Автор: ZC1989 22.8.2006, 09:55
mr.DUDA, Пасиба! я начинаю понимать смысл работы... но последний вопрос: мне надо будет полученный кватерион перевести в матрицу и просто подставить значения? (просто вот я чего понять-то не могу, когда я вращаю матрицу, она не вращается на все 360)

Автор: NikotiN 22.8.2006, 20:23
2 ZC1989
//родные матрицы почему-то у меня этого не дают
имхо, это уже твоя реализация. 
кватернионы, матрицы, да хоть 3 переменные X,Y,Z - это всего лишь представление данных, на сам алгоритм вращения не влияют, хотя реализация везде разная

Автор: ZC1989 22.8.2006, 22:22
NikotiN,  smile но тогда я перестаю ваще понимать как устроем этот безумный мир... если родная матрица даёт удаление при вращении, это мои ошибки?!?!!? раде Бога, покажите как тогда сделать что бы этого небыло??!!? я делаю всё как в учебниках... в большинстве их всё было одинаково, но пробовал все варианты и тот же баг... smile 

Автор: mr.DUDA 23.8.2006, 08:56
Цитата(ZC1989 @  22.8.2006,  22:22 Найти цитируемый пост)
NikotiN,   но тогда я перестаю ваще понимать как устроем этот безумный мир... если родная матрица даёт удаление при вращении, это мои ошибки?!?!!? раде Бога, покажите как тогда сделать что бы этого небыло??!!? я делаю всё как в учебниках... в большинстве их всё было одинаково, но пробовал все варианты и тот же баг...  

Значит неправильно выполняется поворот, вместо поворота - идёт translate.

Автор: ZC1989 23.8.2006, 10:18
вот как это описывалось, вращаю камеру...
Код

D3DXMATRIXA16 matWorld;
  FLOAT fAngle = 0 * (2.0f * D3DX_PI) / 2000.0f;

  // Мировая матрица
  D3DXMatrixIdentity(&matWorld);
  D3DXMatrixRotationY(&matWorld, fAngle); // D3DXMatrixRotationY D3DXMatrixRotationZ
pDevice -> SetTransform(D3DTS_WORLD, &matWorld);

D3DXMATRIXA16 matView;
  D3DXVECTOR3 vEyePt(MouseX, MouseY, PosY); // Глаз наблюдателя
  D3DXVECTOR3 vLookatPt(PosX, PosZ, PosW); // Точка цели камеры
  D3DXVECTOR3 vUpVec(0.0f, 1.0f, 0.0f); // Верх камеры

D3DXMatrixLookAtLH(&matView, &vEyePt, &vLookatPt, &vUpVec);
    pDevice -> SetTransform(D3DTS_VIEW, &matView);

// Проекционная матрица
    D3DXMATRIXA16 matProj;
    D3DXMatrixPerspectiveFovLH(&matProj, D3DX_PI/4, 1.0f, 1.0f, 100.0f);
    pDevice->SetTransform(D3DTS_PROJECTION, &matProj );

...вот код, которым я делаю то ли вращение, то ли трансфер... и ни одно из изменяемых не даёт вращения, точка цели каемры двигается, но с глазом наблюдателя проблема... smile 

Автор: ZC1989 23.8.2006, 22:22
разобрался сам во всём.. спасибо за внимание

Автор: Able 23.8.2006, 22:28
Чего было, как разобрался делись!  smile 

Автор: ZC1989 23.8.2006, 23:31
виной всему моё незнание Дирекста и неправельные объяснения в некоторых статьях... вобщем я не вращал... 
Цитата

D3DXMATRIXA16 matView;
  D3DXVECTOR3 vEyePt(MouseX, MouseY, PosY); // Глаз наблюдателя
  D3DXVECTOR3 vLookatPt(PosX, PosZ, PosW); // Точка цели камеры
  D3DXVECTOR3 vUpVec(0.0f, 1.0f, 0.0f); // Верх камеры

тут я вращение питался обеспечить через MouseX и MouseY, а надо через 
Цитата

D3DXMATRIXA16 matWorld, matWorldX, matWorldY, matWorldZ;
  D3DXMatrixRotationY(&matWorldY, ...);
  D3DXMatrixRotationX(&matWorldX, ...);
  D3DXMatrixRotationZ(&matWorldZ, ...);
matWorld = (matWorldX * matWorldY) * matWorldZ; // без этого перемножения вращаться будет ток по одной из осей (или наклоняться)
pDevice -> SetTransform(D3DTS_WORLD, &matWorld);


пока под кватерионы я не переводил,  но скоро буду этим заниматься... а щас пляшу Джигу... наконец-то можно посмотреть объект со всех сторон smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)