Attention: Here be dragons
This is the latest
(unstable) version of this documentation, which may document features
not available in or compatible with released stable versions of Godot.
Checking the stable version of the documentation...
2D 坐标系与 2D 变换
介绍
本文对可用的 2D 坐标系和内置的 2D 变换进行了详细介绍。相关基础概念见 视口变换与画布变换。
Transform2D (2D 变换)本质上是一种矩阵,专门用来把坐标从一个坐标系转换到另一个坐标系。要想用好它们,最好先了解一下 Godot 里都有哪些可用的坐标系。如果你想更深入地理解背后的原理,可以去看看 矩阵与变换 (矩阵与变换)这篇教程,里面详细介绍了它的底层运作机制。
Godot 2D 坐标系
下图展示的是 Godot 2D 中的坐标系、节点变换、变换函数、坐标系相关函数的概览。最左侧是操作系统“窗口管理器”的屏幕,最右侧是 CanvasItem。简单起见,这张图中没有加入 SubViewport、SubViewportContainer、ParallaxLayer 和 ParallaxBackground,尽管它们也能够影响变换。
这张图基于 根 Window(内嵌其他窗口) ⇒ Window(没有内嵌窗口) ⇒ CanvasLayer ⇒ CanvasItem ⇒ CanvasItem ⇒ CanvasItem 的节点树绘制。节点树还可以有更加复杂的组合,例如可以让 Window 和 SubViewport 进行更深层的嵌套,不过本示例主要的目的还是展示通用的思考方法。
单击图片放大。
- Item 坐标
这是 CanvasItem 的局部坐标系。
- 父 Item 坐标
这是父级 CanvasItem 的局部坐标系。在画布中放置 CanvasItem 时,这些画布项会继承父级 CanvasItem 的变换。CanvasItems.top_level 则是例外。
- 画布坐标
之前的教程 画布层 中就提到过,画布有两种(Viewport 画布和 CanvasLayer 画布),两者用的都是画布坐标系。画布坐标也叫世界坐标。一个 Viewport 可以包含多个画布,不同画布所使用的坐标系可以不同。
- 视口坐标
这是 Viewport 的坐标系。
- 相机坐标
仅在内部使用,用于实现 3D 相机光线投射等功能。
- 嵌入器坐标 / 屏幕坐标
场景树中的各个 Viewport(Window 或 SubViewport)不是嵌入在其他节点中,就是嵌入在操作系统的“窗口管理器”中。这种坐标系的原点位于 Window 或 SubViewport 的左上角,缩放与嵌入器或操作系统的“窗口管理器”一致。
如果嵌入器是操作系统的“窗口管理器”,那么对应的坐标也可以称为屏幕坐标。
- 绝对嵌入器坐标 / 绝对屏幕坐标
这种坐标系的原点是所嵌节点或的操作系统的“窗口管理器”的左上角。缩放与嵌入器或操作系统的“窗口管理器”一致。
如果嵌入器是操作系统的“窗口管理器”,那么对应的坐标也可以称为绝对屏幕坐标。
节点变换
此处涉及的节点都有一个或多个变换与之关联,将节点组合后就得到了在不同坐标系之间的变换。除了一些特殊情况之外,变换都是 Transform2D,下面列出了它们各自的详细信息和作用。
- CanvasLayer 变换
CanvasLayer 的变换为 transform,会影响该 CanvasLayer 中的所有 CanvasItem,不会影响所属 Viewport 中的其他 CanvasLayer 和 Window。
- CanvasLayer 视口跟随变换
follow viewport transform (跟随视口变换)是一种自动计算出来的变换。它基于 Viewport's (视口)的 canvas transform (画布变换)以及 CanvasLayer's (画布层)的 follow viewport scale (跟随视口缩放比例)得出。如果 enabled,就可以利用它来实现一种伪 3D(pseudo-3D)的视觉效果。它影响的子节点与 CanvasLayer transform (画布层变换)所影响的节点是完全相同的。
- 视口全局画布变换
Viewport 还具有全局画布变换。这是主变换,会影响所有CanvasLayer和嵌套 Window 的变换,主要用于 Godot 的 CanvasItem 编辑器。
- 视口拉伸变换
最后, Viewports (视口)拥有一个 stretch transform (拉伸变换),它主要用于视口的缩放或拉伸场景。正如 Windows 在 多分辨率 (多分辨率适配)中所描述的那样,这个变换会被应用到窗口上;不过,你也可以通过设置 SubViewports (子视口)的 size (尺寸)和 size_2d_override (2D尺寸覆盖)来手动控制它。需要注意的是,它的 translation (平移)、 rotation (旋转)和 skew (倾斜)默认都是初始值,只有 scale (缩放)可以设置为非默认值。
- 窗口位置
每个 Window 都还有一个 position,描述的是它在嵌入器中的位置。嵌入器可以是另一个 Viewport,也可以是操作系统窗口管理器。
- SubViewportContainer 收缩变换
SubViewportContainer 的 stretch 和 stretch_shrink 声明的是它所包含的 SubViewport 是否使用相对于容器大小的整数级缩放以及对应的缩放系数。