Viewportおよびキャンバスの幾何学変換

はじめに

ここでは、ノードがコンテンツをローカルに描画してから画面に描画するまでの間に行われる2D幾何学変換の概要について説明します。この概要では、エンジンの非常に低いレベルの詳細について説明します。

キャンバスの幾何学変換

前のチュートリアルの キャンバス・レイヤー で説明したように、すべてのCanvasItemノード(Node2DおよびControlベースのノードはCanvasItemを共通のルートとして使用することに注意してください)は*キャンバス・レイヤー*に存在します。 すべてのキャンバス・レイヤーには、 Transform2D としてアクセスできる幾何学変換(平行移動、回転、拡大縮小など)があります。

前のチュートリアルでも説明したように、ノードはデフォルトでレイヤー0の組み込みキャンバスに描画されます。 ノードを別のレイヤーに配置するには、 a CanvasLayer ノードを使うことができます。

グローバル・キャンバスの幾何学変換

Viewportにはグローバル・キャンバスの幾何学変換もあります(これも Transform2D です)。 これはマスターの幾何学変換であり、すべての個々の Canvas Layer の幾何学変換に影響します。通常、この幾何学変換はあまり使用されませんが、GodotのエディタのCanvasItemエディタで使用されます。

ストレッチ幾何学変換

最後に、Viewportには*Stretch Transform*があります。これは、画面のサイズ変更やストレッチを行うときに使用されます。 この幾何学変換は( 複数の解像度 で説明されているように)内部的に使われますが、各Viewportで手動で設定することもできます。

MainLoop._input_event() コールバックで受け取った入力イベントは、この変換によって乗算されますが、上記のものはありません。 InputEvent座標をローカルのCanvasItem座標に変換するために、便宜上 CanvasItem.make_input_local() 関数が追加されました。

変換の順序

CanvasItemローカルプロパティの座標を実際の画面座標にするには、次の一連の変換を適用する必要があります:

../../_images/viewport_transforms2.png

変換関数

各変換を取得するには、次の関数を使用します:

タイプ(型) 幾何学変換(変形)
キャンバス・アイテム CanvasItem.get_global_transform()
キャンバス・レイヤー CanvasItem.get_canvas_transform()
キャンバス・レイヤー+グローバル・キャンバス+ストレッチ CanvasItem.get_viewport_transform()

最後に、CanvasItemのローカル座標をスクリーン座標に変換するには、次の順序で乗算します:

var screen_coord = get_viewport_transform() * (get_global_transform() * local_pos)
var screenCord = (GetViewportTransform() * GetGlobalTransform()).Xform(localPos);

ただし、通常は画面座標で作業することは望ましくないことに注意してください。推奨される方法は、画面の自動解像度のサイズ変更が正しく機能するように、単純にCanvas座標( CanvasItem.get_global_transform() )で作業することです。

カスタム入力イベントのフィード

多くの場合、カスタム入力イベントをシーンツリーにフィードすることが望まれます。上記の知識をもとに、これを正しく行うには、次のようにしなければなりません:

var local_pos = Vector2(10, 20) # local to Control/Node2D
var ie = InputEventMouseButton.new()
ie.button_index = BUTTON_LEFT
ie.position = get_viewport_transform() * (get_global_transform() * local_pos)
get_tree().input_event(ie)
var localPos = new Vector2(10,20); // local to Control/Node2D
var ie = new InputEventMouseButton();
ie.ButtonIndex = (int)ButtonList.Left;
ie.Position = (GetViewportTransform() * GetGlobalTransform()).Xform(localPos);
GetTree().InputEvent(ie);