Двумерные системы координат и двумерные преобразования

Введение

Это подробный обзор доступных 2D-систем координат и встроенных 2D-преобразований. Основные концепции рассматриваются в Преобразование области просмотра и холста.

Transform2D — это матрицы, преобразующие координаты из одной системы в другую. Чтобы использовать их, полезно знать, какие системы координат доступны в Godot. Для более глубокого понимания смотрите руководство Матрицы и преобразования, которое содержит информацию о базовых функциях.

Двумерные системы координат Godot

На следующем рисунке представлен обзор двумерных систем координат Godot и доступных преобразований узлов, функций преобразования и функций, связанных с системами координат. Слева находится экран Диспетчера окон ОС, справа — элементы CanvasItems. Для простоты на рисунке не показаны элементы SubViewport, SubViewportContainer, ParallaxLayer и ParallaxBackground, которые также влияют на преобразования.

Графика основана на дереве узлов следующего вида: Корневое Окно (встроенные Окна)Окно (не встраивать Окна)CanvasLayerCanvasItemCanvasItemCanvasItem. Возможны и более сложные комбинации, например, глубоко вложенные Окна и подокна просмотра (SubViewports), однако этот пример призван дать общее представление о методологии.

../../_images/transforms_overview.webp

Кликните на картинку для увеличения.

  • Координаты предмета

    Это локальная система координат CanvasItem.

  • Координаты Родительского Предмета

    Это локальная система координат родительского элемента CanvasItem. При позиционировании CanvasItem на Canvas они обычно наследуют преобразования родительских элементов CanvasItems. Исключением является CanvasItems.top_level.

  • Координаты Холста

    Как упоминалось в предыдущем уроке Слои холста, существует два типа холстов (холст Viewport и холст CanvasLayer), и оба имеют свою систему координат. Они также называются мировыми координатами. Viewport может содержать несколько Canvas с разными системами координат.

  • Координаты Viewport

    Это система координат Viewport.

  • Координаты камеры

    Он используется только внутри компании для таких функций, как проекция лучей 3D-камеры.

  • Координаты встраивания/Координаты экрана

    Каждый Viewport (Window или SubViewport) в дереве сцены встроен либо в отдельный узел, либо в Диспетчер окон ОС. Начало этой системы координат совпадает с верхним левым углом Window или SubViewport, а её масштаб соответствует масштабу встроенного компонента или Диспетчера окон ОС.

    Если встраиваемым компонентом является Диспетчер окон ОС, то они также называются Screen Coordinates (экранными координатами).

  • Абсолютные координаты устройства встраивания / Абсолютные координаты экрана

    Начало этой системы координат — верхний левый угол узла внедрения или экрана Диспетчера окон ОС. Масштаб системы соответствует масштабу узла внедрения или Диспетчера окон ОС.

    Если встраиваемым компонентом является Диспетчер окон ОС, то они также называются Absolute Screen Coordinates (абсолютными экранными координатами).

Преобразования узлов

С каждым из упомянутых узлов связано одно или несколько преобразований, и их сочетание определяет преобразования между различными системами координат. За некоторыми исключениями, преобразования имеют вид Transform2D, и в следующем списке показаны подробности и эффекты каждого из них.

  • Преобразование CanvasItem

    CanvasItems — это либо Control-узлы, либо Node2D-узлы.

    Для узлов Control это преобразование состоит из position (позиция) относительно начала координат родителя и scale (шкала) и rotation (вращение) вокруг pivot point (точки поворота).

    Для узлов Node2D transform состоит из position, rotation, scale и skew (перекос).

    Преобразование влияет на сам элемент и обычно также на дочерние элементы CanvasItems, а в случае SubViewportContainer оно влияет на содержащийся в нем SubViewport.

  • Преобразование CanvasLayer

    transform для CanvasLayer влияет на все CanvasItems внутри CanvasLayer. Он не влияет на другие CanvasLayer или Windows в его Viewport.

  • CanvasLayer следует трансформации области просмотра

    Преобразование follow viewport transform — это автоматически вычисляемое преобразование, основанное на преобразовании холста Viewport и масштабе области просмотра CanvasLayer, и его можно использовать, если включено, для достижения псевдотрехмерного эффекта. Оно затрагивает те же дочерние узлы, что и CanvasLayer transform.

  • Преобразование холста области просмотра

    Преобразование canvas transform влияет на все элементы CanvasItems на холсте по умолчанию Viewport. Оно также влияет на CanvasLayers, для которых включено следующее преобразование области просмотра. Активный Camera2D объекта Viewport изменяет это преобразование. Оно не влияет на встроенные Windows этого Viewport.

  • Глобальное преобразование холста области просмотра

    У Viewports (видовых областей) также есть global canvas transform. Это главное преобразование, которое влияет на все отдельные преобразования слоя холста и встроенные преобразования окна. Оно в основном используется в редакторе CanvasItem в Godot.

  • Трансформация растяжения области просмотра

    Наконец, для Viewports доступно stretch transform (преобразование растяжения), которое используется при изменении размера или растяжении области просмотра. Это преобразование применяется для Windows, как описано в Несколько резолюций, но также может быть вручную задано для подвидовых областей с помощью size и size_2d_override. Его translation, rotation и skew являются значениями по умолчанию и могут иметь только нестандартные scale.

  • Преобразование окна

    Для масштабирования и позиционирования содержимого окна, как описано в Несколько резолюций, каждое Window содержит преобразование окна. Оно, например, отвечает за чёрные полосы по краям окна, чтобы Viewport отображалась с фиксированным соотношением сторон.

  • Положение окна

    У каждого окна также есть свойство position, описывающее его положение в среде внедрения. Эта среда может быть другим Viewport или диспетчером окон ОС.

  • Преобразование сжатия SubViewportContainer

    stretch вместе с stretch_shrink объявляют для SubViewportContainer, если и на какой целочисленный коэффициент содержащийся в нем SubViewport должен быть масштабирован по сравнению с размером контейнера.