如何计算3D空间中多边形中两条边之间的角度?

时间:2011-08-25 09:15:36

标签: 3d geometry

我想计算3D空间中人脸中两条边之间的角度。

我以为我可以在这个问题中使用解决方案:Signed angle between two 3D vectors with same origin within the same plane

然而,当我在所有90度角的矩形上尝试时,我得到一个角度为90度,三个角度为270度。

我几乎没有关于几何学的数学知识,这就是为什么我为此而斗争并明显做出错误的假设。

那么如何计算面部两条边之间的角度?

我尝试了什么:

def self.full_angle_between( vector1, vector2, normal )
  angle = vector1.angle_between( vector2 )
  direction = normal % ( vector1 * vector2 )
  angle = 360.degrees - angle if direction < 0.0
  angle
end

normal是正常情况 vector1vector2两个来自同一个顶点,每个都指向任一方向的下一个顶点

vector1.angle_between( vector2 )参考SketchUp Rubu API中的方法:http://code.google.com/apis/sketchup/docs/ourdoc/vector3d.html#angle_between 它以弧度为单位返回0-180之间的角度。

360.degrees以弧度表示度数。也是SketchUp API方法。

当我迭代矩形中的所有顶点时,我得到三个角度,报告为270度。为什么呢?

3 个答案:

答案 0 :(得分:1)

我想说你的问题在于这一行:

direction = normal % ( vector1 * vector2 )

这本身并没有错,但你可能传递错误的价值观。

如果你没有完全掌握矢量数学的速度,你可能会遗漏的是cross product vector1 * vector2给出的矢量方向取决于操作数的顺序。如果你交换它们,你会得到相同的向量指向相反的方向。

因此,当你在矩形顶点上进行迭代时,如果你将“下一个”和“前一个”顶点混合起来,你将得到你描述的伪造的270度结果。

答案 1 :(得分:0)

您只需执行两个向量的dot product

这会给你角度。对于3d矢量,它是:

product = (x1 * x2) + (y1 * y2) + (z1 * z2);

这假定向量是标准化的(它们的长度是1)。所以在第一个例子中你必须确保这样。

每次都必须确保选择正确的一对边缘:

edge1 * edge2
edge2 * edge3
edge3 * edge4
edge4 * edge1

答案 2 :(得分:0)

由于我无法在上一个答案中添加注释,我开始一个新的答案,只是指出点积只是两个向量的余弦值。要获得实际角度,您需要在此之后调用acos()。