使用Pyglet / OpenGL绘制具有自定义粗细的线条?

时间:2015-11-06 19:15:04

标签: python opengl line pyglet

我画了一个矩形(4个线段),但它们太薄了。如何更改每条线的粗细?

以下我的例子给了我这个:

enter image description here

if __name__ == '__main__':
    app = App()
    game_area = None

    labels = [pyglet.text.Label("0"*8,
              font_name = "Times New Roman",
              font_size=18,
              color = (255, 0, 0, 255),
              x = app.width // 2, 
              y = app.height // 2 - n,
              anchor_x = "center", 
              anchor_y = "center") for n in range(0, 100, 18)]

    @app.event
    def on_draw():
        app.clear()
        [label.draw() for label in labels]
        pyglet.graphics.draw(4, pyglet.gl.GL_LINES, 
            ("v2f", (0, 0, 0, app.height, app.width / 2, app.height, app.width / 2, 0))
        )

    pyglet.app.run()

3 个答案:

答案 0 :(得分:6)

您可以通过调用glLineWidth来更改行的宽度。这是通过像这样的pyglet实现的:

pyglet.gl.glLineWidth(desired_line_size)

如果需要不同厚度的线条,则必须在绘制每条线之前再次使用新的厚度调用该函数。否则,您可以在初始化中设置厚度并保留。

答案 1 :(得分:2)

我意识到实际上我必须绘制三角形以实现"厚度":

def draw_game_area():
        pyglet.graphics.draw(24, pyglet.gl.GL_TRIANGLES, 
            ("v2f", (ORIGIN, ORIGIN, ORIGIN, app.height, LINE_SEGMENT_THICKNESS, ORIGIN,
                     ORIGIN, app.height, LINE_SEGMENT_THICKNESS, app.height, LINE_SEGMENT_THICKNESS, ORIGIN,
                     ORIGIN, ORIGIN, ORIGIN, LINE_SEGMENT_THICKNESS, app.width / 2, ORIGIN,
                     ORIGIN, LINE_SEGMENT_THICKNESS, app.width / 2, LINE_SEGMENT_THICKNESS, app.width / 2, ORIGIN,
                     app.width / 2 - LINE_SEGMENT_THICKNESS, app.height, app.width / 2, app.height, app.width / 2, ORIGIN,
                     app.width / 2 - LINE_SEGMENT_THICKNESS, app.height, app.width / 2, ORIGIN, app.width / 2 - LINE_SEGMENT_THICKNESS, ORIGIN,
                     ORIGIN, app.height, app.width / 2, app.height, app.width / 2, app.height - LINE_SEGMENT_THICKNESS,
                     ORIGIN, app.height, ORIGIN, app.height - LINE_SEGMENT_THICKNESS, app.width / 2, app.height - LINE_SEGMENT_THICKNESS))
        )

enter image description here

答案 2 :(得分:0)

创建点并在它们之间绘制多边形以创建所需的厚度。 我创建了一个function on desmos,它需要两个点,并找到新的点以创建所需的厚度T

我创建了一个函数来对每个点执行此操作。这可能不是最有效的方法,但是可以。

此函数期望将pyglet.graphics.vertex_list().vertices作为vertices的输入,并将任何数字作为thickness的输入。

def add_thickness(vertices,thickness):
    from math import atan,sin,cos,pi

    output = list()

    i = 2
    while i < len(vertices):
        a = vertices[i-2:i]
        b = vertices[i:i+2]

        dy = b[1]-a[1]
        dx = b[0]-a[0]

        try:
            a = -(dx/dy)
            t = atan(a)
        except:
            t = pi/2

        output.append((thickness/2)*cos(t)+b[0]);output.append((thickness/2)*sin(t)+b[1])
        output.append(-(thickness/2)*cos(t)+b[0]);output.append(-(thickness/2)*sin(t)+b[1])

        i+=2

    return output

请注意,此函数不会为顶点列表中的第一个顶点创建点。