파이썬용 2D 물리엔진중 하나인 Pymunk에 관한 기본 예제 코드를 소개하고자 합니다.



사전 설치 요구사항


pymunk 모듈 사용시, 추가적인 pymunk 모듈 설치를 필요로 합니다.

pip install pymunk


기본 예제


(0, 50) 좌표에 위치한 박스가 중력에 의해 지면을 향해 떨어져 지면에 부딧혀 멈출 때까지의 박스의 좌표가 출력되는(무려 텍스트로!) 예제 코드입니다. Pymunk 자체에는 그래픽 표현 기능이 없으므로 좌표 계산만 해줍니다. 이것을 화면 상으로 표현하는 것은 이후의 예제를 통하여 알아보겠습니다.

# -*- coding: utf-8 -*-

import pymunk

# 시뮬레이션 공간을 생성하고, 중력의 방향 및 크기를 설정한다.
space = pymunk.Space()
space.gravity = 0, -1000

# 두 점을 있는 직선을 나타내는 Segment 요소를 사용하여 지면을 생성한다.
# 길이 100, 두께 1인 직선을 생성하여 (0, 0)에 위치시킨다.
ground = pymunk.Body(body_type=pymunk.Body.STATIC)
ground.position = 0, 0
 
ground_shape = pymunk.Segment(ground, (-50, 0), (50, 0), 1)
space.add(ground_shape)

# (0, 50) 위치에 (10, 10) 크기의 박스를 생성한다.
body = pymunk.Body(1, 1666)  # 질량, 모멘트를 지정한다.
body.position = 0, 50
 
poly = pymunk.Poly.create_box(body, (10, 10))
space.add(body, poly)

# 1초 동안 1.0 / 60 초씩 진행시키며 박스의 좌표를 출력한다.
for i in range(60):
    space.step(1.0 / 60)
    print(body.position)


결과 캡처

Vec2d(0.0, 50.0)
Vec2d(0.0, 49.72222222222222)
Vec2d(0.0, 49.166666666666664)
Vec2d(0.0, 48.33333333333333)
Vec2d(0.0, 47.222222222222214)
Vec2d(0.0, 45.83333333333333)
Vec2d(0.0, 44.166666666666664)
Vec2d(0.0, 42.22222222222222)
Vec2d(0.0, 40.0)
Vec2d(0.0, 37.5)
Vec2d(0.0, 34.72222222222222)
Vec2d(0.0, 31.666666666666664)
Vec2d(0.0, 28.333333333333332)
Vec2d(0.0, 24.72222222222222)
Vec2d(0.0, 20.833333333333332)
Vec2d(0.0, 16.666666666666664)
Vec2d(0.0, 12.222222222222221)
Vec2d(0.0, 7.5)
Vec2d(0.0, 2.5)
Vec2d(0.0, 2.886956552845999)
Vec2d(0.0, 3.2330661044876274)
Vec2d(0.0, 3.542236920798546)
Vec2d(0.0, 3.8179830207826186)
Vec2d(0.0, 4.065083408185165)
Vec2d(0.0, 4.286249625299963)
Vec2d(0.0, 4.483745226989828)
Vec2d(0.0, 4.659603964972919)
Vec2d(0.0, 4.81565131414432)
Vec2d(0.0, 4.95352387113101)
Vec2d(0.0, 5.074686834357406)
Vec2d(0.0, 5.180449754301324)
Vec2d(0.0, 5.273414633437768)
Vec2d(0.0, 5.356441970464741)
Vec2d(0.0, 5.431683496733098)
Vec2d(0.0, 5.500322361070223)
Vec2d(0.0, 5.562826033647434)
Vec2d(0.0, 5.619373494273605)
Vec2d(0.0, 5.670188929782226)
Vec2d(0.0, 5.7156761612570905)
Vec2d(0.0, 5.756385891638544)
Vec2d(0.0, 5.792908604984999)
Vec2d(0.0, 5.822032616838716)
Vec2d(0.0, 5.844112775433398)
Vec2d(0.0, 5.859454641289297)
Vec2d(0.0, 5.868318121528639)
Vec2d(0.0, 5.870920746762018)
Vec2d(0.0, 5.86744062807873)
Vec2d(0.0, 5.858019128912104)
Vec2d(0.0, 5.897059737778078)
Vec2d(0.0, 5.925671363059304)
Vec2d(0.0, 5.909019468605577)
Vec2d(0.0, 5.9310174562872575)
Vec2d(0.0, 5.94492949182134)
Vec2d(0.0, 5.953966287149509)
Vec2d(0.0, 5.958854474347584)
Vec2d(0.0, 5.959613136913926)
Vec2d(0.0, 5.961507841637967)
Vec2d(0.0, 5.964013945366503)
Vec2d(0.0, 5.9657250791899505)
Vec2d(0.0, 5.966229061776563)


참고 자료

<테스트 환경> 
- OS : Windows 7 
- Python 버전 : 3.6
- Pymunk 버전 : 5.3.2
,