我想计算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
是正常情况
vector1
和vector2
两个来自同一个顶点,每个都指向任一方向的下一个顶点
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度。为什么呢?
答案 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()。