在3D中查找左/右顶点到三角形中的点

时间:2013-11-27 13:18:51

标签: c++ math graphics 3d

给定3D中的三角形和其中一个边上的点,我想找出该边的哪个顶点位于该点的左侧,哪个位于右侧。

请参阅下图:

在此图片中,顶点v2v3始终如图所示定位。 v3v2之间还有一个线段。问题在于顶点v0v1,它们可以以交换顺序给出。我想知道v0v3的“左侧”还是“右侧”,以便我可以强制v0始终位于其左侧v1永远是对的。

由于这个问题是3D问题,我不确定如何有效地计算顶点的相对位置。我是否首先将其减少为二维问题(如果是,如何)或是否有另一种方式?

3 个答案:

答案 0 :(得分:1)

在3d中,“left”和“right”依赖于观察者的位置(让我们调用这个位置P)。想象一下,您正在从另一侧查看该三角形,然后左右颠倒。因此,从位置P查看,您需要确定顶点是顺时针还是逆时针。

要做到这一点,你可以计算:

N = normalize( cross( v0 - v2, v1 - v2 ) );
PV = normalzie( P - v2 );
if( dot( PV, N ) > 0.0 )
{
    //anticlockwise , so you are viewing the picture like in your drawing, then v0 is on the left of vector v3v2, and v1 is on the right
}
else
{
    //clockwise, v0 is on the right
}

请注意,如果dot产品几乎为/或0,则P与您的三角形位于同一平面上。

答案 1 :(得分:1)

正如评论中所阐明的那样,“左”和“右”(或v0v1的任何其他顺序)取决于某些参考。你提到你知道三角形的法线向量(称之为N) - 它可以用于这样的参考。

假设法线向量指向示例图像中的查看器。然后,计算v2 - v3v0 - v3的向量积。这将指向与法线相同的半空间(意味着v0是“向左”),或指向相反的半空间(意味着v0是“向右”)。

由于N与三角形平面垂直,如果vv之间的角度小于90度,则向量N指向相同的半空间;换句话说,如果vN的点积为正。

这些一起为您提供所需的订购标准。

答案 2 :(得分:0)

找到向量v2-v3和v1-v2的叉积。从产品的方向推断方向。

矢量是从平面向上还是向下。

如果我已正确理解你的左右定义,那就是这样。