[python] 파이썬과 PyOpenGL을 사용한 실시간 인터랙티브 3D 애니메이션

이번 포스트에서는 파이썬과 PyOpenGL을 사용하여 실시간으로 인터랙티브한 3D 애니메이션을 만드는 방법에 대해 알아보겠습니다. 파이썬은 간단하고 직관적인 프로그래밍 언어이며, PyOpenGL은 파이썬에서 OpenGL을 사용할 수 있도록 하는 라이브러리입니다. 함께 사용하면 3D 그래픽을 만들고 조작하는 것이 쉬워집니다.

필요한 패키지 설치

먼저, 필요한 패키지를 설치해야 합니다. PyOpenGL 패키지를 설치하려면 다음 명령어를 사용하세요:

pip install PyOpenGL

OpenGL 초기화

OpenGL을 사용하기 위해 초기화 과정이 필요합니다. 다음은 간단한 OpenGL 초기화 코드의 예입니다:

import OpenGL.GL as gl
import OpenGL.GLUT as glut

def init():
    glut.glutInit()
    glut.glutInitDisplayMode(glut.GLUT_SINGLE | glut.GLUT_RGB)
    glut.glutInitWindowSize(500, 500)
    glut.glutCreateWindow("3D Animation")
    gl.glClearColor(0.0, 0.0, 0.0, 0.0)
    glut.glutDisplayFunc(display)
    glut.glutIdleFunc(display)

위의 코드에서 glutInit() 함수는 OpenGL을 초기화하고, glutInitDisplayMode() 함수는 디스플레이 모드를 설정합니다. glutInitWindowSize() 함수는 창의 크기를 지정하고, glutCreateWindow() 함수는 창을 생성합니다. glClearColor() 함수는 배경색을 지정하는 데 사용됩니다. glutDisplayFunc() 함수는 화면을 다시 그리는 함수를 등록하고, glutIdleFunc() 함수는 아무 작업이 없을 때에도 화면을 다시 그려주는 함수를 등록합니다.

3D 모델 생성

이제 3D 모델을 생성하는 코드를 추가해보겠습니다. 다음은 간단한 큐브 모델을 생성하는 코드의 예입니다:

def draw_cube():
    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 = [
        [0, 1],
        [1, 2],
        [2, 3],
        [3, 0],
        [4, 5],
        [5, 6],
        [6, 7],
        [7, 4],
        [0, 4],
        [1, 5],
        [2, 6],
        [3, 7]
    ]
    
    gl.glBegin(gl.GL_LINES)
    for edge in edges:
        for vertex in edge:
            gl.glVertex3fv(vertices[vertex])
    gl.glEnd()

위의 코드에서 vertices 리스트는 각 꼭지점의 좌표를 나타내고, edges 리스트는 각 선분의 시작과 끝 꼭지점의 인덱스를 나타냅니다. glBegin() 함수와 glEnd() 함수 사이에 선분을 그리는 코드를 작성하면 됩니다.

애니메이션 만들기

마지막으로 애니메이션을 만들기 위해 업데이트 로직을 추가해보겠습니다. 다음은 큐브를 회전하는 간단한 애니메이션 코드의 예입니다:

angle = 0

def update():
    global angle
    angle += 1

def display():
    gl.glClear(gl.GL_COLOR_BUFFER_BIT)
    gl.glLoadIdentity()
    gl.glTranslatef(0.0, 0.0, -5.0)
    gl.glRotatef(angle, 1.0, 1.0, 1.0)
    draw_cube()
    gl.glFlush()

def main():
    init()
    glut.glutMainLoop()

if __name__ == "__main__":
    main()

위의 코드에서 angle 변수는 회전 각도를 나타냅니다. update() 함수에서 angle을 증가시켜 회전 각도를 업데이트하고, display() 함수에서 glRotatef() 함수를 사용하여 모델을 회전시킵니다. glTranslate() 함수를 사용하여 모델을 화면에서 이동시킬 수 있습니다.

실행하기

이제 모든 준비가 끝났으므로 파이썬 스크립트를 실행해보세요. 큐브가 실시간으로 회전하는 3D 애니메이션을 확인할 수 있을 것입니다.

이 글에서는 파이썬과 PyOpenGL을 사용하여 실시간 인터랙티브 3D 애니메이션을 만드는 방법을 소개했습니다. PyOpenGL에는 다양한 그래픽 기능을 사용할 수 있으며, 더 복잡한 모델링과 애니메이션도 가능합니다. 자세한 내용은 PyOpenGL 공식 문서를 참고하시기 바랍니다.

참고: PyOpenGL 공식 문서

Happy coding!