【问题标题】:find angle between faces from face normals从面法线找到面之间的角度
【发布时间】:2011-07-18 08:06:27
【问题描述】:

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

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

编辑:

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

ang = math.degrees(ang)

ang = 360 - (ang + 180)

【问题讨论】:

  • 也许你应该发布你的代码,到目前为止你已经尝试过什么。 (甚至可能是伪代码)

标签: 3d geometry angle


【解决方案1】:

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

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)] 则多边形面朝外从彼此。如果角度小于 90,则多边形彼此相对。如果角度是 90 度,那么我认为这些多边形是共面的(或者您选择的点之一在平面相交线上,或者我错过了一个案例)。

【讨论】:

  • 面之间的角度不是180 - (angle between normals)(假设法线之间的角度
  • 另请注意,使用点积无法区分 45' 和 315'
  • 45 度和 315 度之间也没有区别。或者更确切地说,两个向量之间的夹角不可能是 315 度。这没有意义。如果你想要两个二维向量之间的逆时针角度:n2 相对于 n1,那么你应该找到:atan2(n2.y,n2.x) 和 atan2(n1.y,n1.x),然后减去角度从 n2 计算 n1(然后确保为正值)。
  • @BlueRaja 我想我会考虑脸部的法线来定义它“面向”的方向。要计算在两个面的连接点处形成的角度,您需要更多信息:您需要有两个参考点——每个面上都有一个参考点。
  • 实际上,这可能不是真的,因为表面可能相交,在这种情况下,这个问题很难回答。我猜你需要一个交点,然后是一个向量来定义“出”的方式。
猜你喜欢
  • 1970-01-01
  • 2021-11-03
  • 2016-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多