Render.ru

Экспорт анимации

Олег Гомозов 92913

Пользователь сайта
Рейтинг
2
#1
Здравствуйте. Я пишу скрипт для экспорта анимации в готовый формат, основанный на матрицах преобразования directX, и столкнулся с такой проблемой: при получении матрици преобразования объекта сцены в максе через myNode.transform перемещение объекта после экспорта направленно не правильно, т.к. направление осей координат в максе и directX азличаеться ( XYрZ в максе соответствует XZY в D3D). После гугления и курения уроков попробывал умножить матрицу преобразования ( дописав последний столбец ) на такую
Код:
1 0 0 0 0 
0 0 0 1 0
0 1 0 0 0
0 0 0 0 1
как предлагалось сделать в одном из уроков. По моим прикидкам "на листочке" после умножения на такую матриц должно получиться следующее
Код:
a11 a12 a13 0              
a21 a22 a23 0   =>    
a31 a32 a33 0           
a41 a42 a43 1           

a11 a13 a12 0
a21 a23 a22 0
a31 a33 a32 0
a31 a33 a32 0
a41 a43 a42 1
т.е. второй и третий столбец меняются местами. После преобразования таким образом моей матрици анимация проигрываеться нормально за исключением одного: объект "выворачиваеться наизнанку", при этом все остальные преобразования происходят нормально.
Буду очень благодарен если кто-нибудь подскажет мне в чем я допустил ошибку или как мне лучше преобразовать исходную матрицу.
 

Savin Denis

Модератор форума
Команда форума
Рейтинг
138
#2
Не нужно умножать матрицу, просто поменяй местами значения Y<>Z в позиции и домнож на -1.
 

Олег Гомозов 92913

Пользователь сайта
Рейтинг
2
#5
Пока прикреплял картинки ты уже успел ответить)
Немного не понял что нужно умножать на -1, всю матрицу или только последние два столбца?
 

Savin Denis

Модератор форума
Команда форума
Рейтинг
138
#6
Где в моем сообщении ты увидел хоть слово о столбцах ?
Речь об значении позиции одной из осей которые меняешь местами Z или Y, должна быть инвертирована, которой не не помню )
Думаю разберешься.
 

Chebu

Знаток
Рейтинг
59
#8
Олег Гомозов
из матрицы в первом посте уберите третий столбец.

Речь об значении позиции одной из осей которые меняешь местами Z или Y, должна быть инвертирована, которой не не помню )
x (dx) = x (max)
z (dx) = -y (max)
y (dx) = z (max)
 

Олег Гомозов 92913

Пользователь сайта
Рейтинг
2
#9
из матрицы в первом посте уберите третий столбец.
Ошибся когда сюда перепечатывал, в скрипте правильная стоит.
x (dx) = x (max)
z (dx) = -y (max)
y (dx) = z (max)
Инвертировал ось. Искажение исправилось, но преобразования стали неправильно переноситься. Возможно я где то накосячил при записи в файл. В любом случае всем спасибо.
 

Savin Denis

Модератор форума
Команда форума
Рейтинг
138
#10
Так с отрицательными осями это я тебя запутал, это для майки нужно.

Здесь просто меняешь местами в матрице все компоненты z<>y:
Код:
	  src = object.transform
	  trans = matrix3 1
	  -- prepare row1
	  trans.row1.x = src.row1.x
	  trans.row1.y = src.row1.z
	  trans.row1.z = src.row1.y
	  -- prepare row2
	  trans.row2.x = src.row3.x
	  trans.row2.y = src.row3.z
	  trans.row2.z = src.row3.y
	  -- prepare row3
	  trans.row3.x = src.row2.x
	  trans.row3.y = src.row2.z
	  trans.row3.z = src.row2.y
	  -- prepare row4
	  trans.row4.x = src.row4.x
	  trans.row4.y = src.row4.z
	  trans.row4.z = src.row4.y
При экспорте вершин и нормалей соответственно также меняем Z<>Y
 

Chebu

Знаток
Рейтинг
59
#11
Так с отрицательными осями это я тебя запутал, это для майки нужно.
зависит от системы координат (праворукая/леворукая), если в D3D использовать такую же, как в максе - то "-" не нужен, тогда просто y,z поменять
 

Олег Гомозов 92913

Пользователь сайта
Рейтинг
2
#12
Продолжаю бороться с движком.)
Здесь просто меняешь местами в матрице все компоненты z<>y:
По сути это тоже самое что я и делал в самом начале(см. первый пост 2ая, 3я матрицы), только делал я это во время записи. Использовал твой скрипт и, как ни удивительно, все получилось правильно. Видимо это очень сильное колдунство)) Спасибо.
зависит от системы координат
Сначала не обратил на это внимание. Система такая же как и в максе.

Тепереь возник новый вопрос. myNode.transform дает матрицу преобразования относительно пивота объекта, но движек воспринимает для группы объектов только трансформации относительно одной точки. Как можно изменить исходную матрицу под преобразования относительно какой либо точки?
 

Savin Denis

Модератор форума
Команда форума
Рейтинг
138
#13
Одно дело пытаться и не разобраться, другое лень заглянуть в справочник или попытка в наглую решить задачу чужими руками.
Так что если это деловое предложение милости просим в личку.


PS
Скоро прайс вывешу за перемножение двух матриц.
 

Chebu

Знаток
Рейтинг
59
#17
Тепереь возник новый вопрос. myNode.transform дает матрицу преобразования относительно пивота объекта, но движек воспринимает для группы объектов только трансформации относительно одной точки. Как можно изменить исходную матрицу под преобразования относительно какой либо точки?
трансформация нода относительно точки = мировая трансформация нода * инвертированная матрица точки
 
Сверху