[英]Finding left/right vertices to a point in a triangle in 3D
给定3D三角形,并且在其边缘之一上有一个点,我想找出该边缘的哪个顶点在该点的左侧,而哪个在右侧。
请参见下图:
在此图像中,顶点v2
和v3
始终如图所示放置。 v3
和v2
之间还有一条线段。 问题是顶点v0
和v1
可能以交换顺序给出。 我想找出v0
是位于v3
的“左侧”还是“右侧”,以便我可以强制v0
始终位于其左侧,而v1
始终位于其右侧。
由于此问题在3D中,因此我不确定如何有效地计算顶点的相对位置。 我是否首先将其简化为二维问题(如果可以的话,如何解决)还是有其他方法?
在3d中,“左”和“右”取决于观察者的位置(以下称为此位置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
与三角形位于同一平面上。
如评论中所阐明的,“ left”和“ right”(或v0
和v1
任何其他顺序)取决于某些参考。 您提到您知道三角形的法线向量(称为N
)-可以用作此类参考。
假设法向矢量指向示例图像中的查看器。 然后,计算v2 - v3
和v0 - v3
的向量积。 这将指向与法线相同的半空间(意味着v0
在“左侧”),或者指向相反的半空间(意味着v0
在“右侧”)。
由于N
垂直于三角形的平面,因此如果v
与N
之间的角度小于90度,则向量v
指向相同的半空间;否则,向量v
指向相同的半空间。 换句话说,如果v
和N
的点积为正。
这些共同为您提供所需的订购标准。
求向量v2-v3和v1-v2的叉积。 从产品的方向推导方向。
向量是从平面向上指向还是向下指向。
这是如果我正确理解了您对左右的定义。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.