파이썬으로 게임을 개발하는건 어렵지 않다. pygame과 같이 라이브러리 생태계가 잘 구축되어 있고 파이썬 특유의 쉬운 문법이 게임 개발을 더욱 편리하게 해준다. 그러나 파이썬에서는 pygame 말고 사용하기 편한 게임 라이브러리는 드물다. 특히 3d에 특화되어 있으면서 유명한 라이브러리는 들어보지 못했다. 그중에서 오늘 소개할 Panda3d가 문서화 및 커뮤니티, 사용성에서 어느정도 인지도가 있는 수준이다.
다만, Panda3d의 경우 초보자용이 아니다. 적어도 파이썬 문법을 어느정도 알고있는 중급자 이상이어야 한다고 문서에서는 말한다. 심지어 한국어 자료는 전무하다. 어느정도나면, 블로그 글 한 두개 정도만 검색될 뿐이다. 따라서 Panda3d를 제대로 사용하려면 또 다른 언어에 익숙해야 한다. 바로 영어.
파이썬에서 3D를 다룰 수 있는 라이브러리다. 디즈니에서 대규모 온라인 테마파크를 만들기 위해 만든 엔진이다. 2002년에 처음 오픈소스화 되었고 BSD 라이선스를 채택한다. 엔진 자체는 C++로 개발되었지만, 메인은 Python이다. 물론 C++용으로도 지원한다.
멀티 플랫폼을 지원한다. 사실 이것만으로도 Panda3의 엄청난 장점인데, 윈도우 게임을 개발하면서 동시에 맥용 리눅스용으로도 출시할 수 있다는 점이다.
동시에 그래픽 성능 또한 훌륭하다. 다른 상용 엔진과 비교했을때 그래픽 자원을 효율적으로 사용할 수 있는데, 이는 C++로 작성된 엔진 덕분에 가능하다.
다만, 이같은 저수준(low level)의 API는 개발자의 역량에 크게 좌우한다. 잘 사용한다면 뛰어난 확장성과 향상된 그래픽으로 개발 가능하지만 기능에 대한 이해 없이 단순 개발로 원하는 결과를 도출시키고자 한다면 분명 그 한계에 부딛치고 만다. 이 점을 공식문서에도 "Panda3D is not a Beginner’s Tool or a Toy" 라고 명시하며, API나 Tree구조가 뭔지 모르는 사람들에게는 어려울 수 있다고 강조한다.
Panda3D도 엄연한 게임 엔진에 속하기 때문에 대부분 최신 상용 엔진이 지원하는 기능을 모두 지원한다. HDR, 쉐이딩, 맵핑 등. 따라서 개발하는데 한계는 없다고 보아도 무방하다.
커뮤니티는 나름 꾸준히 활동되고 있다. 그렇다고 활발히 활성화된건 아니지만, 업데이트는 지속적으로 이루어지고 있는 추세다.
스타수는 작성일 기준 3.9k, 2주 전 최종 수정되었다. 최종 릴리즈는 2022년 12월이고 게임엔진 특성상 큰 업데이트 중심으로 변경되기 때문에 오래된 릴리즈라고 보진 않는다.
또한 자체 포럼이 있는데, 질문하면 답변도 꽤 빠르다. 방금 찾아보니 최종 15시간 전에 업데이트 되었다.
적당하다. 적어도 언리얼엔진이나 기타 3D엔진을 사용해본 사람이라면, 파이썬 문법이 익숙하다는 전제 하에 쉽게 개발할 수 있다. 특히 Javascript의 ThreeJS를 다루어본 사람이라면, 구조가 상당히 비슷하기 때문에 쉽게 적응하지 않을까.
모델은 gltf나 egg타입을 지원한다. 블랜더에서 gltf 모델을 export 했을때에 바로 적용 가능하다. 특히나 게임 개발에서 gltf는 표준이라고 할 만큼 편한 모델 타입이기 때문에 모델 추가에 별다른 어려움은 없다.
https://www.panda3d.org/download/sdk-1-10-13/
공식 홈페이지에서 Get SDK를 클릭하면 pip 설치 화면이 나온다.
pip install panda3d==1.10.13
로 쉽게 설치할 수 있다.
from direct.showbase.ShowBase import ShowBase
class MyApp(ShowBase):
def __init__(self):
ShowBase.__init__(self)
app = MyApp()
app.run()
기본 실행 예제이다. 이 코드를 실행하면 회색으로 칠해진 창이 떠야 한다. 아래가 그 예시다.
씬을 추가하고 오브젝트를 삽입하려면 다음과 같이 구성해주면 된다. 기본으로 제공하는 모델을 불러오고 self.render를 부모로 지정하여 랜더링해주면 된다. 참고로 모델파일은 self.model = self.loader.loadModel("./models/objects/box.gltf")
요런식으로 gltf 파일을 불러올 수도 있다.
from direct.showbase.ShowBase import ShowBase
class MyApp(ShowBase):
def __init__(self):
ShowBase.__init__(self)
# Load the environment model.
self.scene = self.loader.loadModel("models/environment")
# Reparent the model to render.
self.scene.reparentTo(self.render)
# Apply scale and position transforms on the model.
self.scene.setScale(0.25, 0.25, 0.25)
self.scene.setPos(-8, 42, 0)
app = MyApp()
app.run()
해당 구문을 실행시키면,
이런 식의 모델이 불러와진다.
참고로 Panda3D는 마우스 핸들링을 기본적으로 지원한다. 따라서 화면을 마우스로 드래그하면 잘 움직여진다. 확대 축소는 마우스 휠 클릭후 드래그 하면 된다. 여러모로 편리한 기능이 잘 들어가 있다.
그럼 panda3d 라이브러리로 프로덕션 프로그램을 개발한다면, 언리얼 엔진이나 유니티처럼 괜찮은 그래픽을 뽑아내는건 불가능한건가.
사실 필자도 기본 제공 프로그램의 퀄리티를 보고 좀 놀랐다. 이걸로 수준급의 그래픽을 구현 가능한건지 근본적인 의문이 들었다. 언리얼 엔진의 경우 기본 제공 모델 마저도 수준급의 퀄리티를 보여주기 때문에 너무 기대한건가. 어쩌면 라이브러리의 한계로 좋은 그래픽을 보여주지는 못하는건지 궁금했다. 조금 검색을 해봤는데, 답은 "좋은 그래픽은 개발자에게 달려있다" 라는 원론적인 답변이 있었다. 분명 나와 비슷한 생각을 가진 사람이 있었나보다.
여기 그 예시가 있다.
누가보면 수준급의 엔진으로 개발했다는 느낌이 들 정도다. 더 검색해보니 아래와 같은 그래픽도 구현할 수 있었다.
놀랍다. 가장 기본적인 API와 기능만으로 괜찮은 수준을 보여주는게 가능하다. 이를 위해 panda3d에서는 pipeline이라는 별도의 기능을 제공한다. 여러 쉐이딩 기법과 랜더링, 향상된 포스트 프로세싱, 시간 및 날짜 시스템 등 외부 기능을 제공한다. 필자도 예시 코드를 받아서 실행해본 결과 뛰어난 그래픽을 구사할 수 있었다.
파이썬으로 게임개발하는 사람이 있다면 미친사람이 분명하다. 간간히 PyGame 배워본다는 친구들은 있을 뿐, 정말 전문적으로 배포 계획까지 세우고 실행하는 친구들은 다 언리얼이나 유니티 쓴다. 문제는 이런 프로그램도 전문적으로 다루기 위해서는 또 배워야 한다. 필자도 언리얼 엔진 블루프린트 배울려고 노력했으나 대체 어떻게 쓰는건지 몰라 전혀 다른 환경인 JavaScript ThreeJS로 넘어갔던 기억이 있다. 둘의 차이점이 있다면, 언리얼은 진정한 의미에서의 엔진이고 ThreeJS는 웹에서 3D를 다룰 수 있게 만드는 API라는 점이다. 물론 API가 Low Level이고 이해하는데 상당한 시간이 소요되지만, 개인적으론 더 친숙했다.
Panda3D는 언리얼 엔진 블루프린트보다 C++ 베이스로 개발하길 편했던 사람, Low Level API로 코드 수준에서 게임을 개발하길 좋아하는 사람, 보다 전문적으로 개발하고 게임에 대한 심층적인 이해가 필요한 사람에게 권한다. 무엇보다 개발자의 수준에 따라 작품의 질이 달라지기 때문에, 스스로 어떤 부분이 부족한지 깨달을 수 있다는 점도 장점이다.
오랜만에 재미있는 라이브러리를 발견해서 써봤다. 물론 한국어 자료가 죽어있는지라 이 글이 발견되기는 어렵겠지만, 적어도 누군가에겐 도움이 되길 기원하며 글을 마친다.
나는 미친놈이였어