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
반응형
'프로그램' 카테고리의 다른 글
[파이썬] 문제 : 이미지의 영역의 RGB값 평균 (0) | 2024.07.28 |
---|---|
[파이썬] OpenGL의 3D 사각형을 시점 바꾸기 (2) | 2024.07.14 |
[파이썬] OpenGL 사용해서 삼각형, 사각형, 원 그리기 (0) | 2024.07.13 |
[파이썬] 문제 : 카페 메뉴 가격 출력 (0) | 2024.07.11 |
[파이썬] 문제 : 음식 재료 입력하면 만들 수 있는 음식 출력 (0) | 2024.07.11 |
댓글