工作流:
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值。并且(sceneObj.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
)
截图:
如果它适用于这些事情,我真的非常无望,所以我会感激任何可以指导和教导我的帮助。
谢谢你的时间, 米歇尔。
答案 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的边界体积之间的向量进行偏移。