Как нарисовать линейный куб с помощью OpenGL? - PullRequest
1 голос
/ 29 мая 2020

Я пытаюсь нарисовать куб из линий.

А вот мой код. Это просто дает мне белую рамку, внутри которой ничего нет. Ничего не произошло. Что я здесь делаю не так? Это проблема с порядком вызова функций или что-то не так с проекцией?


def myInit():
    glClearColor(0.0, 0.0, 0.0, 1.0) 
    glColor3f(0.2, 0.5, 0.4)
    gluPerspective(45, 1.33, 0.1, 50.0)


vertices= (
    (100, -100, -100),
    (100, 100, -100),
    (-100, 100, -100),
    (-100, -100, -100),
    (100, -100, 100),
    (100, 100, 100),
    (-100, -100, 100),
    (-100, 100, 100)
    )

edges = (
    (0,1),
    (0,3),
    (0,4),
    (2,1),
    (2,3),
    (2,7),
    (6,3),
    (6,4),
    (6,7),
    (5,1),
    (5,4),
    (5,7)
    )


def Display():
    glBegin(GL_LINES)
    for edge in edges:
        for vertex in edge:
            glVertex3fv(vertices[vertex])
    glEnd()

glutInit()
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB)   
glutInitWindowSize(800, 600)  
myInit()
glutDisplayFunc(Display) 
glutMainLoop()

1 Ответ

0 голосов
/ 29 мая 2020

Вся геометрия, отсутствующая в усеченном виде , обрезается. Размер куба i 200x200x200. Вы должны создать достаточно большую усеченную пирамиду.

Например, установите матрицу перспективной проекции gluPerspective с дальней плоскостью 1000.0. Матрица проекции предназначена для установки на текущую матрицу проекции (GL_PROJECTION). См. glMatrixMode:

glMatrixMode(GL_PROJECTION)
glLoadIdentity()
gluPerspective(45, 1.33, 0.1, 1000.0) 


Translate ([`glTranslate`](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glTranslate.xml)) the model along the negative z axis, in between the near plane (0.1) and far (plane). The model or view matrix has to be set to the current model view matrix (`GL_MODELVIEW`):

```py
glMatrixMode(GL_MODELVIEW)
glLoadIdentity()
glTranslate(0, 0, -500)

Очищать дисплей в каждом кадре на glClear:

def Display():
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)

    # [...]

Меняет местами буферы текущее окно с двойной буферизацией на glutSwapBuffers и непрерывно обновлять отображение, вызывая glutPostRedisplay.

def Display():
    # [...]

    glutSwapBuffers()
    glutPostRedisplay()

См. пример:

def init():
    glClearColor(0.0, 0.0, 0.0, 1.0) 

    glMatrixMode(GL_PROJECTION)
    glLoadIdentity()
    gluPerspective(45, 1.33, 0.1, 1000.0)

    glMatrixMode(GL_MODELVIEW)
    glLoadIdentity()
    glTranslate(0, 0, -500)

def Display():
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)

    glColor3f(0.2, 0.5, 0.4)
    glBegin(GL_LINES)
    for edge in edges:
        for vertex in edge:
            glVertex3fv(vertices[vertex])
    glEnd()

    glutSwapBuffers()
    glutPostRedisplay()
...