Реализация опорных точек (pivot points) в 2d

(click to interact)Explaining pivot points
(mouseover/click to play GIF) (космический корабль из набора графики Kenney)

В наше время, большинство инструментов для разработки игр позволяют менять центр вращения для изображений.

Но, увы — возможность задания и опроса произвольных точек на изображениях — к примеру, для выстрела снарядов из дула (показано), или крепления изображений на правильные точки, остается относительно редкой.

Это — небольшое руководство по теме.


Если вы знакомы с основами тригонометрии, вы уже и сами знаете, что вычислить смещение от точки в направлении можно с помощью синуса/косинуса:
new_x = x + cos(angle) * offset
new_y = y + sin(angle) * offset
(предполагая, что угол в радианах, как и аргументы функций)

Или, если вы используете GameMaker и любите измерение углов в градусах,

new_x = x + lengthdir_x(offset, angle)
new_y = y + lengthdir_y(offset, angle)
и это уже половина логики:

(click to interact) Explaining pivot points
(желтым: смещение по X)

Зачастую, смещение есть по обоим осям. Смещение для второй оси находится похожим образом, но перпендикулярно:
new_x = x + cos(angle + pi / 2) * offset_y
new_y = y + sin(angle + pi / 2) * offset_y
(будет ли это +pi/2 или -pi/2 зависит от того, направления оси Y в системе координат)

или с помощью lengthdir функций и градусов в GM:

new_x = x + lengthdir_x(offset_y, angle - 90)
new_y = y + lengthdir_y(offset_y, angle - 90)
теперь вы уже проделали большую часть работы:

(click to interact) Explaining pivot points
(зеленым: смещение по Y)

Совмещение же смещений по осям производится простым их сложением:
new_x = x + cos(angle) * offset_x + cos(angle + pi / 2) * offset_y
new_y = y + sin(angle) * offset_x + sin(angle + pi / 2) * offset_y

или, в GM

new_x = x + lengthdir_x(offset_x, angle) + lengthdir_x(offset_y, angle - 90)
new_y = y + lengthdir_y(offset_x, angle) + lengthdir_y(offset_y, angle - 90)

и это всё

(click to interact) Explaining pivot points
(бирюзовым: совмещенное смещение)

Как примечание, у вас может возникнуть желание избавиться от второй пары синусов/косинусов использованием заранее вычисленного угла и длины гипотенузы,

(click to interact) Explaining pivot points
(белым: гипотенуза)

но обычно оно того не стоит - проще воспользоваться взаимоотношением между sin/cos,
_cos = cos(angle)
_sin = sin(angle)
new_x = x + _cos * offset_x - _sin * offset_y
new_y = y + _sin * offset_x + _cos * offset_y
и, если вам нужно учитывать локальный масштаб, вы можете домножить каждое из смещений,
new_x = x + cos(angle) * offset_x * scale_x + cos(angle + pi / 2) * offset_y * scale_y
new_y = y + sin(angle) * offset_x * scale_x + sin(angle + pi / 2) * offset_y * scale_y
или, в GM,
new_x = x + lengthdir_x(offset_x * scale_x, angle) + lengthdir_x(offset_y * scale_y, angle - 90)
new_y = y + lengthdir_y(offset_x * scale_x, angle) + lengthdir_y(offset_y * scale_y, angle - 90)

(click to interact) Explaining pivot points
(белым: совмещенные смещения)

И это всё!

Похожие записи

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.