我有一些面部法线,我需要计算它们所属的面之间的角度。我遇到的问题是当角度大于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)
答案 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度,那么我认为多边形是共面的(或者你选择的一个点位于平面交叉线上,或者我错过了一个案例)。