0.きっかけ:pyxelに憧れて
昔からレトロゲーム風の2Dゲームエンジン「pyxel」に憧れていました。
「Pythonで手軽にピクセルゲームが作れたら楽しいのに」と思い、真似して自作してみたのが、このエンジンの始まりです。
元々2Dから始まりました。少し進めていくと、やはりPythonだと遅すぎるという問題があり、
描写系はRustに移行となりました。
- アーキテクチャの決断:PythonとRustのハイブリッド
Pythonだけでは描画性能が厳しい。
そこで、ゲームロジックはPython(開発速度)、描画と重い計算はRust(速度) という分割にしました。
· Rust側:wgpu ベースのレンダラー、VRMローダー、FBXパーサー、GPUスキニング
· Python側:ECS、物理、タイルマップ、UI、イベントバス、サンプルゲーム
maturin でPythonからRustを呼び出す形です。
この構成にしてから、3D迷路でも60fps安定するようになりました。
- 素材集めの苦労(VRoid StudioとMixamo)
エンジンを作るにあたり、困ったのが「サンプルで使える3Dモデルとモーション」。
· モデル:結局 VRoid Studio で自前でVRMを作るのが一番安定しました。ライセンスも明確で、自由に配布できる。
· モーション:MixamoのFBXが事実上の標準ですが、これが曲者。軸が寝そべった状態(X軸-90度)でベイクされていて、そのままVRMに適用するとキャラが前のめりになります。
この問題の解決に、数日クォータニオンと格闘することになります。
- 技術的ハイライト:FBXリターゲットの内部的処理
Mixamo FBXをVRMに正しくリターゲットするために、以下の処理を実装しました。
- バインドポーズの分離:外部TポーズFBXを指定できるようにし、アニメーションFBXの最初のフレームが崩れていても影響を受けないようにした。
- ワールド空間でのデルタ抽出:各ボーンのワールド回転を計算し、「バインドポーズからの純粋な姿勢変化」を取り出す。
- ターゲット(VRM)のバインドポーズに合成:VRMのバインドワールド回転にデルタを乗算し、その後ローカル回転に逆算する。
これで軸のねじれはほぼ解消できました。ただし、歩行モーションではまだ左右に揺れすぎるなどの課題が残っています。
- 今後の展望(ロードマップ)
現在は「動く」状態まで来ましたが、まだまだ改善点があります。
· IK(逆運動学):手や足を地面に正確に接地させる。ブレイクダンスのようなモーションには必須。
· FBXの汎用対応:Mixamo以外のFBX(MotionBuilderやMaya出力)も自動判別・補正できるように。
· Webビルド出力:PythonスクリプトからWebAssembly/WebGPUのゲームを書き出せるように。
· エディタ機能:最低限のシーンエディタとアニメーションビューア。
これらが実現すれば、より多くの人に使ってもらえるエンジンになるはずです。
- まとめ:試してみてください
リポジトリはこちらです。
👉 https://github.com/EMMA019/KAGRA
クローンしてすぐ動くサンプルとして、3D迷路と2Dアクションゲームを同梱しています。
git clone https://github.com/EMMA019/KAGRA.git
cd KAGRA
python -m venv .venv
.venv\Scripts\activate.bat
pip install maturin
maturin develop
python examples/3Dmaze.py # または defend_crystal.py
「こんなエンジン欲しかった」という声があれば、ぜひスターやIssueをお待ちしています。
一緒に盛り上げていけると嬉しいです。
