5

我有一些面法线,我需要计算它们所属的面之间的角度。我遇到的问题是在角度大于 180 度时找到面之间的角度 - 我不知道如何区分 45 度角和 315 度角之间的差异。

edit2:我可以访问定义模型的 obj 文件,我需要什么信息来区分 45' 和 315'?另外,我正在构建使用的(低多边形)模型,所以我可以保证没有相交的面等。

编辑:

ang = math.acos(dotproduct(v1, v2) / (length(v1) * length(v2)))

ang = math.degrees(ang)

ang = 360 - (ang + 180)
4

1 回答 1

8

确保您的法线是单位长度(必要时除以它们的长度)。然后找到点积。

dp = n1.x*n2.x + n1.y*n2.y + n1.z*n2.z

这将给出 [-1 到 1] 中的值。
如果 dp 为负,则角度大于 90 度。

要找到角度,请使用反余弦。

θ = acos(dp);

这将为您提供弧度值。要转换为度数,请乘以 180/pi。


编辑:假设面被定义为多边形。如果面不共面,则每个面的多边形定义中必须存在一个与另一个多边形不共面的点。考虑两个三角形:如果一条边是连接的,它们共享两个顶点,但每个都有一个未共享的顶点。我将分别称这些v1v2与法线n1n2相关联。找到从v1v2的向量:

m = v2-v1

如果mn1之间的角度大于 90 [ dotP(m,n1)<0 ],则多边形彼此背离。如果角度小于 90,则多边形彼此相对。如果角度是 90 度,那么我认为多边形是共面的(或者您选择的点之一在平面相交线上,或者我错过了一个案例)。

于 2011-03-18T17:05:08.923 回答