我有一些面法线,我需要计算它们所属的面之间的角度.我遇到的问题是当角度大于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)
确保法线是单位长度(必要时除以它们的长度).然后找到点积.
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
Run Code Online (Sandbox Code Playgroud)
如果m和n1之间的角度大于90 [ dotP(m,n1)<0 ],则多边形彼此背离.如果角度小于90°,则多边形面向彼此.如果角度是90度,那么我认为多边形是共面的(或者你选择的一个点位于平面交叉线上,或者我错过了一个案例).