你不能在不知道正常的情况下订购你的积分,反之亦然.如果你说"从前面逆时针方向"那么你需要知道前方是哪一侧,因此你需要知道正常情况.所以你的问题没有答案,因为它有点循环:你没有足够的信息来确定你在寻找什么.
您需要更多信息.例如,如果此多边形是凸面的一部分,则可以计算曲面的几何中心.然后选择多边形上的任意3个非共线点a,b,c,计算法线(范数((a - b)交叉(c - b))),计算从质心到其中一个点的向量(例如b - 质心),然后检查法线是否面向与该矢量相同(或相反,无论如何)的方向(正常点(b - 质心)的符号)并且如果它是错误的方式则翻转它.基本上你只是计算一个垂直单位向量(有两个,记住),然后确保它指向你对象的内部/外部.
如果你的脸是凹面的一部分,你可以通过将法线的点积与相邻面的法线相乘,使所有法线指向相同的大致方向,如果它是负的,则将其翻转.你仍然需要决定一种方法来确定脸的哪一侧在内侧与外侧之间,但至少所有法线都指向一个或另一个.
如果您没有关于正常应该面对的一般方向的信息,您将必须从其他地方获取逆时针信息.您可以对多边形中心周围的点进行排序以使它们按顺序排列,但要确定该顺序是顺时针还是逆时针需要其他信息(例如询问用户等).
请注意,基于atan的2D解决方案隐含地依赖于一些额外的信息:依赖于法线面向屏幕外/离开纸张并朝向您,观察者的事实,因此您可以在已知方向上排序正常.这种假设通常是在没有任何人真正说过它的情况下做出的.但是,实际上,您需要确定哪一侧是前方和后方 - 对于3D来说并不总是那么容易(如果您正在渲染到屏幕并且设置了视点,则可以将其用作额外信息 - 比如说正常面对相机,然后顺序正常).
另一种表达上述内容的方法是,一般来说,我们有3个未知数:
我们需要有两个来确定第三个.
回应Andon在下面的评论:对于光栅化器,它定义#1本身(或从配置中获取),#3由API要求假设,因此可以推断出#2.
在您经常看到的2D情况(我在上面提到过)中,#1被指定为一个要求,#2被假定为"面向观察者的一侧是前面",因此#3可以用atan和按递增/递减顺序排序.
在您的原始问题中,您知道#1(您已定义它),但您不知道#2(哪一侧是前方?),因此您无法确定#3.你需要一些方法来确定#2(例如,背离质心,面向观众,无论如何).
| 归档时间: |
|
| 查看次数: |
1748 次 |
| 最近记录: |