Up to date

This page is up to date for Godot 4.2. If you still find outdated information, please open an issue.

2D 坐標系與 2D 變換

前言

這是可用的 2D 座標系和內建 2D 變換的詳細概述。基本概念包含在 doc_viewport_and_canvas_transforms 中。

Transform2D 是將座標從一種座標系轉換為另一種座標系的矩陣。為了使用它們,了解 Godot 中可用的座標係是有益的。為了更深入地理解,doc_matrices_and_transforms 教學提供了對底層功能的見解。

座標系

下圖概述了 Godot 2D 座標係以及可用的節點變換、變換函式和座標系相關函式。左側是作業系統視窗管理器螢幕,右側是 CanvasItems <class_CanvasItem>`。為簡單起見,此圖形不包含:ref:SubViewport <class_SubViewport>SubViewportContainerParallaxLayer 和:ref:`ParallaBackground<class_`Packground<class_`ack影響變換。

此圖形基於以下形式的節點樹:根視窗(嵌入Windows) ⇒``視窗(不嵌入Windows)`` ` ` ⇒``CanvasLayer``⇒``CanvasItem``⇒` ` CanvasItem`` ⇒``CanvasItem`` 。可能存在更複雜的組合,例如深度巢狀的視窗和子視口,但此範例旨在提供一般方法的概述。

../../../_images/transforms_overview.webp

按一下圖片放大。

  • 下一個座標

    這是 CanvasItem 的局部坐標系。

  • 下一個座標

    這是父級 CanvasItem 的局部座標系。當在 Canvas 中定位 CanvasItems 時,它們通常會繼承其父級 CanvasItems 的轉換。一個例外是 CanvasItems.top_level <class_CanvasItem_property_top_level>`。

  • 上一個座標

    如同前面的教學 doc_canvas_layers 中所提到的,有兩種型別的畫布(Viewport 畫布和 CanvasLayer 畫布),並且都有畫布座標系。這些也稱為世界座標。一個*視口*可以包含多個具有不同座標系的*畫布*。

  • 下一個座標

    然後選擇您想要使用的 Viewport.

  • 下一個座標

    這僅在內部用於 3D 相機光線投影等功能。

  • 嵌入器座標 / 螢幕座標

    場景樹中的每個*視窗*(視窗*或*子視窗)都嵌入到不同的節點或作業系統視窗管理員中。此座標系的原點與 WindowSubViewport 的左上角相同,其比例為嵌入器或作業系統視窗管理員之一。

    如果嵌入器是作業系統視窗管理器,那麼它們也稱為螢幕座標。

  • 絕對嵌入器座標 / 絕對螢幕座標

    此座標系的原點是嵌入節點或作業系統視窗管理器畫面的左上角。它的規模是嵌入器或作業系統視窗管理器之一。

    如果嵌入器是作業系統視窗管理器,那麼它們也稱為絕對螢幕座標。

拉伸變換

每個提到的節點都有一個或多個與之關聯的變換,這些節點的組合推斷出不同座標系之間的變換。除了少數例外,這些變換是:ref:Transform2D <class_Transform2D>,下面的列表顯示了每個變換的詳細資訊和效果。

  • Canvas 變換

    CanvasItemsControl 節點或 Node2D 節點。

    對於 Control 節點,此轉換由相對於父級原點的位置 <class_Control_property_position>` 和圍繞 scale 和旋轉 <class_Control_property_rotation>` 組成: `點制軸點 <class_Control_property_`pivot_offset>。

    對於 Node2D 節點 transformpositionrotationscalescale

    變換會影響專案本身,通常也會影響子 CanvasItems,並且在 SubViewportContainer 的情況下,它會影響所包含的 SubViewport

  • Canvas 變換

    CanvasLayer變換 影響 CanvasLayer 內的所有 CanvasItems。它不會影響其*Viewport* 中的其他*CanvasLayers* 或*Windows*。

  • CanvasLayer 視口跟隨變換

    跟隨視窗變換*是一個自動計算的變換,它基於*Viewport的canvas變換,即可實作偽3D效果。它影響與 CanvasLayer 變換 相同的子節點。

  • Viewport 與 Canvas 變換

    畫布轉換 <class_Viewport_property_canvas_transform>` 影響*Viewport's* 預設畫布中的所有 CanvasItems。它還會影響啟用了跟隨視窗變換的 CanvasLayers視窗的*活動 :ref:`Camera2D <class_Camera2D>` 透過更改此轉換來運作。它不會影響此*視窗*嵌入的*Windows

  • Viewport 與 Canvas 變換

    Viewport 也有一個全域 Canvas 變換 (該變換也是 Transform2D)。全域 Canvas 為主變換,會影響所有單獨的 Canvas Layer 變換。一般來說,這種變換並不常用,但在 Godot 編輯器中的 CanvasItem 編輯器中有用到。

  • 拉伸變換

    最後,視口*具有*拉伸變換,在調整視窗大小或拉伸視口時使用。此轉換用於 Windows,如 多解析度 中所述,但也可以透過 sizesize_2d_override。它的 translationrotationskew 是預設值,且只能有非預設值 scale

  • Window transform

    為了依照 doc_multiple_resolutions 中的描述縮放和定位*視窗的*內容,每個 Window <class_Window> 都包含一個*視窗變換*。例如,它負責*視窗*兩側的黑條,以便*視口*以固定的寬高比顯示。

  • Window position

    每個 Window 都還有一個 position,描述的是它在嵌入器中的位置。嵌入器可以是另一個 Viewport,也可以是作業系統視窗管理器。

  • Viewport 與 Canvas 變換

    stretch <class_SubViewportContainer_property_stretch>` 和 stretch_shrink <class_SubViewportContainer_property_stretch_shrink>` 一起宣告 SubViewportContaner 所包含的 SubViewport 是否應該相對於容器的大小進行縮放以及按什麼整數因子縮放以及按什麼整數因子縮放以及按什麼整數因子縮放以及按什麼整數因子縮放以及按什麼整數因子縮放以及按什麼整數因子縮放以及按什麼整數因子縮放以及按什麼整數因子縮放以及按什麼整數因子縮放以及按什麼整數因子縮放以及按什麼整數因子縮放。