본문 바로가기
프로그램

[파이썬] OpenGL 사용해서 3D 사각형 그리기

by 오디세이99 2024. 7. 14.
728x90
반응형
import pygame                            # Pygame 모듈을 임포트
from pygame.locals import *              # Pygame 로컬 상수 임포트
from OpenGL.GL import *                  # OpenGL 함수 임포트
from OpenGL.GLU import *                 # OpenGL 유틸리티 함수 임포트

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),  # 0번 꼭짓점과 1번 꼭짓점 연결 (오른쪽 뒤 아래 -> 오른쪽 뒤 위)
    (1, 2),  # 1번 꼭짓점과 2번 꼭짓점 연결 (오른쪽 뒤 위 -> 왼쪽 뒤 위)
    (2, 3),  # 2번 꼭짓점과 3번 꼭짓점 연결 (왼쪽 뒤 위 -> 왼쪽 뒤 아래)
    (3, 0),  # 3번 꼭짓점과 0번 꼭짓점 연결 (왼쪽 뒤 아래 -> 오른쪽 뒤 아래)
    (4, 5),  # 4번 꼭짓점과 5번 꼭짓점 연결 (오른쪽 앞 아래 -> 오른쪽 앞 위)
    (5, 7),  # 5번 꼭짓점과 7번 꼭짓점 연결 (오른쪽 앞 위 -> 왼쪽 앞 위)
    (7, 6),  # 7번 꼭짓점과 6번 꼭짓점 연결 (왼쪽 앞 위 -> 왼쪽 앞 아래)
    (6, 4),  # 6번 꼭짓점과 4번 꼭짓점 연결 (왼쪽 앞 아래 -> 오른쪽 앞 아래)
    (0, 4),  # 0번 꼭짓점과 4번 꼭짓점 연결 (오른쪽 뒤 아래 -> 오른쪽 앞 아래)
    (1, 5),  # 1번 꼭짓점과 5번 꼭짓점 연결 (오른쪽 뒤 위 -> 오른쪽 앞 위)
    (2, 7),  # 2번 꼭짓점과 7번 꼭짓점 연결 (왼쪽 뒤 위 -> 왼쪽 앞 위)
    (3, 6)   # 3번 꼭짓점과 6번 꼭짓점 연결 (왼쪽 뒤 아래 -> 왼쪽 앞 아래)
)

def draw_cube():                         # 큐브를 그리는 함수 정의
    glBegin(GL_LINES)                    # 선 그리기 시작
    for edge in edges:                   # 각 모서리에 대해
        for vertex in edge:              # 모서리의 꼭짓점들에 대해
            glVertex3fv(vertices[vertex]) # 꼭짓점 좌표 설정
    glEnd()                              # 그리기 종료

def main():                              # 메인 함수 정의
    pygame.init()                        # Pygame 초기화
    display = (800, 600)                 # 창 크기 설정
    pygame.display.set_mode(display, DOUBLEBUF | OPENGL)  # OpenGL 창 생성
    gluPerspective(45, (display[0] / display[1]), 0.1, 50.0)  # 3D 투시 설정
    glTranslatef(0.0, 0.0, -5)           # 카메라 위치 설정
    glRotatef(25, 2, 1, 0)               # 카메라 회전 (x축과 y축으로 25도 회전)

    while True:                          # 무한 루프 시작
        for event in pygame.event.get(): # 이벤트 처리
            if event.type == pygame.QUIT: # 창 닫기 이벤트 처리
                pygame.quit()            # Pygame 종료
                return                   # 함수 종료

        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)  # 화면 지우기
        draw_cube()                      # 큐브 그리기
        pygame.display.flip()            # 화면 업데이트
        pygame.time.wait(10)             # 잠시 대기

if __name__ == "__main__":               # 메인 함수 실행 조건
    main()                               # 메인 함수 실행

 

조금더 쉽게 그리도록  함.

큐브의 최초 위치는 (0, 0, 0)이고, 크기를 2로 설정한 것.

import pygame                            # Pygame 모듈을 임포트
from pygame.locals import *              # Pygame 로컬 상수 임포트
from OpenGL.GL import *                  # OpenGL 함수 임포트
from OpenGL.GLU import *                 # OpenGL 유틸리티 함수 임포트

def generate_cube_vertices(size):        # 큐브의 꼭짓점을 생성하는 함수 정의
    s = size / 2.0                       # 크기를 반으로 나눔
    return [                             # 큐브의 8개 꼭짓점 좌표 반환
        ( s, -s, -s),                    # 오른쪽 아래 뒤
        ( s,  s, -s),                    # 오른쪽 위 뒤
        (-s,  s, -s),                    # 왼쪽 위 뒤
        (-s, -s, -s),                    # 왼쪽 아래 뒤
        ( s, -s,  s),                    # 오른쪽 아래 앞
        ( s,  s,  s),                    # 오른쪽 위 앞
        (-s, -s,  s),                    # 왼쪽 아래 앞
        (-s,  s,  s)                     # 왼쪽 위 앞
    ]

def generate_cube_edges():               # 큐브의 모서리를 생성하는 함수 정의
    return [                             # 큐브의 12개 모서리를 정의하는 꼭짓점 쌍 반환
        (0, 1),                          # 0번 꼭짓점과 1번 꼭짓점 연결 (오른쪽 뒤 아래 -> 오른쪽 뒤 위)
        (1, 2),                          # 1번 꼭짓점과 2번 꼭짓점 연결 (오른쪽 뒤 위 -> 왼쪽 뒤 위)
        (2, 3),                          # 2번 꼭짓점과 3번 꼭짓점 연결 (왼쪽 뒤 위 -> 왼쪽 뒤 아래)
        (3, 0),                          # 3번 꼭짓점과 0번 꼭짓점 연결 (왼쪽 뒤 아래 -> 오른쪽 뒤 아래)
        (4, 5),                          # 4번 꼭짓점과 5번 꼭짓점 연결 (오른쪽 앞 아래 -> 오른쪽 앞 위)
        (5, 7),                          # 5번 꼭짓점과 7번 꼭짓점 연결 (오른쪽 앞 위 -> 왼쪽 앞 위)
        (7, 6),                          # 7번 꼭짓점과 6번 꼭짓점 연결 (왼쪽 앞 위 -> 왼쪽 앞 아래)
        (6, 4),                          # 6번 꼭짓점과 4번 꼭짓점 연결 (왼쪽 앞 아래 -> 오른쪽 앞 아래)
        (0, 4),                          # 0번 꼭짓점과 4번 꼭짓점 연결 (오른쪽 뒤 아래 -> 오른쪽 앞 아래)
        (1, 5),                          # 1번 꼭짓점과 5번 꼭짓점 연결 (오른쪽 뒤 위 -> 오른쪽 앞 위)
        (2, 7),                          # 2번 꼭짓점과 7번 꼭짓점 연결 (왼쪽 뒤 위 -> 왼쪽 앞 위)
        (3, 6)                           # 3번 꼭짓점과 6번 꼭짓점 연결 (왼쪽 뒤 아래 -> 왼쪽 앞 아래)
    ]

def draw_cube(vertices, edges):          # 큐브를 그리는 함수 정의
    glBegin(GL_LINES)                    # 선 그리기 시작
    for edge in edges:                   # 각 모서리에 대해
        for vertex in edge:              # 모서리의 꼭짓점들에 대해
            glVertex3fv(vertices[vertex]) # 꼭짓점 좌표 설정
    glEnd()                              # 그리기 종료

def main():                              # 메인 함수 정의
    try:
        pygame.init()                    # Pygame 초기화
        display = (800, 600)             # 창 크기 설정
        pygame.display.set_mode(display, DOUBLEBUF | OPENGL)  # OpenGL 창 생성
        gluPerspective(45, (display[0] / display[1]), 0.1, 50.0)  # 3D 투시 설정
        glTranslatef(0.0, 0.0, -5)       # 카메라 위치 설정
        glRotatef(25, 2, 1, 0)           # 카메라 회전 (x축과 y축으로 25도 회전)

        vertices = generate_cube_vertices(2)  # 크기가 2인 큐브 생성
        edges = generate_cube_edges()    # 큐브의 모서리 생성

        while True:                      # 무한 루프 시작
            for event in pygame.event.get():  # 이벤트 처리
                if event.type == pygame.QUIT: # 창 닫기 이벤트 처리
                    pygame.quit()        # Pygame 종료
                    return               # 함수 종료

            glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)  # 화면 지우기
            draw_cube(vertices, edges)   # 큐브 그리기
            pygame.display.flip()        # 화면 업데이트
            pygame.time.wait(10)         # 잠시 대기
    except Exception as e:               # 예외 발생 시 처리
        print(f"An error occurred: {e}") # 오류 메시지 출력
        input("Press Enter to exit...")  # 종료 전 대기

if __name__ == "__main__":               # 메인 함수 실행 조건
    main()                               # 메인 함수 실행
728x90
반응형

댓글