按逆时针方向对3D多边形顶点进行排序

Tal*_*rly 1 c++ opengl math polygon

我必须找到多边形的法线,但为了做到这一点,我首先必须按逆时针方向对顶点(x,y,z)进行排序.假设我给出了用户输入的n个顶点数,我如何按逆时针方向对顶点进行排序以将它们变成多边形?

Jas*_*n C 9

你不能在不知道正常的情况下订购你的积分,反之亦然.如果你说"从前面逆时针方向"那么你需要知道前方是哪一侧,因此你需要知道正常情况.所以你的问题没有答案,因为它有点循环:你没有足够的信息来确定你在寻找什么.

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

如果你的脸是凹面的一部分,你可以通过将法线的点积与相邻面的法线相乘,使所有法线指向相同的大致方向,如果它是负的,则将其翻转.你仍然需要决定一种方法来确定脸的哪一侧在内侧与外侧之间,但至少所有法线都指向一个或另一个.

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

请注意,基于atan的2D解决方案隐含地依赖于一些额外的信息:依赖于法线面向屏幕外/离开纸张并朝向您,观察者的事实,因此您可以在已知方向上排序正常.这种假设通常是在没有任何人真正说过它的情况下做出的.但是,实际上,您需要确定哪一侧是前方和后方 - 对于3D来说并不总是那么容易(如果您正在渲染到屏幕并且设置了视点,则可以将其用作额外信息 - 比如说正常面对相机,然后顺序正常).


另一种表达上述内容的方法是,一般来说,我们有3个未知数:

  1. 从"前面"看什么是绕线顺序?
  2. 我们选择将两个垂直单位向量中的哪一个放在"前面" "哪一边是前面"?
  3. 对应于绕组顺序的给定点的排序顺序是什么?

我们需要有两个来确定第三个.

回应Andon在下面的评论:对于光栅化器,它定义#1本身(或从配置中获取),#3由API要求假设,因此可以推断出#2.

在您经常看到的2D情况(我在上面提到过)中,#1被指定为一个要求,#2被假定为"面向观察者的一侧是前面",因此#3可以用atan和按递增/递减顺序排序.

在您的原始问题中,您知道#1(您已定义它),但您不知道#2(哪一侧是前方?),因此您无法确定#3.你需要一些方法来确定#2(例如,背离质心,面向观众,无论如何).