繁体   English   中英

沿逆时针方向排序3D多边形顶点

[英]Sorting 3D polygon vertices in anticlockwise direction

我必须找到多边形的法线,但是要做到这一点,我首先必须沿逆时针方向对顶点(x,y,z)进行排序。 可以说,我给了用户输入的n个顶点,我如何在逆时针方向上将顶点变成多边形?

您不能在不知道法线的情况下订购积分,反之亦然。 如果您说“从正面逆时针方向”,那么您需要知道正面在哪一边,因此您需要知道法线。 因此,您的问题目前没有答案,因为它有点循环:您没有足够的信息来确定要寻找的内容。

您需要更多信息。 例如,如果此多边形是凸曲面的一部分,则可以计算曲面的几何中心。 然后在多边形上选取任意3个非共线点a,b,c ,计算法线( norm((a-b)cross(c-b)) ),计算从质心到您的一个点的向量(例如b-质心 ),然后检查法线是否与该矢量( 法线点(b-质心)的符号)方向相同(或相反)。如果方向错误,则将其翻转。 本质上,您只是计算一个垂直单位矢量(记住两个),然后确保它指向对象的内部/外部。

如果您的脸是凹面的一部分,则可以通过获取法线与相邻脸部法线的点积并将其翻转为负值来使所有法线指向相同的大致方向。 您仍然需要确定一种方法来确定面部的哪一侧在表面的内部与外部,但是至少所有法线都指向一个或另一个。

如果您没有有关法线应该面对的大致方向的信息,则必须从其他地方获取逆时针信息。 您可以对多边形中心周围的点进行排序,以使它们按顺序排列,但是要确定该顺序是顺时针还是逆时针,则需要其他信息(例如,询问用户等)。

请注意,基于atan的2D解决方案隐式依赖于一些额外的信息:依赖于这样的事实,即法线朝向屏幕外/纸张外并朝向您,观察者,因此您可以围绕该方向进行分类正常。 该假设通常是在没有人真正谈论过的情况下做出的。 但是,实际上,您需要确定正面和背面是哪一侧-3D并不总是那么容易(如果要渲染到屏幕上并且设置了视点,则可以将其用作附加信息-例如法线朝向相机,然后围绕该法线排序)。


通常,我们有3个未知数:

  1. 从“正面”看时的缠绕顺序是什么?
  2. 我们选择在平面的两个垂直单位向量中的哪一个位于“前” “哪一侧是前”?
  3. 给定点对应于缠绕顺序的排序顺序是什么?

我们需要其中两个来确定第三个。

针对以下Andon的评论:对于光栅化器,它定义了#1本身(或从配置中获取),并且API要求假定了#3,因此可以推断出#2。

在您经常看到的2D情况下(我在上面提到),将#1指定为要求,假定#2为“面对观察者的一侧为前方”,因此可以使用atan来确定#3并按升序/降序排序。

在您最初的问题中,您知道#1(已经定义了它),但是您不知道#2(哪一侧是正面?),因此无法确定#3。 您需要某种方法来确定#2(例如,远离质心,面向观察者等)。

阿坦

要找到一个点的角度(X,Y),您只需要执行atan(Y/X) 以下是一些警告:

http://upload.wikimedia.org/math/5/7/1/571efb70f630041f9e2b00019025171e.png Atan网域

最后,从最低到最高对结果进行排序(将360加到负数)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM