| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Мультимедия, OpenGL/DirectX > Ориентация объектов при импорте 3ds-файла |
| Автор: gorby 24.4.2009, 09:43 |
| Для импорта 3ds-файлов я использую библиотеку 3DSFTK 3DSFTK.H - 3D Studio File Toolkit for Release 3 library header в структуре mesh3ds есть float3ds locmatrix[12]; /* Object orientation matrix */ Внимание вопрос. Как мне применить эту матрицу для точки(вертекса) меша? Я так понимаю, что мне нужно умножить единичный вектор на прямоугольную матрицу. |
| Автор: gorby 1.5.2009, 17:11 | ||
| На одном сайте http://www.gamedev.ru/articles/?id=40113&page=4 нашел пример кода
Применил этот фрагмент у себя в программе, но меши мои перемещаются совсем не так, как нужно. Неужели никто не использовал эту матрицу? |
| Автор: Rickert 1.10.2009, 07:11 |
| gorby, что-то вы не понимаете. Смысл таков. Есть матрица трансофрмации, которая как правило является матрицой 4х4, но один столбец фактически не нужен, поэтому там 12 необходимых реально элементов. Итак у нас матрица 4Х3 = всего 12 элементов. 1 0 0 - i 0 1 0 - j 0 0 1 - k 0 0 0 - pos Разбираем её геометрический смысл. i - абсцисса, j - ордината, k - аппликата, pos - позиция в системе родителя. Если не помните что такое абсцисса, ордината и аппликата, то расскажу: это три вектора, которые указывают направление осей координат x (i), y (j), z (k). Т.е. если вы нарисуете эти вектора, то увидите что это класическая xyz система (в нашем примере). pos - это положение точки отсчёта данной системы в системе координат родителя. Теперь если вы умножете свой вектор на эту матрицу, то с геометрической точки зрения вы переведёте его из глобальной системы координат в соответствующую этой матрице. Теперь посмотрите на свой код. Вы используете значения массива Local в интервале от 0 до 8. А как же оставшиеся 3 значения, которые отвечают за позицию? + у вас написано что там идёт смена координат местами - есть вероятность что вы там что-нибудь напутали. Я советую делать так: нарисовать на бумаге простой пример для самого себя, просчитать и получить верный ответ, а потом смоделировать его используя написанные вами функции - таким образом вы сможете отловить ошибку. |
| Автор: gorby 19.10.2009, 16:51 |
| Rickert, спасибо за подсказку. Я сейчас же проверю как это работает. |
| Автор: gorby 19.10.2009, 18:08 | ||||
Перепробовал кучу вариантов. Пока не получилось.
Это функция преобразования координат точки
|
| Автор: Rickert 20.10.2009, 01:35 |
| gorby, малова-то кода как-то у вас. Что за параметры "l, m, n"? Объясните логику этого умножения: что здесь происходит? |
| Автор: gorby 20.10.2009, 11:25 | ||
| Rickert, спасибо Вам за внимание. l,m,n -это направляющие косинусы вектора. Они нормализованы и определяют ориентацию вектора в пространстве. Это Углы наклона между вектором и соответственно осью X,Y,Z. А преобразование координат CPoint3d::mod_coord_ma я использую уже более 15 лет. Взял из справочника по высшей математике. СК-Ситема Координат. Логика CPoint3d::mod_coord_ma такая. задана точка в местной СК CPoint3d 3-мя координатами X,Y,Z в местной системе координат. На вход ф-ци подается местная система координат. Эта местная система координат задана в абсолютной СК началом координат и 3-мя векторами (CPoint3d* p0, CVector* cx, CVector* cy, CVector* cz). Вычисляются координаты точки уже в абсолютной СК. Rickert, я буду очень благодарен, если Вы дадите Ваш код умножения ветора (точки x,y,z) на матрицу. Итак у нас матрица 4Х3 = всего 12 элементов. 1 0 0 - i 0 1 0 - j 0 0 1 - k 0 0 0 - pos Я перебрал уже разные варианты. Мне кажется, что у фирмы Autodesk своя логика непонятная мне пока. 1. менял местами оси y,z 2. менял знак для pos - позиция в системе родителя 3. и пробовал делать преобразование координат точки вместо приведеной CPoint3d::mod_coord_ma так
|
| Автор: gorby 20.10.2009, 13:11 |
| Нашел описание файла 3ds - http://algolist.manual.ru/graphics/3dfaq/articles/75.php Блок: CHUNK_TRMATRIX Данные: содержит матрицу перевода объекта в некое абстрактное начальное состояние; в то, что было первоначально смоделировано. Требуется для корректного отображения анимации: дело в том, что все объекты в файле хранятся по состоянию на нулевой кадр, а анимация записана по отношению к "начальным" моделям. Т.е. при отображений нулевого кадра эта матрица не нужна, а при отображении всего набора кадров надо будет сначала перевести объекты в "начальное" состояние с помощью этой самой матрицы перевода и применять все преобразования (перемещения, повороты, etc) именно к "начальным" объектам. Формат: float rotmatrix[3][3]; // матрица поворота vector offset; // смещение начального объекта Для перевода объекта в "начальное" состояние надо сначала сдвинуть его назад, то есть на вектор -offset (НЕ на offset), а потом применить матрицу поворота rotmatr. Матрица записана построчно. Не забудьте - в ней y и z тоже везде обменены местами! Еще раз спрашиваю. Как применить матрицу поворота rotmatr к точке(x,y,z)? |
| Автор: Rickert 20.10.2009, 16:27 | ||
| gorby, я не хочу вас сейчас запутать ещё больше и поэтому не стану спорить: почему y и z переставлены местами - для меня остаётся загадкой. Лучше приведу вам статью с gamedev.ru - http://www.gamedev.ru/code/articles/?id=4273 Отмечу сразу: в этой статье есть ВСЯ информация которая нужна для реализации скелетной анимации, в ней каждая строчка не просто так, там нельзя пропускать предложений и читать невдумчиво. Говорю так, потому что сам перечитывал её по невнимательности В частности, отвечая на ваш вопрос Цитирую:
P.S. Сказать честно сейчас у меня все реализовано без матриц. Т.е. они у меня есть как входные данные, но я их преобразовываю в необходимые мне вектора и по ним совершаю все сдвиги вершин, потом их суммирую чтобы получить результат. Если хотите могу привести код и разъяснить. В ближайшее время буду делать рефакторинг кода и переходить на матрицы, потому что мой текущий самопальный метод затратнее по времени исполнения примерно в 16 раз. Зато свой велосЫпед, как же я их люблю |
| Автор: gorby 22.10.2009, 17:07 |
| Rickert, спасибо за ссылку. Rickert, если Вы использовали в своих программах файл 3ds и матрицу mesh->locmatrix, то я буду очень благодарен, если Вы приведете свой код, преобразования координат точки(Как применить матрицу поворота rotmatr к точке). |