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

Введение

Это обзор 2D преобразований, происходящих для узлов с момента их локального рисования содержимого до момента их рисования на экране. В этом обзоре обсуждаются детали движка очень низкого уровня.

Преобразования холста

Как упоминалось в предыдущем руководстве Слои холста, каждый узел CanvasItem (помните, что узлы на основе Node2D и Control используют CanvasItem в качестве общего корня) будет находиться в Canvas Layer. Каждый слой холста имеет преобразование (перемещение, поворот, масштаб и т.д.), к которому можно получить доступ как Transform2D.

Как было сказано в предыдущем уроке, узлы по умолчанию рисуются на 0-ом слое на встроенном холсте. Для того, чтобы поместить узлы на другой слой, можно воспользоваться узлом CanvasLayer.

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

Видовые экраны также имеют преобразование Global Canvas (также: ref:Transform2D <class_Transform2D>). Это основное преобразование, которое влияет на все отдельные преобразования Canvas Layer. Как правило, от этого преобразования мало пользы, но оно используется в CanvasItem Editor в редакторе Godot.

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

Наконец, в видовых экранах есть функция Stretch Transform, которая используется при изменении размера или растягивании экрана. Это преобразование используется внутренне (как описано в Multiple resolutions), но также может быть вручную установлено для каждого видового экрана.

Входные события, полученные в обратном вызове MainLoop._input_event (), умножаются на это преобразование, но отсутствуют указанные выше. Чтобы преобразовать координаты InputEvent в локальные координаты CanvasItem, для удобства была добавлена функция CanvasItem.make_input_local ().

Порядок преобразований

Чтобы координата в локальных свойствах CanvasItem стала фактической координатой экрана, необходимо применить следующую цепочку преобразований:

../../_images/viewport_transforms2.png

Функции преобразования

Получить каждое преобразование можно с помощью следующих функций:

Тип

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

CanvasItem

CanvasItem.get_global_transform()

CanvasLayer

CanvasItem.get_canvas_transform()

CanvasLayer+GlobalCanvas+Stretch

CanvasItem.get_viewport_transform()

Наконец, чтобы преобразовать локальные координаты CanvasItem в экранные координаты, просто умножьте в следующем порядке:

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

Однако имейте в виду, что обычно нежелательно работать с экранными координатами. Рекомендуемый подход - просто работать в координатах холста (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);