Graphics 如何确定3D空间中的点列表是否按时钟顺序排列?

Graphics 如何确定3D空间中的点列表是否按时钟顺序排列?,graphics,geometry,Graphics,Geometry,对于下面的示例,上面的每个点都映射到下面可视化中的索引 point[0] = (0,1,1) point[1] = (1,1,1) point[2] = (0,0,1) point[3] = (1,0,1) 你不能 如果这些点不是共面的,甚至不可能定义方向 如果这些点是共面的,则可以从两侧查看它们的平面 如果需要有关观察者的此信息,请将顶点投影到查看平面(以减少到2D),并通过鞋带公式计算代数面积。这个标志告诉你方向。你可以,但只能在某个方向上… 以你的例子来说,如果你看它的CW,但是如果你

对于下面的示例,上面的每个点都映射到下面可视化中的索引

point[0] = (0,1,1)
point[1] = (1,1,1)
point[2] = (0,0,1)
point[3] = (1,0,1)
你不能

如果这些点不是共面的,甚至不可能定义方向

如果这些点是共面的,则可以从两侧查看它们的平面



如果需要有关观察者的此信息,请将顶点投影到查看平面(以减少到2D),并通过鞋带公式计算代数面积。这个标志告诉你方向。

你可以,但只能在某个方向上…

以你的例子来说,如果你看它的CW,但是如果你从它的CCW后面看它。。。如果你从侧面看(垂直的,所以脸被投影到直线上),我们无法分辨

所以通常的方法是做顶点的叉积。这将为您提供面法向量,但方向由CW/CCW确定。现在,通过点积将结果与参考方向进行比较。因此:

0----------1
|          |
|          |
|          |
3----------2
现在,
缠绕
符号告诉您相对于dir,面是顺时针还是逆时针。它是哪一个取决于你的符号但这仅适用于凸多边形(或凹多边形的凸部分)

在计算机图形学中,参考方向通常是相机视图方向。因此,一旦在相机局部空间坐标系中,方向是z轴,那么检查叉积的z坐标就足够了。这被称为面剔除(跳过由
GL\u CULL\u face
设置的GL中有错误缠绕的多边形)


你可以把参考线看作为一个旋转轴,你可以确定这些点是顺时针还是逆时针…

假设它们是共面的,你能解释一下从两边看它们的平面吗?拿一张纸翻转它。注意,除非表面是凸的,否则你的“缠绕”测试是完全错误的,因为三角形012可以位于面内或面外。@YvesDaoust+1点很好,我甚至不认为OP可能会使用凹多边形来进行此测试。。。我添加了关于这个的注释来回答。你的例子实际上是2D。
vec3 p0,p1,p2; // 3 vertexes of your face not on single line
vec3 dir;      // reference direction
float winding = dot( cross( p1-p0 , p2-p1 ) , dir )