Maxscript - 来自objB.face_normal的objA.object_rotation

时间:2015-04-21 11:21:36

标签: 3d rotation transformation normals maxscript

工作流:

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

问题:

无法从targetObj的face normal向sceneObj设置正确的轴/旋转。转型nooberism。

详细说明:

我正在开发一个简单的导入插件,它将自定义网格从另一个应用程序导入3ds Max。在3ds Max场景中,我有一个帮助器(一个立即用于测试的立方体),我需要将位置和旋转拟合到导入的另一个(相同大小,6个多边形)。这证明对我来说非常困难,虽然位置根本没有问题(sceneObj.pos = targetObj.pos)但我完全迷失在matrix3,eulerangles和quat值。并且(sce​​neObj.rotation = targetObj.rotation)不是一个选项,因为简单导入的* .obj文件根本没有旋转。

所以 - 我认为得到targetObj的face 3(正面)法线的matrix3。我设法以某种方式将旋转转换为我的场景对象,但我认为轴都是错误的 - 其中一些使得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
)

截图:

Screenshot-1

Screenshot-2

如果它适用于这些事情,我真的非常无望,所以我会感激任何可以指导和教导我的帮助。

谢谢你的时间, 米歇尔。

1 个答案:

答案 0 :(得分:1)

我认为你是在正确的轨道上,但是为了获得一个方向,你需要至少两个向量。根据我在文档中收集的内容,获取matrixFromNormal使用世界轴作为切线,这就是为什么你得到奇怪的结果。

我确信有更简化的方法,但希望这能让你走上正轨。

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

请注意,这会使面的法线与sourceObj的X轴对齐,并且Y轴与面的切线对齐。如果要更改此项,只需更改行或更改切线的方向。

如果您需要面对面对齐,还需要做更多的工作。我确定你可以从给出的信息中找出答案。

另请注意,我假设targetObj具有世界方向,但其位置与其几何形状(偏离原点)有关。如果不是,你可以通过平均面的顶点位置来修改上面函数中的row4,然后通过前面提到的平均pos和targetObj的边界体积之间的向量进行偏移。