Этот топик является логическим продолжением этого мануала: Мировое пространство | World Space.
Почему существуют две функции для получения позиции игрового объекта —
в локальном и в мировом пространстве?
function init(self)
print("World position (get_position): " .. go.get_position())
print("World position: (get_world_position)" .. go.get_world_position())
end
Всё дело в том, что игровые объекты могут содержать в себе другие игровые объекты. В таком случае, один из них становится родителем, а другой ребёнком.
Игровой объект, который содержит в себе игровой объект, является родителем по отношению к содержащемуся в нём игровому объекту:
На этом скриншоте компоненты находятся в локальном пространстве родительского игрового объекта вместе с дочерним игровым объектом:
Компоненты всегда локальны относительно своего игрового объекта, но они не могут иметь дочерние игровые объекты. Локальность касается позиции, поворота и масштаба, а не только координат.
Давайте в качестве аналогии, приведу пример:
Представьте человека, часы, кепка, куртка. Человек и его части тела являются родительским объектом. А одежда и аксессуары можно рассматривать как дочерние объекты по отношению к человеку. Если человек двигается в пространстве, то вместе с ним двигаются и часы, кепка, куртка. Если человек поправляет часы на правой руке, то позиция человека не меняется(движение рук не учитываем), то движение часов относительно руки меняет мировую позицию часов, но не позицию родителя.
go.set_position() всегда задаёт локальную позицию объекта.
Если у объекта нет родителя — локальная позиция совпадает с мировой.
Если мы будем использовать по отношению к игровому объекту go.get_position(), то мы получим локальную позицию по отношению к родительскому игровому объекту.
Если мы используем go.get_position() для родителя, то получим локальную позицию, совпадающую с мировой позицией игрового объекта.
function init(self)
print("World position for parent (get_position): " .. go.get_position(go.get_id("/parent")))
print("World position for child (get_position):" .. go.get_position(go.get_id("/child")))
end
Несмотря на то, что это одна команда, результат отличается, т.к в первом случае выводятся координаты родителя в мировом пространстве.
А для второго случая выводятся координаты родителя для ребёнка в локальном пространcтве:
![]()
Если локальная позиция дочернего объекта равна (0,0,0),
то его мировая позиция совпадает с мировой позицией родителя
(только если родитель не имеет дополнительного поворота или масштаба, иначе мировая позиция может немного отличаться из-за преобразований матрицы):
function init(self)
print("World position for parent (get_position): " .. go.get_world_position(go.get_id("/parent")))
print("World position for child (get_position):" .. go.get_world_position(go.get_id("/child")))
end
Давайте теперь изменим позицию дочернего игрового объекта в редакторе:
Позиция в мировом пространстве изменилась для ребёнка:
Теперь вновь воспользуемся командой go.get_position():
function init(self)
print("World position for parent (get_position): " .. go.get_position(go.get_id("/parent")))
print("World position for child (get_position):" .. go.get_position(go.get_id("/child")))
end

Мы видим, что в консоли показываются локальные координаты для ребёнка. И они отличаются от предыдущего случая с go.get_world_position().
Надеюсь, с local space и world space всё понятно и ясно.
Если есть вопросы, задавайте.






