非ユークリッドDoom:πが3.14159ではないとき、ゲームに何が起こるか (2022) [動画]
(media.ccc.de)- Doomのソースコードにある誤ったπの値を出発点に、数学定数を意図的にさらにずらしたとき、一人称シューティングゲームのレンダリングと空間感覚がどう変わるかを探る
- ゲームグラフィックスはπだけでなく三角法やさまざまな数学的手法に依存しているため、小さな数学的変更でも世界の見え方や移動の仕方に影響を与えうる
- Doomは1999年にGPLでソースコードが公開された古典的なFPSであり、πや三角関数・定数を変更してみる実験対象として使うことができた
- 実験では、当時のハードウェアでDoomがうまく動作するようにした最適化手法にも触れつつ、誤った数学バージョンを自分でコンパイルできる案内を提供する
- 非ユークリッド幾何学がゲーム内で新しい空間体験を生み出せるかを見ながら、誤ったπの値を使う他のゲームや公開ソースリポジトリにもリンクしている
Doomの数学を意図的にずらす
- π(pi)は固定値を持つ定数として知られているが、Doomのソースコードでは誤ったπの値が使われている
- グラフィックスレンダリングはπだけでなく三角法やさまざまな数学的手法に依存している
- 実験では、Doomのソース内のπの値をさらに不正確に変えるとゲームがどう変化するかを確認する
- 他の三角関数や定数まで変更し、見慣れた仮想世界を理解して移動する感覚がどう揺らぐのかを見ていく
Doomソースと実験範囲
- Doomはよく知られた古典的な一人称シューティングゲームである
- Doomのソースコードは1999年にGPLで公開された
- 実験対象は次を含む
- πの値をさらに誤った値に変更
- 他の三角関数を誤った値に変更
- 関連する数学定数を不正確に変更
非ユークリッドゲームの可能性
- 数学を変えると、プレイヤーが知っていた仮想空間の構造や移動感覚も変わりうる
- こうした変化が非ユークリッド幾何学にもとづく興味深いゲームの可能性につながるかを見ていく
性能最適化と直接実行
- 当時のハードウェアでDoomがよく動くようにした最適化手法にも短く触れる
- 発表の終盤には、誤った数学バージョンのDoomを自分でコンパイルできる案内が提供される
関連資料
- 誤ったπの値を使う他のゲームと公開ソースコードリポジトリへのリンクも提供される
- 発表動画はmedia.ccc.deのMCH2022コンテンツとして提供されている
1件のコメント
Hacker Newsのコメント
古典的な Duke Nukem 3D にもこうした例があった。Richard “Levelord” Gray が作った「Lunatic Fringe」レベルだ
https://dukenukem.fandom.com/wiki/Lunatic_Fringe
このレベルには外側に円形の回廊があり、互いに交差することなく二周を完全に回れる構造になっていて、当時画期的だった Build エンジン の、部屋の接続に基づく領域分離能力を利用していた。これは「room over room」技術にも使われていた
マルチプレイでは面白く、錯視もかなりよく保たれていた。記憶が正しければ中央の部屋には出入口が4つあったが、外側を一周するたびにそのうち2つしか出会わなかった
エンジンを実験していたとき、この手法で「線を交差させずに家3軒と公共設備3つを結ぶ」パズルを解くおもちゃのようなレベルも作ったことがある
Duke は非ユークリッド幾何学のようなものかもしれないが、この Doom の pi 変更は幾何学とはほとんど関係なく、「garbage in, garbage out」に近いように見える
重なったセクターで壊れるのは実質的に Doom だけだった
[1] https://www.lhowon.org/level/marathon/30
凸図形の内部をラスタライズできるなら、特定の面をポータルとしてマークし、その面が見える位置をクリッピング領域またはステンシルバッファとして設定したうえで、ポータルデータに入っている適切な変換と反対側セクターの ID を使って奥のセクターをレンダリングすれば、セクター・ポータル型ワールドもラスタライズできる
ポータルを通過する 衝突判定 は、ポータル越しのレンダリングよりずっと難しい
Lunatic Fringe は Build で不可能図形を真正面から見せる例だが、Duke3D のマップには交差するジオメトリがもっと多く含まれている。Doom ではそうした構造で BSP ツリーを作れず、プレイヤーやモンスターも X/Y 座標しか追跡しないので、当然不可能だ
ちょうど Poul Anderson の古典 Operation Chaos を読んでいた
https://en.wikipedia.org/wiki/Operation_Chaos_(novel)
魔法が実在し、科学とともに急速に発展している並行世界が舞台だ。たとえば Edwin Land は偏光を利用して、月明かりなしで狼男を変身させる装置を発明する
主人公たちの子どもが誘拐されて地獄へ連れ去られ、軍が20年前に地獄を調査しようとしたが全員が狂ってしまったと知らされる。敵対者は、地獄の時空間幾何がこちらと異なるため、子どもが到着する瞬間まで遡って連れ戻せるという手がかりを漏らす
科学者たちはその手がかりだけで、地獄の幾何が 非ユークリッド幾何学 であると見抜き、安全に入り、持ちこたえ、戻ってくるための呪文を計算する。道を見つけるために19世紀の幾何学者2人が同行し、そのうち1人は聖人の助けを得られるよう祈る
私が読んだ Poul Anderson の作品、たとえば素晴らしい High Crusade もそうだが、彼は科学的な外観をあまり気にせず、勢いで押し切るのが好きだった
非ユークリッド幾何学を扱った別作品としては、Christopher Priest の Inverted World が良かった記憶がある
John Carmackはpiの10桁目を間違って覚えていたのかもしれないが、みんなもコードベースで 84,600 を検索して、1日の秒数をタイプミスした人がいないか確認してみるといい
意外とよくあり、定数をプログラムに直接入力すべきか、それともプログラミング言語の標準ライブラリにすでにある値を使うべきかについての教訓がある
https://github.com/search?type=code&auto_enroll=true&q=84600
https://github.com/mysql/mysql-server/blob/824e2b4064053f7da...
https://github.com/textmate/textmate/blob/346b52b108b387462d...
15 * 60 * 60と定義していたことに気づいた実際にはグラフィックと移動がおかしくなり、最終的にはプレイ不能になる。これを 非ユークリッドDoom と呼ぶよりは、「宇宙定数をいじった結果」と呼ぶほうが適切に思える
本当の非ユークリッドDoomなら、こういうものを期待していた: https://youtu.be/kEB11PQ9Eo8?si=0HNlpGFBii2AIK1n
https://youtu.be/yqUv2JO2BCs?si=AutaqS5unvT7cDjw
Doomの動画で前進すると物体が横に滑るように見える奇妙な幾何効果を見ると、このDoomを非ユークリッドと呼ぶのもある程度は妥当に思える
通常の幾何を表現することはできたが、幾何が何らかの形で筋が通っている必要はなく、部屋同士を任意につなぐことも許されていた。揚げ足を取りたいわけではないが、よくある誤解だ
本当の非ユークリッド方面ならZenoRogueの仕事を勧める。たとえばNil幾何を使ったシンプルなゲーム[1]、非ユークリッド世界ローグライクの巨大ボス戦[2]、全体的な幾何の奇妙さ[3] などがある。彼らの作品は何を見てもいい
[1] https://m.youtube.com/watch?v=gejRg_q70EA&pp=ygUJemVub3JvZ3V...
[2] https://m.youtube.com/watch?v=jcnXI8IArRI&pp=ygUJemVub3JvZ3V...
[3] https://m.youtube.com/watch?v=yqUv2JO2BCs&pp=ygUJemVub3JvZ3V...
よく考えたら、もう十分時間もたったし、また遊んでも面白そうだ
通常の幾何を表現するのには問題なかったが、幾何が必ずしも筋が通っている必要はなく、部屋同士を任意につなぐことができた
https://www.youtube.com/watch?v=tl40xidKF-4
Doomはシミュレーションではないので、定数を1つ変えることが何かの良い例になるわけではない
単にいくつかのルーチンを壊すのに近く、そのため変更の結果の大半はプレイ不能になる
好きなコンソールエミュレータのソースコードを取ってきて、適当な 浮動小数点エラー を入れたり、一部の分岐命令の意味を反転させたりすればいい。古いゲームほどまだ動く可能性が高く、悪い幻覚旅行のように見える可能性も高い
有名な画像や動画ファイルの特定部分を壊して新しいものを作る グリッチアート のプロジェクトもあった。どちらもまた見つけたいのに見つからない
Marathon 1(1994)は非ユークリッド空間をサポートしていたが、使われるのはまれだった。マップのある複数レベルで構成されたゲーム全体をプレイしていて、1〜2レベルでだけ不可能空間が現れるのに、ゲームはそうしたことが可能だとは警告も案内もしない。
そのため、ゲーム内で見つけた最高のイースターエッグの場所だったのかもしれない。
実演動画も見つけた: https://www.reddit.com/r/Marathon/comments/vclu55/probably_n...
最後の問いは「プレイ可能でクラッシュしないpiの最大値はいくつか」というもの。piが4のときにセグメンテーション違反が起きる理由は、ルックアップテーブルへのアクセスの一部がテーブル終端を越えているためだと思われ、そうだとすればプレイ可能な最大値はpiそのものよりほんのわずかに大きい程度である可能性が高い。
この動画がゲームメカニクスや、なぜPiの変更がそのような形で問題を引き起こしたのかを、もっと深く扱ってくれていればよかった。
参照されていたレイトレーシング Doomでは、この実験がさらに興味深くなるのか気になる。ラスタライズ手法で定数をハックした結果は、ほぼ予想どおりだった。だが、レイトレーシングならもっと面白い結果になるかもしれない。