[python] PyOpenGL을 활용하여 3D 터레인 생성하고 가시화하기

이번 블로그 포스트에서는 PyOpenGL 라이브러리를 사용하여 3D 터레인을 생성하고 가시화하는 방법에 대해 알아보겠습니다.

PyOpenGL이란?

PyOpenGL은 Python 언어로 작성된 오픈소스 그래픽스 라이브러리입니다. 이 라이브러리를 사용하면 OpenGL을 통해 2D 및 3D 그래픽스를 생성하고 조작할 수 있습니다. PyOpenGL은 Python에 대한 공식적인 OpenGL 바인딩으로 알려져 있으며, 다양한 플랫폼(Windows, Linux, macOS 등)에서 사용할 수 있습니다.

3D 터레인 생성하기

먼저, PyOpenGL을 설치해야 합니다. 아래 명령어를 사용하여 설치할 수 있습니다.

pip install PyOpenGL

터레인을 생성하기 위해 먼저 필요한 모듈들을 import 해야 합니다. 아래와 같이 코드를 작성해주세요.

from OpenGL.GL import *
from OpenGL.GLUT import *
from OpenGL.GLU import *

다음으로, 터레인을 생성할 OpenGL 윈도우를 만들어 주어야 합니다. glutInit() 메서드를 사용하여 윈도우를 초기화하고, glutInitWindowSize() 메서드를 사용하여 윈도우의 크기를 지정합니다. 마지막으로, glutCreateWindow() 메서드를 호출하여 윈도우를 생성합니다.

def create_window():
    glutInit()
    glutInitWindowSize(800, 600)
    glutCreateWindow(b"3D Terrain with PyOpenGL")

프로그램이 종료될 때 호출되는 cleanup 함수를 작성하겠습니다. 여기에서는 OpenGL을 종료시키는 역할을 합니다.

def cleanup():
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
    glLoadIdentity()
    glutSwapBuffers()
    glutLeaveMainLoop()

다음으로, 터레인의 높이 맵을 생성해보겠습니다. 이 높이 맵은 2차원 배열을 사용하여 표현됩니다. 터레인의 각 점의 높이를 랜덤하게 생성하여 배열에 저장합니다.

def generate_height_map(width, height):
    height_map = []
    for i in range(height):
        row = []
        for j in range(width):
            height = random.uniform(0, 1)
            row.append(height)
        height_map.append(row)
    return height_map

이제 create_terrain() 함수를 작성하여 터레인을 생성하고 가시화할 차례입니다. 이 함수에서는 터레인의 각 점을 기준으로 정점의 좌표와 색상을 지정합니다. 이를 위해 OpenGL의 glBegin()glEnd() 함수를 사용합니다.

def create_terrain():
    width = 100
    height = 100
    height_map = generate_height_map(width, height)
    
    glPointSize(2.0)
    glBegin(GL_POINTS)
    for i in range(height):
        for j in range(width):
            x = j / float(width)
            y = height_map[i][j]
            z = i / float(height)
            
            glColor3f(y, y, y)
            glVertex3f(x, y, z)
    glEnd()

마지막으로, OpenGL의 렌더링 함수인 display()를 작성합니다. 여기에서는 터레인을 가시화하고, cleanup 함수를 호출하여 OpenGL을 종료합니다.

def display():
    glClearColor(0.0, 0.0, 0.0, 1.0)
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
    glLoadIdentity()
    
    create_terrain()
    
    glutSwapBuffers()

이제 create_window()display()를 호출하여 터레인을 가시화할 수 있습니다. 아래와 같이 코드를 작성해주세요.

if __name__ == "__main__":
    create_window()
    
    glutDisplayFunc(display)
    glutIdleFunc(display)
    
    glutSetOption(GLUT_ACTION_ON_WINDOW_CLOSE, GLUT_ACTION_GLUTMAINLOOP_RETURNS)
    glutCloseFunc(cleanup)
    
    glEnable(GL_DEPTH_TEST)
    
    glutMainLoop()

결론

PyOpenGL을 활용하여 3D 터레인을 생성하고 가시화하는 방법에 대해 알아보았습니다. 이를 통해 다양한 3D 그래픽스 애플리케이션을 구현할 수 있습니다. PyOpenGL의 다양한 기능과 옵션을 활용하여 자신만의 그래픽스 애플리케이션을 개발해보세요.