Russian Qt Forum
Июнь 16, 2024, 02:12 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Отображение 3ds файлов в OpenGL  (Прочитано 4523 раз)
_OLEGator_
Гость
« : Сентябрь 03, 2009, 18:27 »

Привет всем.
Возникла проблема с применением матриц трансформации 3ds файлов в OpenGL. Как и в какой последовательности они применяются?

Грузятся несколько видов матриц:

[TRMATRIX  = 0x4160] - матрица перевода объекта в некое абстрактное начальное состояние
float rotmatrix[3][3]; // матрица поворота
float x,z,y;         // смещение начального объекта

И матрицы преобразований в ключевых кадрах [KEYFRAMER = 0xB000]:

[TRACKPIVOT    = 0xB013] - Центр вращения
float x,z,y; // координаты центра вращения

[TRACKPOS      = 0xB020] - траектория объекта, заданная ключевыми значениями положения объекта
float x,z,y;         // положение объекта

[TRACKROTATE   = 0xB021] - траектория вращения объекта, заданная ключевыми значениями вектора направления оси вращения и угла поворота относительно этой оси
float angle;        // угол поворота (в радианах)
float x,z,y;     // ось вращения

[TRACKSCALE    = 0xB022] - "масштабирование" объекта
float x,z,y;     // коэффициент масштаба для каждой оси.

Так вот, сейчас применяю эти матрица последовательно к координатам:
1) Отнимаю смещение TRMATRIX для перевода объекта в начальное положение
2) Применяю матрицу поворота TRMATRIX (угол поворота a и вектор оси вращения (x, y, z)):
    x1 = x * (Cos a + x * x * (1 - Cos a)) + y * (x * y * (1 - Cos a) + z * Sin a) + z * (x * z * (1 - Cos a) - y * Sin a);
    y1 = x * (x * y * (1 - Cos a) - z * Sin a) + y * (Cos a + y * y * (1 - Cos a)) + z * (y * z * (1 - Cos a) + x * Sin a);
    z1 = x * (x * z * (1 - Cos a) + y * Sin a) + y * (y * z * (1 - Cos a) - x * Sin a) + z * (Cos a + z * z * (1 - Cos a));
3) Применяю матрицу масштабирования TRACKSCALE, путем умножения вектора на матрицу
4) Перевожу центр вращения в TRACKPIVOT (отнимаю)
5) Применяю матрицу поворота TRACKROTATE, аналогично 2)
5*) Прибавляю TRACKPIVOT
6) Применяю конечный перенос TRACKPOS, добавляя вектор.

Если у объекта есть все эти трансформации, то так не получается нужного результата...
« Последнее редактирование: Сентябрь 03, 2009, 21:31 от _OLEGator_ » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #1 : Сентябрь 03, 2009, 20:56 »

Как правильно - не знаю, но что неправильно - вижу  Улыбающийся Операции вращения/масштаба всегда работают относительно какого-то центра (точки). Например, для вращения надо:

- отнять TRACKPIVOT
- выполнить вращение (правильно ли у Вас оно (пере)писано - не знаю, я пользуюсь матрицей поворота)
- прибавить назад TRACKPIVOT

Так же для масштаба, но где здесь центр - не знаю, может это тоже  TRACKPIVOT а может и центр объекта. Разумная последовательность:

1) отнять смещение TRMATRIX и умножить на матрицу вращения TRMATRIX
2) выполнить вращение (см. выше)
3) выполнить масштаб
4) добавить TRACKPOS (это точно должно идти последним)

Все эти операции линейны и могут быть собраны в 1 матрицу
Записан
_OLEGator_
Гость
« Ответ #2 : Сентябрь 03, 2009, 21:30 »

Да, странно что я пропустил - действительно отнимаю TRACKPIVOT, а прибавить забыл, но это решает часть проблемы - некорректный перенос, но у некоторых объектов происходит некорректный поворот.

Может кто уже этим занимался и может предоставить 100% верное решение?

Знаю что могут быть собраны в одну матрицу, в этом проблемы нету, когда будет верная последовательность преобразований Улыбающийся
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Сентябрь 03, 2009, 21:46 »

Да, странно что я пропустил - действительно отнимаю TRACKPIVOT, а прибавить забыл, но это решает часть проблемы - некорректный перенос, но у некоторых объектов происходит некорректный поворот.
Если "исправленному верить" (5*) то Вам нужно поместить TRACKSCALE предпоследним, перед финальным TRACKPOS и быть уверенным где центр TRACKSCALE.

Может кто уже этим занимался и может предоставить 100% верное решение?
Становится грустно  Показает язык
Записан
_OLEGator_
Гость
« Ответ #4 : Сентябрь 03, 2009, 22:37 »

Да, именно так завтра и сделаю ))
По результатам будем думать куда копать дальше Подмигивающий
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.05 секунд. Запросов: 22.