2015-04-21 2 views
1

Flux de travail:Maxscript - objA.object_rotation de 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 

Problème:

Impossible de définir axe propre/rotation sceneObj du visage normal de targetObj. Noobérisme de la transformation.

Détails:

Je travaille sur un simple module d'importation, que les importations de maille sur mesure d'une autre application dans 3ds Max. Dans la scène 3ds Max, j'ai un assistant (un cube à tester en ce moment) et j'ai besoin d'ajuster la position et la rotation à une autre (même taille, 6 polys) qui est importée. Cela s'avère extrêmement difficile pour moi, et bien que la position ne pose aucun problème (sceneObj.pos = targetObj.pos) je suis totalement perdu à matrix3, eulerangles et quat values. Et (sceneObj.rotation = targetObj.rotation) n'est pas une option, car le fichier * .obj importé simple n'a AUCUNE rotation du tout. Donc, j'ai pensé que l'on obtenait la matrice 3 de la normale de la face 3 (face avant) de la cibleObj. J'ai réussi à traduire la rotation vers l'objet de ma scène mais je pense que les axes sont tous erronés - certains d'entre eux gardent la scène correctement alignée, tandis que quand l'orientation de targetObj change, elle tourne dans le mauvais sens.

code:

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 
) 

Captures d'écran:

Screenshot-1

Screenshot-2

Je suis vraiment, vraiment sans espoir si elle va pour des choses comme celles-ci, donc j'apprécierais toute l'aide qui peut diriger et m'apprendre même un peu.

Merci pour votre temps, Michelle.

+0

Lorsque vous dites que le noeud importé n'a pas de rotation, voulez-vous dire qu'il est aligné sur le monde (c'est ce que je suppose)?Est-ce que l'un de ces nœuds est parenté/lié? Notez également que ce n'est pas une bonne idée de convertir en eulerangles à moins que vous n'en ayez besoin - ce qui n'est pas le cas dans ce cas (à moins que cela ne nécessite d'être animé). – Klaudikus

Répondre

1

Je pense que vous êtes sur la bonne voie, mais pour obtenir une orientation, vous avez besoin d'au moins deux vecteurs. D'après ce que je comprends dans la documentation, obtenir matrixFromNormal utilise l'axe monde comme une tangente, ce qui explique pourquoi vous obtenez des résultats étranges.

Je suis sûr qu'il existe des approches plus rationalisées, mais j'espère que cela vous met sur la bonne voie.

--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 

Notez que cette aligne la normale de la face avec l'axe X de la sourceObj, et l'axe Y est aligné à la tangente de la face. Si vous voulez changer cela, changez simplement les lignes ou changez l'orientation de la tangente.

Si vous devez vous aligner face à face, le travail est plus important. Je suis sûr que vous pouvez comprendre à partir de l'information donnée.

Notez également que je suppose que le targetObj a une orientation de monde, mais a une position qui se rapporte à sa géométrie (décalage de l'origine). Si ce n'est pas le cas, vous pouvez modifier row4 dans la fonction ci-dessus en calculant la moyenne des vertus des faces, puis en décalant le vecteur entre le pos moyen ci-dessus et le volume englobant de la cible Obj.