Модераторы: Rickert
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Кватерионы и камера в DirectX, использование кватерионов 
V
    Опции темы
ZC1989
Дата 21.8.2006, 15:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 468
Регистрация: 17.7.2006
Где: Нижний Новгород; Россия

Репутация: нет
Всего: 1



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


--------------------
озарение настанет позже, когда поймём больше... (Сo. Stigmata)
PM MAIL ICQ   Вверх
NikotiN
Дата 21.8.2006, 18:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 30.7.2006

Репутация: нет
Всего: нет



ну в инете посмотри про кватернионы, углы эйлера и т.д. имхо, с матрицами привычнее ))
PM MAIL   Вверх
ZC1989
Дата 21.8.2006, 21:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 468
Регистрация: 17.7.2006
Где: Нижний Новгород; Россия

Репутация: нет
Всего: 1



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

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


--------------------
озарение настанет позже, когда поймём больше... (Сo. Stigmata)
PM MAIL ICQ   Вверх
mr.DUDA
Дата 22.8.2006, 09:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 7
Всего: 232



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

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

Вроде так.

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


--------------------
user posted image
PM MAIL WWW   Вверх
ZC1989
Дата 22.8.2006, 09:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 468
Регистрация: 17.7.2006
Где: Нижний Новгород; Россия

Репутация: нет
Всего: 1



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


--------------------
озарение настанет позже, когда поймём больше... (Сo. Stigmata)
PM MAIL ICQ   Вверх
NikotiN
Дата 22.8.2006, 20:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 30.7.2006

Репутация: нет
Всего: нет



2 ZC1989
//родные матрицы почему-то у меня этого не дают
имхо, это уже твоя реализация. 
кватернионы, матрицы, да хоть 3 переменные X,Y,Z - это всего лишь представление данных, на сам алгоритм вращения не влияют, хотя реализация везде разная
PM MAIL   Вверх
ZC1989
Дата 22.8.2006, 22:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 468
Регистрация: 17.7.2006
Где: Нижний Новгород; Россия

Репутация: нет
Всего: 1



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


--------------------
озарение настанет позже, когда поймём больше... (Сo. Stigmata)
PM MAIL ICQ   Вверх
mr.DUDA
Дата 23.8.2006, 08:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 7
Всего: 232



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

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


--------------------
user posted image
PM MAIL WWW   Вверх
ZC1989
Дата 23.8.2006, 10:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 468
Регистрация: 17.7.2006
Где: Нижний Новгород; Россия

Репутация: нет
Всего: 1



вот как это описывалось, вращаю камеру...
Код

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 


--------------------
озарение настанет позже, когда поймём больше... (Сo. Stigmata)
PM MAIL ICQ   Вверх
ZC1989
Дата 23.8.2006, 22:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 468
Регистрация: 17.7.2006
Где: Нижний Новгород; Россия

Репутация: нет
Всего: 1



разобрался сам во всём.. спасибо за внимание


--------------------
озарение настанет позже, когда поймём больше... (Сo. Stigmata)
PM MAIL ICQ   Вверх
Able
Дата 23.8.2006, 22:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 82
Регистрация: 13.6.2006
Где: Тюмень

Репутация: 1
Всего: 2



Чего было, как разобрался делись!  smile 
PM MAIL WWW ICQ   Вверх
ZC1989
Дата 23.8.2006, 23:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 468
Регистрация: 17.7.2006
Где: Нижний Новгород; Россия

Репутация: нет
Всего: 1



виной всему моё незнание Дирекста и неправельные объяснения в некоторых статьях... вобщем я не вращал... 
Цитата

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 


--------------------
озарение настанет позже, когда поймём больше... (Сo. Stigmata)
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Программирование игр, графики и искуственного интеллекта"
Rickert

НА ЗЛОБУ ДНЯ: Дорогие посетители, прошу обратить внимание что новые темы касающиеся новых вопросов создаются кнопкой "Новая тема" а не "Ответить"! Любые оффтопиковые вопросы, заданные в текущих тематических темах будут удалены а их авторы, при рецедиве, забанены.

  • Литературу, связанную с программированием графики, обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы связанные с программированием графики и мультимедии на языках С++ и Delphi
  • Вопросы по реализации алгоритмов рассматриваются здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rickert.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Программирование игр, графики и искусственного интеллекта | Следующая тема »


 




[ Время генерации скрипта: 0.0508 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.