Russian Qt Forum

Программирование => Общий => Тема начата: _OLEGator_ от Сентябрь 03, 2009, 18:27



Название: Отображение 3ds файлов в OpenGL
Отправлено: _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, добавляя вектор.

Если у объекта есть все эти трансформации, то так не получается нужного результата...


Название: Re: Отображение 3ds файлов в OpenGL
Отправлено: Igors от Сентябрь 03, 2009, 20:56
Как правильно - не знаю, но что неправильно - вижу  :) Операции вращения/масштаба всегда работают относительно какого-то центра (точки). Например, для вращения надо:

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

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

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

Все эти операции линейны и могут быть собраны в 1 матрицу


Название: Re: Отображение 3ds файлов в OpenGL
Отправлено: _OLEGator_ от Сентябрь 03, 2009, 21:30
Да, странно что я пропустил - действительно отнимаю TRACKPIVOT, а прибавить забыл, но это решает часть проблемы - некорректный перенос, но у некоторых объектов происходит некорректный поворот.

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

Знаю что могут быть собраны в одну матрицу, в этом проблемы нету, когда будет верная последовательность преобразований :)


Название: Re: Отображение 3ds файлов в OpenGL
Отправлено: Igors от Сентябрь 03, 2009, 21:46
Да, странно что я пропустил - действительно отнимаю TRACKPIVOT, а прибавить забыл, но это решает часть проблемы - некорректный перенос, но у некоторых объектов происходит некорректный поворот.
Если "исправленному верить" (5*) то Вам нужно поместить TRACKSCALE предпоследним, перед финальным TRACKPOS и быть уверенным где центр TRACKSCALE.

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


Название: Re: Отображение 3ds файлов в OpenGL
Отправлено: _OLEGator_ от Сентябрь 03, 2009, 22:37
Да, именно так завтра и сделаю ))
По результатам будем думать куда копать дальше ;)