Название: Отображение 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 Да, именно так завтра и сделаю ))
По результатам будем думать куда копать дальше ;) |