从面法线中找出面之间的角度

时间:2011-03-18 16:54:23

标签: 3d geometry angle

我有一些面部法线,我需要计算它们所属的面之间的角度。我遇到的问题是当角度大于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)

1 个答案:

答案 0 :(得分:8)

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

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

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

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

θ = acos(dp);

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


编辑:假设面被定义为多边形。如果面不是共面的,则每个面的多边形定义中必须存在一个与另一个多边形不共面的点。考虑两个三角形:如果连接了一个边,则它们共享两个顶点,但每个顶点都有一个未共享的顶点。我将这些 v1 v2 分别与正常 n1 n2 相关联。找到 v1 v2

的向量
m = v2-v1

如果 m n1 之间的角度大于90 [ dotP(m,n1)<0 ],则多边形将面临远离彼此。如果角度小于90°,​​则多边形面向彼此。如果角度是90度,那么我认为多边形是共面的(或者你选择的一个点位于平面交叉线上,或者我错过了一个案例)。