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

pki*_*sky 5 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)
Run Code Online (Sandbox Code Playgroud)

JCo*_*per 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
Run Code Online (Sandbox Code Playgroud)

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