Возникают проблемы с пониманием вершин и ребер pyOpenGl - PullRequest
0 голосов
/ 12 мая 2018

Итак, я пытаюсь узнать об основополагающем трехмерном моделировании в python, но я изо всех сил пытаюсь понять, как расположены вершины и ребра и что делают числа, которые я передаю. Вот пример:

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

"""
- A Cube has 8 Nodes/Verticies
- 12 Lines/connections
- 6 Sides
"""

vertices = (
    (1, -1, -1),
    (1, 1, -1),
    (-1, 1, -1),
    (-1, -1, -1),
    (1, -1, 1),
    (1, 1, 1),
    (-1, -1, 1),
    (-1, 1, 1)
)

edges = ( #Contains vertexes/nodes
    (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 Cube():
    glBegin(GL_LINES)

    for edge in edges:
        for vertex in edge:
            glVertex3fv(vertices[vertex]) #Draws vertex's in position given according to vertices array
    glEnd()


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

    gluPerspective(35, (display[0]/display[1]), 0.1, 50.0) #FOV, aspect ratio. clipping plane

    glTranslatef(0.0, 0.0, -5) #X,Y,Z -5 to zoom out on z axis
    glRotatef(20, 0, 0, 0) #Degrees, x,y,z

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

        glRotatef(1, 3, 1, 1)
        glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT) #Clears the screen

        Cube()
        pygame.display.flip() #Cant use update
        pygame.time.wait(10)

main()




pygame.quit()
quit()

Я сделал это после замечательного урока от sentdex Open GL и Python . Однако мне трудно понять, почему он вводит числа, которые он делает для вершин. Если бы кто-нибудь мог объяснить систему нумерации, это было бы очень важно! Спасибо!

1 Ответ

0 голосов
/ 12 мая 2018

vertices представляет собой массив из 8 различных трехмерных декартовых координат , с индексами от 0 до 7:

vertices = (
    ( 1, -1, -1),   # 0
    ( 1,  1, -1),   # 1
    (-1,  1, -1),   # 2
    (-1, -1, -1),   # 3
    ( 1, -1,  1),   # 4
    ( 1,  1,  1),   # 5
    (-1, -1,  1),   # 6
    (-1,  1,  1)    # 7
)

Координаты определяют угловые точки куба.

edges - это массив, который определяет ребра куба. Каждая пара индексов в массиве определяет линию от одной угловой точки к другой.

например. (0, 1) определяет ребро от (1, -1, -1) до (1, 1, -1).

Следующая функция берет каждую пару индексов массива, считывает 2 координаты, которые принадлежат индексам, и рисует линию от первой координаты до второй. Для этого используется OpenGL Primitive type GL_LINE, который рисует связку отрезков между двумя последовательными точками.

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