トランスフォーム

このチュートリアルを読み進める前に、まずベクトルの概念とゲーム開発における使用方法を理解する必要があります。もし不十分と感じている場合、Godotドキュメントの、以下の入門記事を読むことを強くオススメします。 ベクトル演算

2Dトランスフォーム

2D空間では、おなじみのX軸・Y軸座標平面を使用します。Godotでは(ほとんどのコンピュータグラフィックスアプリケーションと同様に)、Y軸は下向きに定義されていることに注意してください。

alt alt

まず、宇宙空間を漂流しているこの宇宙船について考えてみます。

alt alt

船の進行方向は座標軸のX軸と同じ方向を向いています。これを前進させたい場合は、X座標に値を加えることで右方向へ移動させられます。

position += Vector2(10, 0)

しかし、船が回転した場合はどうなるのでしょうか?

alt alt

船を前方に移動させるにはどうすれば良いでしょうか?学校で三角関数を学んでいた方なら、角度やサイン・コサインの概念を思い出し、position += Vector2(10 * cos(angle), 10 * sin(angle))のような計算式を考えつくかもしれません。この方法でも実現できますが、より便利な方法があります。それは トランスフォーム(Transform) です。

もう一度回転した船を見てみてください。今回は、その船が独自の X 軸と Y 軸を持っており、それらは世界的な座標系とは独立して移動していることを想定します。

alt alt

これらの「ローカル」座標軸は、オブジェクトの transform プロパティに含まれています。

この特性を利用すれば、船をX軸に沿って移動させることで簡単に前進できます。角度計算や三角関数を気にする必要もありません。Godotでこれを実現するには、すべてのNode2D の派生ノードで利用できるtransformプロパティを使用します。

    position += transform.x * 10

このコードは「変換の x ベクトルに 10 を乗算した結果を追加する」という意味です。これを分解して説明します。transform オブジェクトには xy プロパティがあり、これらはローカル座標軸を表しています。これらは「単位ベクトル」であり、その長さは 1 です。単位ベクトルは別の言い方で「方向ベクトル」とも呼ばれます。これは船の x 軸が指し示す方向を示しています。この値に 10 を掛けることで、より長い距離に対応するようにスケール変換しています。

ヒント

ノードの transform プロパティは親ノードに対する相対値です。グローバル座標が必要な場合は、global_transform を参照してください。

ローカル座標系に加えて、この変換には origin(原点) と呼ばれるコンポーネントも含まれています。原点は位置の 移動量、すなわち変化した位置を表します。

この画像では、青色のベクトルが transform.origin です。これはオブジェクトの position ベクトルと等しくなります。

alt alt

ローカル空間とグローバル空間での座標変換

座標を局所座標系からグローバル座標系に変換するには、変換を適用します。利便性を考慮し、Node2DNode3D にはこの処理を簡単に行う補助関数が用意されています。to_local()to_global()

    var global_position = to_global(local_position)

2次元平面上のオブジェクトを例に取り、マウスクリック座標(グローバル空間)をオブジェクト相対座標に変換する方法を説明します。

extends Sprite

func _unhandled_input(event):
    if event is InputEventMouseButton and event.pressed:
        if event.button_index == BUTTON_LEFT:
            printt(event.position, to_local(event.position))

利用可能なプロパティとメソッドの一覧については、Transform2Dドキュメントを参照してください。

3D トランスフォーム

3D空間において、変換方法の捉え方は2D空間で適用される場合と全く同様です。実際、3次元で角度を扱う場合には様々な問題が生じる可能性があるため、この重要性はさらに高まります。これについては後ほど詳しく説明します。

3Dノードは基本ノードNode3Dを継承しており、変換情報を保持しています。3D空間におけるトランスフォームは、2D版に比べてより複雑な情報を必要とします。位置座標はこれまで通りoriginプロパティで管理されますが、回転情報は新たに追加されたbasisプロパティに格納されます。このプロパティには、オブジェクトのローカル座標系におけるX軸Y軸Z軸を表す単位ベクトルが3つ含まれています。

エディターで3Dノードを選択すると表示されるギズモを使用すると、変換操作を行えます。

alt alt

ローカル空間モード

エディタ内で「ローカル空間を使用」ボタンをクリックすると、オブジェクトの局所的な向きを表示・操作できます。 alt alt このモードでは、「ローカル空間モード」が有効になっている間、3本の色分けされた軸線がオブジェクトの局所座標系の基底軸として表示されます。

2Dと同様に、ローカル軸を使ってオブジェクトを前方に移動させることができます。Godotの3D座標系( Y軸正方向 )では、デフォルトでボディの -Z軸 が前進方向になります。前に進むには。

    position += -transform.basis.z * speed * delta
ヒント

Godotにはデフォルトのベクター値が定義されています。例えば:Vector3.FORWARD == Vector3(0, 0, -1)。詳細はVector2およびVector3のドキュメントを参照してください。