2Dゲーム開発経験者が3D開発で異世界に飛ぶ|座標系と行列
Photo by Luise and Nic on Unsplash
最近、昔のゲームの発売記念日を知らせる投稿を見かけることが増えました。90年代のタイトルを見ると、素直に「懐かしい」と感じます。
一方で、初代PlayStationやセガサターンの時代のタイトルを見ると、少し違う記憶がよみがえります。2Dしか作ったことのなかったプログラマーが、急きょ3Dを担当することになった、あの頃の空気です。
私も例外ではありませんでした。
行列を間違えると異世界行き
当時、特に印象に残っているのは、いわゆる「異世界に飛ぶ」現象です。
・回転と移動の順番を逆にして、キャラクターが原点のまわりを回り続ける
・ローカル座標とワールド座標が混ざり、意図しない場所にワープする
・板ポリゴンだけがカメラの裏で巨大化する
いま振り返れば、座標系や行列の掛け順の問題です。しかし当時の自分にとっては、「何が壊れているのか分からない」という状態でした。
デバッグカメラも十分ではなく、数値を追っても直感的に空間を把握できません。画面の中で起きていることと、コードの中でやっていることが結びつかないのです。
空間の捉え方そのものが別物だった
2D開発では、座標は平面の中で完結します。回転も拡大縮小も、感覚的に理解しやすい世界です。
ところが3Dでは、ローカル・ワールド・ビューといった複数の座標系が前提になります。回転と移動も、順番が変わるだけで結果が変わります。
式そのものよりも、「どの空間で考えているのか」を整理できていないことが、混乱の原因でした。
当時は、それを体系立てて教えてくれる環境も多くありませんでした。だからこそ、急造3Dプログラマーは、コードを書く以前に「空間の捉え方」を手探りで学ぶ必要がありました。
銀の弾丸は「折れない心」
以前関わった現場で、キャラクターが突然マップ外に飛ぶという現象がありました。再現性が低く、誰も説明できない。ログ上は正しく見えています。
最終的には、座標変換の順番が一箇所だけ逆になっていたことが原因でした。
解決してみれば単純な話ですが、そこに至るまでの時間は長く感じました。
何度も数値を確認し、紙に図を描き、頭の中で立体を回転させるわけです。振り返ると、あの時間で養われたのは、計算力よりも「折れない心」だったように思います。
空間を言葉にするということ
いま若いエンジニアの実装を見るとき、私はまず「これはどの座標系の話ですか」と確認します。
ローカルか、ワールドか、ビューか。
回転はどの基準で行っているか。
数式を覚えているかどうかよりも、空間の前提を言葉にできているかどうかを見ています。
3Dは難しいというよりも、どの座標系で考えているのかが曖昧になりやすいのだと思います。
その整理ができていけば、不可解なバグは少しずつ減っていきます。
思い出として残っているもの
あの頃は、とにかく手探りでした。
正解がどこにあるのか分からないまま、試しては壊し、また試す。
いま思い出すのは、トラブルそのものよりも、画面の向こうにある空間を必死に想像していた時間です。
急に3Dを任されることは、その後もまれにありました。そのときに必要なのは、特別な才能よりも、「空間を丁寧に分解して考える姿勢」だったかもしれません。
昔の思い出話ではありますが、3Dで迷った経験は、いまの自分の判断基準の土台になっています。異世界に飛んだ回数だけ、空間を言葉にする力が少しずつ育っていったのだと思います。
おわりに
X(旧Twitter)やBlueskyを中心に日々発信しております。
ご興味をお持ちいただけましたら、ぜひ弊社Webサイトや私のXもご覧いただけますと幸甚でございます。
https://www.tatsu-mi-systemsolution.jp/
https://x.com/itchie_tatsumi
https://bsky.app/profile/itchie-tatsumi.bsky.social