从面法线找到两个面之间的夹角

5
我有一些面法线,需要计算它们所属的面之间的夹角。当角度大于180度时,我遇到了找出两个角度45和315之间不同的问题。编辑2:我可以访问定义模型的obj文件,我需要什么信息来区分45和315度之间的差异?另外,我正在构建使用的低多边形模型,因此我可以保证没有相交的面等。编辑:
ang = math.acos(dotproduct(v1, v2) / (length(v1) * length(v2)))

ang = math.degrees(ang)

ang = 360 - (ang + 180)

也许你应该发布你的代码,以及迄今为止尝试过的内容(甚至伪代码)。 - gideon
1个回答

8
确保你的法线长度为单位长度(如有必要,可以除以它们的长度)。然后找到点积。
dp = n1.x*n2.x + n1.y*n2.y + n1.z*n2.z
这将给出一个[-1到1]之间的值。
如果dp为负数,则角度大于90度。 要找到角度,请使用反余弦函数。
θ = acos(dp);
这将以弧度为单位给出您的值。要转换为度数,请乘以180/π。
编辑:假设面被定义为多边形。如果面不共面,则在每个面的多边形定义中必须存在一个点与另一个多边形不共面。考虑两个三角形:如果连接一条边,则它们共享两个顶点,但各自有一个未共享的顶点。我将分别称它们为具有法线n1和n2的v1和v2。找到从v1到v2的向量:
m = v2-v1

如果向量m和向量n1之间的夹角大于90度[dotP(m,n1)<0],则多边形朝向相反。如果角度小于90度,则多边形面对彼此。如果角度是90度,则我认为多边形共面(或者您选择的点在平面交线上,或者我在思考中遗漏了一个情况)。

如果法线之间的夹角小于180度,那么面之间的夹角不就是“180-(法线夹角)”吗? - BlueRaja - Danny Pflughoeft
1
请注意,使用点积无法区分45度和315度。 - Alnitak
45度和315度之间也没有区别。或者说,在两个向量之间不存在315度的角度。这是没有意义的。如果你想要找到两个二维向量逆时针方向的夹角:n2相对于n1,那么你应该找出:atan2(n2.y,n2.x)和atan2(n1.y,n1.x),然后从n2中减去n1的角度(然后确保一个正值)。 - JCooper
实际上,这可能并不准确,因为表面可能会相交,这种情况下问题很难回答。我想你需要知道交点,然后再找到一个定义“外部”的向量。 - JCooper
我可以访问定义模型的obj文件,我需要哪些信息来区分45度和315度?此外,我正在构建使用的(低多边形)模型,因此我可以保证没有相交的面。 - pkinsky
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接