Godotの座標システム(2D/3D)の理解

Gobot

Godotの座標システム:2Dと3Dの徹底理解

Godot Engine における座標システムは、ゲーム開発の根幹をなす概念です。2Dと3Dではそれぞれ異なるアプローチが取られますが、基本的な考え方には共通する部分も多く存在します。ここでは、それぞれの座標システムについて深く掘り下げ、その理解を深めていきます。

Godot 2D座標システム

Godot の2D空間では、X軸 は水平方向、Y軸 は垂直方向を表します。原点 (0,0) は通常、画面の左上隅に位置します。X軸は右方向へ増加し、Y軸は下方向へ増加するのが Godot の特徴です。これは、多くのコンピュータグラフィックスシステムが左上を原点としているため、直感的に理解しやすい設計と言えます。

  • X軸: 水平方向。値が増加するにつれて右に移動します。
  • Y軸: 垂直方向。値が増加するにつれて下に移動します。

ノード の position プロパティは、この2D座標系における ノード の位置を指定します。例えば、position が (100, 50) の ノード は、画面の左上から右へ100ピクセル、下へ50ピクセルの位置に配置されます。

Camera2D ノードは、2Dゲームにおける「視点」を定義します。カメラの position を変更することで、ゲーム画面に表示される範囲を移動させることができます。カメラの zoom プロパティを使えば、画面の拡大縮小も可能です。

2Dにおける座標変換

ノード は Node2D を継承しており、position 以外にも rotation (回転)、scale (拡大縮小) といった変換プロパティを持っています。これらのプロパティは、ノード のローカル座標系における変換を表します。

親ノード の変換は、子ノード のローカル座標系に影響を与えます。つまり、親ノード を移動・回転・拡大縮小させると、それに付随する 子ノード も同様の変換を受けます。この階層構造による座標変換は、ゲームオブジェクトの複合的な振る舞いを実現する上で非常に重要です。

global_position プロパティは、ノード のワールド座標系における絶対位置を示します。local_to_global() メソッドや global_to_local() メソッドを使えば、ローカル座標とグローバル座標の相互変換が可能です。

Godot 3D座標システム

Godot の3D空間では、X軸、Y軸、Z軸 の3つの軸が用いられます。原点 (0,0,0) は3D空間の中心に位置します。

  • X軸: 水平方向。右方向へ増加します。
  • Y軸: 垂直方向。上方向へ増加します。
  • Z軸: 奥方向。値が増加するにつれてカメラから遠ざかる(奥へ進む)方向です。

このY軸が上方向を向くという点は、2DのY軸が下方向を向くのとは異なるため、注意が必要です。3D空間での ノード の位置は、Vector3 型の position プロパティで指定されます。

Camera3D ノードは、3Dゲームにおける視点を定義します。カメラの transform プロパティ(Translation, Rotation, Scale を含む)を操作することで、カメラの位置、向き、視野などを制御します。

3Dにおける座標変換と回転

3D空間における変換も2Dと同様に、Spatial ノード(Node3D など)の transform プロパティによって定義されます。この transform は、Basis(回転とスケール)と Vector3(平行移動)の組み合わせで構成されます。

3Dにおける回転は、2Dよりも複雑になります。主に以下の方法で回転を扱います。

  • オイラー角 (Euler Angles): X、Y、Z軸周りの回転を個別に指定する方法です。直感的で理解しやすいですが、「ジンバルロック」と呼ばれる問題が発生する可能性があります。
  • クォータニオン (Quaternion): ジンバルロックを回避できる、より数学的に安定した回転表現方法です。 Godot では Quat 型で扱われます。
  • 回転行列 (Rotation Matrix): 3×3の行列で回転を表現する方法で、 Basis がこれに相当します。

Node3D の rotation プロパティは、ローカル座標系でのオイラー角による回転を指定します。rotate_x(), rotate_y(), rotate_z() メソッドは、それぞれの軸周りに回転を適用します。

global_transform プロパティは、ノード のワールド座標系における絶対的な変換を示します。2Dと同様に、to_global() や to_local() メソッドで座標変換が可能です。

座標系の右手系と左手系

一般的に、3Dグラフィックスでは「右手系」と「左手系」の座標系が使用されます。

  • 右手系: X軸からY軸へ指を曲げると、親指がZ軸の正の方向を向くシステムです。
  • 左手系: X軸からY軸へ指を曲げると、親指がZ軸の負の方向を向くシステムです。

Godot の3D座標系は、Z軸 がカメラから遠ざかる方向として定義されており、これは右手系 の convention に従っています。これは、多くの3Dモデリングソフトウェアやゲームエンジンとの互換性を考慮したものです。

座標システム理解の応用

Godot の座標システムを深く理解することは、以下のような多くの場面で役立ちます。

  • キャラクターの移動と操作: プレイヤーキャラクターやNPCの正確な移動、ジャンプ、攻撃などの実装。
  • カメラ制御: プレイヤーの視点をスムーズに追従させたり、特定のイベントでカメラを切り替えたりする。
  • コリジョン検出: オブジェクト同士の衝突判定を正確に行うための位置関係の把握。
  • UI要素の配置: 画面上のUI要素を正確な位置に配置し、レスポンシブなレイアウトを実現する。
  • 3D空間でのオブジェクト配置と操作: 複雑な3Dシーンの構築、ライティング、エフェクトの配置。
  • 物理演算: 物理エンジンによるオブジェクトの挙動を座標系に基づいてシミュレートする。

特に3Dにおいては、座標軸の向き、回転の概念(オイラー角、クォータニオン)、そしてそれらの変換が複雑に絡み合います。これらの概念を正確に理解し、Godot のAPIを使いこなすことが、高品質な3Dゲーム開発への鍵となります。

まとめ

Godot の2Dおよび3D座標システムは、それぞれの次元でゲーム世界の構造を定義するための基本となります。2Dでは左上原点のX軸右向き・Y軸下向き、3Dでは右手系に基づいたX軸右向き・Y軸上向き・Z軸奥向きという特徴を理解することが重要です。ノードの position や transform プロパティ、そしてそれらの変換メソッドを駆使することで、ノード を意図した通りに配置し、アニメーションさせることができます。これらの座標システムは、ゲーム開発のあらゆる側面に影響を与えるため、その習得は必須と言えるでしょう。