[python] PyOpenGL을 사용하여 3D 터레인 랜더링 및 가시화하기

이번에는 PyOpenGL을 사용하여 3D 터레인을 랜더링하고 가시화하는 방법에 대해 알아보겠습니다. PyOpenGL은 Python을 위한 OpenGL 바인딩이며, 3D 그래픽을 만드는 데 사용됩니다. 터레인은 지형 데이터를 나타내는데 흔히 사용되며, 이를 3D로 랜더링하고 가시화하는 방법에 대해 실습해보겠습니다.

필요한 패키지 설치하기

터미널 또는 명령 프롬프트를 열고 다음 명령을 실행하여 필요한 패키지를 설치합니다.

pip install PyOpenGL PyOpenGL-accelerate

OpenGL 컨텍스트 설정하기

먼저 PyOpenGL을 사용하기 위해 OpenGL 컨텍스트를 설정해야 합니다. 다음 코드는 OpenGL 컨텍스트를 설정하는 방법을 보여줍니다.

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

def init():
    glutInit()  # OpenGL 초기화
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB)
    glutInitWindowSize(800, 600)
    glutCreateWindow(b"Terrain Rendering with PyOpenGL")

init()

터레인 데이터 불러오기

3D 터레인을 랜더링하기 위해서는 터레인의 지형 데이터를 불러와야 합니다. 예를 들어, 텍스처로 된 높이 맵을 사용하여 터레인을 생성할 수 있습니다. 데이터를 불러오는 방법은 다양하게 존재하지만, 여기에서는 예시로 NumPy를 사용하여 2D 배열로 데이터를 생성하는 방법을 보여드리겠습니다.

import numpy as np

# 터레인 데이터 생성
terrain_data = np.random.randint(0, 100, size=(100, 100))

# 터레인 데이터 정규화
normalized_data = (terrain_data - np.min(terrain_data)) / (np.max(terrain_data) - np.min(terrain_data))

터레인 랜더링하기

이제 터레인 데이터를 사용하여 3D 터레인을 랜더링해보겠습니다. 다음 코드는 OpenGL을 사용하여 터레인을 그리는 함수를 정의하는 예시입니다.

def draw_terrain():
    glBegin(GL_TRIANGLE_STRIP)
    for x in range(len(normalized_data)-1):
        for y in range(len(normalized_data[x])-1):
            v0 = [x, normalized_data[x][y], y]
            v1 = [x+1, normalized_data[x+1][y], y]
            v2 = [x, normalized_data[x][y+1], y+1]
            v3 = [x+1, normalized_data[x+1][y+1], y+1]
            glVertex3fv(v0)
            glVertex3fv(v1)
            glVertex3fv(v2)
            glVertex3fv(v3)
    glEnd()

def render():
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
    glLoadIdentity()
    glTranslatef(-50, -1, -50)  # 터레인 위치 및 조명 설정
    glColor3f(0.2, 0.8, 0.2)  # 터레인 색상 설정
    draw_terrain()
    glutSwapBuffers()

glutDisplayFunc(render)
glutMainLoop()

실행하기

코드를 실행하기 전에 터미널 또는 명령 프롬프트에서 아래 명령으로 실행합니다.

python main.py

실행하면 OpenGL 윈도우가 열리고, 3D 터레인이 랜더링되고 가시화됩니다.

결론

이번 포스트에서는 PyOpenGL을 사용하여 3D 터레인을 랜더링하고 가시화하는 방법을 살펴보았습니다. PyOpenGL을 이용하여 3D 그래픽을 구현할 수 있는 다양한 기능을 사용할 수 있으며, 터레인 뿐만 아니라 다른 3D 객체도 랜더링할 수 있습니다. PyOpenGL 공식 문서와 예제를 참고하여 더 많은 기능을 살펴보세요.

참고 자료