![]() |
|
Модераторы: Rickert, Alexeis, BorisVorontsov |
![]()
|
|
| gorby |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 32 Регистрация: 27.3.2008 Где: Киев Репутация: нет Всего: нет |
Для импорта 3ds-файлов я использую библиотеку 3DSFTK
3DSFTK.H - 3D Studio File Toolkit for Release 3 library header в структуре mesh3ds есть float3ds locmatrix[12]; /* Object orientation matrix */ Внимание вопрос. Как мне применить эту матрицу для точки(вертекса) меша? Я так понимаю, что мне нужно умножить единичный вектор на прямоугольную матрицу. |
|||
|
||||
| gorby |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 32 Регистрация: 27.3.2008 Где: Киев Репутация: нет Всего: нет |
На одном сайте http://www.gamedev.ru/articles/?id=40113&page=4
нашел пример кода
Применил этот фрагмент у себя в программе, но меши мои перемещаются совсем не так, как нужно. Неужели никто не использовал эту матрицу? |
|||
|
||||
| Rickert |
|
|||
|
Ситхи не пройдут! ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3356 Регистрация: 11.7.2006 Где: Лакрима Репутация: 2 Всего: 52 |
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 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 32 Регистрация: 27.3.2008 Где: Киев Репутация: нет Всего: нет |
Rickert, спасибо за подсказку.
Я сейчас же проверю как это работает. |
|||
|
||||
| gorby |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 32 Регистрация: 27.3.2008 Где: Киев Репутация: нет Всего: нет |
Перепробовал кучу вариантов. Пока не получилось.
Это функция преобразования координат точки
|
||||
|
|||||
| Rickert |
|
|||
|
Ситхи не пройдут! ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3356 Регистрация: 11.7.2006 Где: Лакрима Репутация: 2 Всего: 52 |
gorby, малова-то кода как-то у вас. Что за параметры "l, m, n"? Объясните логику этого умножения: что здесь происходит?
-------------------- Ни что не внушает сна крепче, чем день приисполненный трудов! |
|||
|
||||
| gorby |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 32 Регистрация: 27.3.2008 Где: Киев Репутация: нет Всего: нет |
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 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 32 Регистрация: 27.3.2008 Где: Киев Репутация: нет Всего: нет |
Нашел описание файла 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 |
|
|||
|
Ситхи не пройдут! ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3356 Регистрация: 11.7.2006 Где: Лакрима Репутация: 2 Всего: 52 |
gorby, я не хочу вас сейчас запутать ещё больше и поэтому не стану спорить: почему y и z переставлены местами - для меня остаётся загадкой. Лучше приведу вам статью с gamedev.ru - http://www.gamedev.ru/code/articles/?id=4273
Отмечу сразу: в этой статье есть ВСЯ информация которая нужна для реализации скелетной анимации, в ней каждая строчка не просто так, там нельзя пропускать предложений и читать невдумчиво. Говорю так, потому что сам перечитывал её по невнимательности В частности, отвечая на ваш вопрос Цитирую:
P.S. Сказать честно сейчас у меня все реализовано без матриц. Т.е. они у меня есть как входные данные, но я их преобразовываю в необходимые мне вектора и по ним совершаю все сдвиги вершин, потом их суммирую чтобы получить результат. Если хотите могу привести код и разъяснить. В ближайшее время буду делать рефакторинг кода и переходить на матрицы, потому что мой текущий самопальный метод затратнее по времени исполнения примерно в 16 раз. Зато свой велосЫпед, как же я их люблю -------------------- Ни что не внушает сна крепче, чем день приисполненный трудов! |
|||
|
||||
| gorby |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 32 Регистрация: 27.3.2008 Где: Киев Репутация: нет Всего: нет |
Rickert, спасибо за ссылку.
Rickert, если Вы использовали в своих программах файл 3ds и матрицу mesh->locmatrix, то я буду очень благодарен, если Вы приведете свой код, преобразования координат точки(Как применить матрицу поворота rotmatr к точке). |
|||
|
||||
![]()
|
| Вы можете найти полезным что... | |
|
|
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Мультимедия, OpenGL/DirectX | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |