[python] 파이썬으로 OpenGL을 이용한 물리 시뮬레이션 구현하기

이 글에서는 파이썬과 OpenGL을 사용하여 물리 시뮬레이션을 구현하는 방법에 대해 알아보겠습니다. 물리 시뮬레이션은 현실 세계의 물리 법칙을 컴퓨터 그래픽스로 모델링하는 것으로, 예를 들어 운동, 중력, 충돌 등의 현상을 시각적으로 표현할 수 있습니다.

OpenGL과 파이썬

OpenGL은 2D 및 3D 그래픽을 렌더링하기 위한 오픈 그래픽스 라이브러리입니다. 파이썬에서 OpenGL을 사용하기 위해서는 PyOpenGL 라이브러리를 설치해야 합니다. PyOpenGL은 다양한 OpenGL 함수 및 기능에 대한 파이썬 바인딩을 제공하여 파이썬으로 OpenGL을 사용할 수 있게 해줍니다.

물리 시뮬레이션 구현하기

먼저, PyOpenGL 라이브러리를 설치해야 합니다. 다음의 명령어를 사용하여 설치할 수 있습니다.

pip install PyOpenGL

물리 시뮬레이션을 구현하기 위해 필요한 기능들을 다음과 같이 임포트합니다.

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

다음으로, OpenGL 초기화 및 창 생성을 위한 함수를 작성합니다.

def init():
    glClearColor(0.0, 0.0, 0.0, 1.0)
    glMatrixMode(GL_PROJECTION)
    gluOrtho2D(0, 500, 0, 500)
    
def create_window():
    glutInit()
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB)
    glutInitWindowSize(500, 500)
    glutInitWindowPosition(0, 0)
    glutCreateWindow("물리 시뮬레이션")

시뮬레이션을 구현하기 위해 필요한 객체들을 클래스로 정의합니다.

class Particle:
    def __init__(self, x, y, size, mass):
        self.x = x
        self.y = y
        self.size = size
        self.mass = mass
        self.vx = 0
        self.vy = 0
        self.ax = 0
        self.ay = 0

    def draw(self):
        glBegin(GL_POLYGON)
        glVertex2f(self.x - self.size / 2, self.y - self.size / 2)
        glVertex2f(self.x + self.size / 2, self.y - self.size / 2)
        glVertex2f(self.x + self.size / 2, self.y + self.size / 2)
        glVertex2f(self.x - self.size / 2, self.y + self.size / 2)
        glEnd()

이제 물리 시뮬레이션 로직을 작성합니다.

def update():
    for particle in particles:
        particle.ax = 0
        particle.ay = -9.8  # 중력 가속도
        
        # 속도와 위치를 업데이트
        particle.vx += particle.ax
        particle.vy += particle.ay
        particle.x += particle.vx
        particle.y += particle.vy

def draw():
    glClear(GL_COLOR_BUFFER_BIT)
    for particle in particles:
        particle.draw()
    glFlush()

def main():
    global particles
    
    particles = []
    particles.append(Particle(250, 250, 50, 10))  # 초기 위치, 크기 및 질량 설정
    
    glutDisplayFunc(draw)
    glutIdleFunc(update)
    init()
    create_window()
    glutMainLoop()

if __name__ == '__main__':
    main()

결과 확인

위의 코드를 실행하면 파이썬으로 구현한 물리 시뮬레이션 창이 열리게 됩니다. 초기 위치, 크기, 질량 등을 변경하면 다양한 시뮬레이션을 구현할 수 있습니다. 파티클을 이용하여 중력에 따라 자유낙하를 시뮬레이션하는 예제입니다.

결론

이 글에서는 파이썬과 OpenGL을 사용하여 물리 시뮬레이션을 구현하는 방법을 소개했습니다. 이를 통해 파이썬을 사용하여 간단한 물리 시뮬레이션을 만들 수 있다는 것을 알 수 있습니다. 물리 시뮬레이션은 게임 개발, 애니메이션 제작 등 여러 분야에서 활용할 수 있는 유용한 기술입니다.

참고 자료