0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Godot 4 + C++ (GDExtension) で挑む!Jolt Physics を使ったビリヤード開発記

0
Last updated at Posted at 2026-03-11

[!IMPORTANT]
この記事は AI(Antigravity / Gemini)によって執筆され、Qiita API を通じて自動投稿されたものです。
開発過程では ChatGPT(Copilot) によるコード評価や提案も積極的に活用しており、複数の AI と人間が三位一体で試行錯誤した軌跡をレポートとしてまとめています。

はじめに

Godot Engine 4、標準の物理エンジンもかなり優秀ですよね。でも、「もっとゴリゴリの物理シミュレーションがしたい!」とか「将来は 3D アクション RPG で爆速な挙動を作りたい!」なんて欲が出てきちゃいまして。

というわけで今回は、C++ (GDExtension) と Jolt Physics を組み合わせて、ビリヤードの基盤を作ってみたお話です!
M4 Mac 特有のビルドトラブルに泣かされたり、AI(Gemini や Copilot)と一緒に「最強のペアプロ」をしてみたりと、なかなか濃い開発になったので記録に残しておきます。


1. 今回のこだわり:View とロジックを「物理的」に分ける!

今回の開発で一番こだわったのが、**「物理演算(Jolt)は Godot のシーンツリーを一切知らない」**という設計です。
「え、どういうこと?」って感じですよね。

アーキテクチャの中身

  • C++ 層(BilliardsManager):
    • ここが「物理世界の王様」です。Jolt Physics の世界をひたすら管理します。
    • シーンツリーには一応居るけど、Godot のノードとかはほとんど触りません。
    • 毎フレーム、ボールの座標を計算して「いまここだよ!」ってシグナルを送るだけ。
  • GDScript 層(View):
    • こっちは「見た目担当」。C++ から届いたシグナルを聞いて、メッシュを動かします。
    • カメラの旋回、エイム、チャージゲージの表示……こういう「演出」は全部こっちにお任せ。

この設計のおかげで、物理計算が見た目の都合に振り回されない、めちゃくちゃクリーンなコードになりました。これぞ分離の醍醐味!


2. Jolt Physics を入れるまで(M4 Mac の罠にハマる)

Jolt を入れようとしたら、いきなり ARM64(Apple シリコン)特有のエラーが……。NEON 最適化周りで「そんなメンバないよ!」って怒られちゃったんです。

どうしたかというと:
「Jolt だけビルド設定を変えちゃおう!」ってことで、ビルドシステムの SCons で Jolt 専用の環境を用意。-mcpu=apple-m4 フラグを外してスカラー演算に逃がすことで、無事に解決しました。最新の Mac を使ってると、たまにこういう「ご褒美(デバッグ)」がありますよね(笑)。


3. 開発の道のり (Phase 1 〜 6)

Phase 1-2: PIMPL で隠蔽工作!

Jolt のヘッダと Godot のヘッダを直接混ぜると、マクロとかが衝突して大変なことになります。なので PIMPL パターン を使って、Jolt の情報を実装ファイルの中にガッツリ隠しました。公開ヘッダは常にピカピカです。

Phase 3-4: 「巨大な鉄球」との戦い

Jolt のデフォルト設定だと、1m の球体って数トン(水と同じ密度だとそうなる)あるんですよね。最初は全然動かなくて「えっ?」ってなりました。
力(Impulse)で押すんじゃなくて、速度(LinearVelocity)を直接指定するようにして、床も 500m くらいに広げたら、ようやくビリヤードらしくなりました!

Phase 5-6: AI と二人三脚で爆速実装

的球を三角形に並べる(ラック)計算や、ポケットに入ったかどうかの判定なんかは、Copilot に助けてもらいました。
AI が「こうじゃない?」って出してくれたコードを、私が「いいよ、それ採用!」って感じで調整していく……まさに最強のペアプロでしたね。


4. 複数の AI による「開発サイクル」の回し方

今回の開発は、役割の異なる 4 つの AI を「ぐるぐる」とサイクルさせて爆速で進めました。これがめちゃくちゃ強力だったんです。

AI 名 担当ロール 具体的な仕事内容
Gemini アイディア出し 開発の全体像や、次に何をすべきかの作業アイディアを提案。
Antigravity 設計・実装・テスト 基本設計、C++ のコア実装、そしてテストコードの作成と実行を担当。
Copilot 詳細実装・修正 細かなロジックの肉付けや、バグが出た時のピンポイントな修正。
ChatGPT コード評価 GitHub リポジトリからコードを読み取り、「設計は正しいか?」「もっといい書き方はないか?」を客観的に評価。

この 4 人(?)の AI チームが、「アイディア → 設計・実装 → 修正 → 評価 → 新たなアイディア...」 というサイクルを高速で回し、人間(私)がその舵取りをする。この「AI 総力戦」のおかげで、複雑な GDExtension の開発も迷わず完遂できました。

ただ、今後の課題もあって、これを「完全に自動化」することはまだできていません。 それぞれの AI をシームレスに繋げる仕組みが今のところなく、人間が「ハブ」として情報を橋渡しする必要があります。
AI モデルごとに得意分野も違えば、連携できる外部サービスもバラバラ。なにより、AI モデルやサービスごとに特有の「性格」があります。

現状、すべてを完璧にこなす「汎用 AI」がすぐに生まれることはないと思います。だからこそ、それぞれの個性を理解して、適材適所で組み合わせていく「オーケストレーション」の技術が、これからのエンジニアにはますます重要になっていく気がしています!


実際のプレイ画面

最後に、AI たちと一緒に作り上げたビリヤードゲームの現在の姿を載せておきます!
(※この画像もこの記事の一部として AI が挿入しました)

ビリヤードのプレイ画面


まとめ

今回の開発を通じて、AI は単なる「コード生成ツール」ではなく、設計や評価もこなす「頼れるチームメンバー」になれることを実感しました。

もし皆さんも Godot や GDExtension の開発で迷ったら、複数の AI を適材適所で組み合わせてみる「AI 総力戦」を試してみてはいかがでしょうか?

ハッピー・コーディング!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?