オレオレゲームエンジン作ってた時の話


「Applibot Advent Calendar 2021」 10日目の記事になります。
株式会社Applibotサーバサイドエンジニアのsana37です。

この記事を書いた背景

学生の頃に勢いだけで自作したゲームエンジンがあるのですが、多分もう使われることがないので供養させてください。

作ったもの

3Dオブジェクトの衝突判定や物理演算をc++で実装しました。
3D空間の描画にはQtとOpenGLを使っています。

実際に動かしてみた様子がこちらです。
(少し挙動が不安定なので物体がずっとプルプルしています)

一応githubにもソースコードあげてます。
かなりの自己満足コードなのでちょっと恥ずかしいですが気が向いたら見てみてください。
https://github.com/sana37/PeculiarEngine

どうやって作ったの?

イチから全部説明すると長くなってしまいそうなので、衝突判定のアルゴリズムについてのみ軽くお話ししようと思います。

衝突判定

主に、
1. オブジェクトを内包する球体同士の衝突判定
2. ポリゴンと頂点の衝突判定
3. 辺と辺の衝突判定

の流れで衝突判定を行います。

1. オブジェクトを内包する球体同士の衝突判定

少ない計算量で、オブジェクト同士が確実に衝突していないことを検証できます。

球体同士が重なる場合、オブジェクト同士が衝突している可能性があります。

逆に重ならない場合は、オブジェクト同士が確実に衝突していないことになります。

もし球体同士が衝突していなければ後続の衝突判定をスキップできるので、計算量の削減につながります。

2. ポリゴンと頂点の衝突判定

オブジェクトAのポリゴンとオブジェクトBの頂点で衝突判定を行います。

オブジェクトBの頂点がオブジェクトAのポリゴンを突き刺しているかどうかを調べるイメージです。

3. 辺と辺の衝突判定

各オブジェクトの辺が互いを貫いているかどうかを判定します。

以上の流れでオブジェクト同士の衝突を判定することが可能です。

振り返ってみて

”それっぽく動いてるように見える”ところまで持っていくのは結構大変だった記憶がありますが、自分が実装した法則でものが動き出すのが見られた時は感動しました。

最後に

本記事ではオレオレゲームエンジンの一部仕組みについて簡単にお話しさせていただきました。

以上、「Applibot Advent Calendar 2021」10日目の記事でした。