绘制顺时针三角形重新排序点

Posted

技术标签:

【中文标题】绘制顺时针三角形重新排序点【英文标题】:Drawing Clockwise Triangles Reordering Points 【发布时间】:2020-10-27 02:48:17 【问题描述】:

我正在用 C++ 制作光线追踪器,但在下载对象时遇到了一个问题,因为它只会渲染一些三角形,因为它们是逆时针绘制的。

我认为这是一个问题,因为它会反过来。但我对你实际上应该如何仅通过顶点知道而感到困惑。如果有人可以帮我制作一个函数,为三角形的每个点输入三个向量并重新排序,以便顺时针绘制。

谢谢。

【问题讨论】:

@TedLyngmo 请帮忙 google polygon winding in 3D,4D,...ND 您只需检查 dot(normal,ray_direction) 的符号 .... 另请参阅 Determing the direction of face normals consistently? ... raytrace through 3D mesh 可能对你也是。 @Spektre 谢谢你,这正是我想要的 【参考方案1】:

您可以计算由三个点定义的三角形形成的有符号面积 - 这相当于表示边缘的向量的 2D“叉积”(有时称为 perp 积):

这是一个简单的python实现,显示了计算;您可以在闲暇时将其转录为 C++。

从那里,交换三角形中两点的位置会将转角从ccw 反转为cw,反之亦然

class CollinearpointsError(ValueError):
    pass


def ccw(triangle):
    """returns True if the triangle points are counter clock wise,
    False otherwise, and raises a CollinearpointsError when the 
    three points are collinear 
    """
    A, B, C = triangle
    ax, ay = A
    bx, by = B
    cx, cy = C
    
    AB = (bx - ax, by - ay)
    AC = (cx - ax, cy - ay)

    a, b = AB
    c, d = AC
    
    signed_area_x2 = a * d - b * c
    if signed_area == 0:
        raise CollinearpointsError('the three points are collinear')

    return (a * d - b * c) > 0


def cw(triangle):
    """returns True if the triangle points are clock wise,
    False otherwise, and raises a CollinearpointsError when the 
    three points are collinear 
    """
    return not ccw(triangle)


A = (0, 0)
B = (0, 1)
C = (1, 0)

triangle = (A, B, C)
print(cw(triangle))

triangle = (A, C, B)
print(cw(triangle))

triangle = (A, B, (0, 2))
print(cw(triangle))

输出:

True
False
CollinearpointsError: the three points are collinear

【讨论】:

以上是关于绘制顺时针三角形重新排序点的主要内容,如果未能解决你的问题,请参考以下文章

Unity中的Mesh网格编程——绘制基本2D图形

Unity中的Mesh网格编程——绘制基本2D图形

OpenGL ES 2.0 卷绕和背面剪裁

蚂蚁拼图

如何判断一个点在多边形内

判断点在三角形内部