2015-04-21 9 views
1

Workflow:MAXScript - objA.object_rotation от objB.face_normal

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. Трансформация nooberism.

Детали:

я работаю над простым плагином импорта, что импорт пользовательских сетки из другого приложения в 3ds Max. В сценарии 3ds Max у меня есть помощник (куб для тестирования прямо сейчас), и мне нужно подогнать позицию и поворот к другому (того же размера, 6 полисов), который импортируется. Это очень сложно для меня, и хотя позиция вообще не проблема (sceneObj.pos = targetObj.pos), я полностью потерял значения matrix3, eulerangles и quat. И (sceneObj.rotation = targetObj.rotation) не является опцией, так как простой импортированный * .obj-файл вообще не имеет вращения.

Так что - я думал, что получить матрицу 3 нормали лица 3 (лицевая сторона) цели Obj. Мне удалось каким-то образом перевести поворот на объект сцены, но я думаю, что ось все неправильная - некоторые из них поддерживают выравнивание sceneObj должным образом, а при изменении ориентации targetObj он поворачивает сцену Obj в неправильном направлении/вдоль неправильной оси.

Код:

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 
) 

Скриншоты:

Screenshot-1

Screenshot-2

Я действительно, действительно безнадежной, если она идет на такие вещи, как эти, так что я был бы признателен любая помощь, которая может направить меня и немного научить меня.

Спасибо за ваше время, Michelle.

+0

Когда вы говорите, что импортированный узел не имеет вращения, вы имеете в виду, что он выровнен по миру (это то, что я предполагаю)?Также есть ли какой-либо из этих узлов, родившихся или связанных? Также обратите внимание, что не рекомендуется конвертировать в eulerangles, если вам не нужно - что в этом случае нет (если это не нужно анимировать). – Klaudikus

ответ

1

Я думаю, что вы на правильном пути, однако, чтобы получить ориентацию, вам нужны как минимум два вектора. Из того, что я собираю в документации, получение матрицыFromNormal использует ось мира как касательную, поэтому вы получаете нечетные результаты.

Я уверен, что есть более оптимизированные подходы, но, надеюсь, это поможет вам на правильном пути.

--Returns matrix based on the face of a mesh - aligns X axis with Normal 
fn getMatrixFromFace targetObj faceId:10 = 
(
    -- here we get the normal and assume it's the first row of the resulting 
    -- matrix, hence the x-axis 
    local row1 = getFaceNormal targetObj faceId 
    -- here we are building a tangent from the vertex positions of the face 
    local verts = getFace targetObj faceId 
    local row2 = normalize (targetObj.verts[1].pos - targetObj.verts[2].pos) 
    -- to get the third axis we get the cross product of X-axis and Y-axis 
    local row3 = cross row1 row2 
    -- we zero out the position (row4), in case you need to multiply by this 
    -- matrix. Optionally, if you know you will always want the translation, 
    -- (matrix3 row1 row2 row3 targetObj.transform.row4) 
    (matrix3 row1 row2 row3 [0, 0, 0]) 
) 
mtx = getMatrixFromFace targetObj faceId:10 
mtx.row4 = targetObj.transform.row4 
sourceObj.transform = mtx 

Обратите внимание, что это выравнивает нормали к поверхности с X-оси sourceObj, а Y-ось выравнивается по касательной к поверхности. Если вы измените это, просто измените ряды вокруг или измените ориентацию касательной.

Если вам нужно выровнять лицо, вам будет больше работы. Я уверен, что вы можете понять это из приведенной информации.

Также обратите внимание, что я предполагаю, что targetObj имеет мировую ориентацию, но имеет положение, относящееся к его геометрии (смещение от источника). Если нет, вы можете изменить row4 в функции выше, усреднив положение вершин граней, а затем смещая вектор между вышеупомянутым средним pos и ограничивающим объемом targetObj.