给定3D中的三角形和其中一个边上的点,我想找出该边的哪个顶点位于该点的左侧,哪个位于右侧。
请参阅下图:
在此图片中,顶点v2
和v3
始终如图所示定位。 v3
和v2
之间还有一个线段。问题在于顶点v0
和v1
,它们可以以交换顺序给出。我想知道v0
是v3
的“左侧”还是“右侧”,以便我可以强制v0
始终位于其左侧v1
永远是对的。
由于这个问题是3D问题,我不确定如何有效地计算顶点的相对位置。我是否首先将其减少为二维问题(如果是,如何)或是否有另一种方式?
答案 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)
正如评论中所阐明的那样,“左”和“右”(或v0
和v1
的任何其他顺序)取决于某些参考。你提到你知道三角形的法线向量(称之为N
) - 它可以用于这样的参考。
假设法线向量指向示例图像中的查看器。然后,计算v2 - v3
和v0 - v3
的向量积。这将指向与法线相同的半空间(意味着v0
是“向左”),或指向相反的半空间(意味着v0
是“向右”)。
由于N
与三角形平面垂直,如果v
和v
之间的角度小于90度,则向量N
指向相同的半空间;换句话说,如果v
和N
的点积为正。
这些一起为您提供所需的订购标准。
答案 2 :(得分:0)
找到向量v2-v3和v1-v2的叉积。从产品的方向推断方向。
矢量是从平面向上还是向下。
如果我已正确理解你的左右定义,那就是这样。