Рабочий процесс:
1. imported targetObj (cube, poly, *.obj)
2. on-scene sceneObj (cube, poly, later point helper)
3. sceneObj.rotation = targetObj.rotation (the two cubes need to overlap)
4. sceneObj.pos = targetObj.pos
Проблема:
Невозможно установить правильную ось/поворот для sceneObj от нормали к лицу targetObj. Трансформационный нооберизм.
Подробности:
Я работаю над простым плагином импорта, который импортирует пользовательскую сетку из другого приложения в 3ds Max. В сцене 3ds Max у меня есть помощник (куб для тестирования прямо сейчас), и мне нужно подогнать положение и вращение к другому (того же размера, 6 полигонов), который импортируется. Это оказывается чрезвычайно сложным для меня, и хотя положение вообще не проблема (sceneObj.pos = targetObj.pos), я полностью потерялся в значениях matrix3, eulerangles и quat. И (sceneObj.rotation = targetObj.rotation) не вариант, так как простой импортированный файл *.obj вообще НЕ имеет вращения.
Итак, я подумал, что получение матрицы3 нормали грани 3 (лицевой грани) targetObj. Мне удалось каким-то образом перевести вращение на мой объект сцены, но я думаю, что все оси неверны - некоторые из них сохраняют правильное выравнивание sceneObj, в то время как при изменении ориентации targetObj он поворачивает sceneObj в неправильном направлении / вдоль неправильной оси.
Код:
fn getAngleFromNormal targetObj sceneObj =
(
--RESET sceneObj ROTATION
oldTranslateMtx = transMatrix sceneObj.transform.pos
oldScaleMtx = scaleMatrix sceneObj.transform.scale
sceneObj.transform = oldScaleMtx * oldTranslateMtx
mtx = matrixFromNormal (polyOp.getFaceNormal targetObj 3)
sceneObj.transform *= mtx
eu = mtx as eulerangles
rx = eu.x
ry = eu.y
rz = eu.z
sceneObj.rotation *= inverse (eu as quat)
sceneObj.pos = targetObj.pos
)
Скриншоты:
Я действительно, очень безнадежен, если дело касается таких вещей, как эти, поэтому я был бы признателен за любую помощь, которая может направить и научить меня хоть немного.
Спасибо за ваше время, Мишель.