在OpenGL中改变线条颜色

-2 投票
1 回答
30 浏览
提问于 2025-04-14 15:33

我尝试创建一个I形梁,现在我想把线条的颜色改成不同的,比如:可见的线条变成绿色,而那些不应该可见的线条变成粉色。不过,我想知道有没有办法在不大幅修改这个功能的情况下做到这一点?

def I_beam():
    glBegin(GL_LINES)
    #glColor3f(1,0,1)
    for edge in edges:
        for vertex in edge:
            glVertex3fv(vertices[vertex])
    glEnd()

如果需要的话,我可以提供完整的代码

import pygame
from pygame.locals import *
from OpenGL.GL import *
from OpenGL.GLU import *

m = 2

vertices = (# up
            (-0.4 * m, 0.2 * m, 0),  # A0
            (0.3 * m, 0.48 * m, 0),  # G1
            (0.1 * m, 0.2 * m, 0),   # M2
            (0.8 * m, 0.48 * m, 0),  # N3
            # down
            (-0.4 * m, -0.25 * m, 0),  # F4
            (0.3 * m, 0.05 * m, 0),   # Z5
            (0.1 * m, -0.25 * m, 0),   # K6
            (0.8 * m, 0.05 * m, 0),   # S7
            # front
            (-0.4 * m, 0.12 * m, 0),   # B8
            (-0.2 * m, 0.12 * m, 0),   # C9
            (-0.2 * m, -0.15 * m, 0),  # D10
            (-0.4 * m, -0.15 * m, 0),  # E11
            (0.1 * m, 0.12 * m, 0),    # L12
            (-0.1 * m, 0.12 * m, 0),   # H13
            (-0.1 * m, -0.15 * m, 0),  # I14
            (0.1 * m, -0.15 * m, 0),    # J15
            # back
            (0.3 * m, 0.4 * m, 0),  # O16
            (0.5 * m, 0.4 * m, 0),  # Q17
            (0.5 * m, 0.15 * m, 0),  # V18
            (0.3 * m, 0.15 * m, 0),  # W19
            (0.8 * m, 0.4 * m, 0),  # P20
            (0.6 * m, 0.4 * m, 0),  # R21
            (0.6 * m, 0.15 * m, 0),  # U22
            (0.8 * m, 0.15 * m, 0),  # T23
            )

edges = ((0, 1),
         (0, 2),
         (0, 8),
         (1, 3),
         (1, 16),
         (2, 3),
         (2, 12),
         (3, 20),
         (4, 5),
         (4, 6),
         (4, 11),
         (5, 7),
         (5, 19),
         (6, 7),
         (6, 15),
         (7, 23),
         (8, 16),
         (8, 9),
         (9, 17),
         (9, 10),
         (10, 18),
         (10, 11),
         (11, 19),
         (12, 20),
         (12, 13),
         (13, 21),
         (13, 14),
         (14, 22),
         (14, 15),
         (15, 23),
         (16, 17),
         (17, 18),
         (18, 19),
         (20, 21),
         (21, 22),
         (22, 23),)

def I_beam():
    glBegin(GL_LINES)
    glColor3f(1,0,1)
    for edge in edges:
        for vertex in edge:
            glVertex3fv(vertices[vertex])
    glEnd()

def main():
    pygame.init()
    display = (900,600)
    pygame.display.set_mode(display, DOUBLEBUF|OPENGL)

    gluPerspective(45, (display[0]/display[1]), 0.1, 50.0)

    glTranslatef(0.0,0.0, -5)

    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                quit()

        glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT)
        I_beam()
        pygame.display.flip()
  
main()

我试着用glColor()来改变颜色,但这样会把整个图形的颜色都改了。我搜索过,但还没找到解决办法。

1 个回答

1

在即时模式的OpenGL中,glColorglNormalglTexCoord等都是每个顶点的属性。它们的值会在顶点之间进行插值,也就是说,OpenGL会根据这些顶点的值来计算出中间的颜色、法线和纹理坐标。

你可以简单地这样做:

glBegin(GL_LINES)
for edge in edges:
    for vertex in edge:
        glColor3fv(colors[vertex])
        glVertex3fv(vertices[vertex])
glEnd()

撰写回答