Помощь с векторами

Версия Minecraft
1.6.4
355
2
17
Добро, я тут весьма запутался уже в этих векторах.. В общем, ситуация такова, хочу сделать что-то по типу магии, которая будет вылетать из точки А в точку Б, уже заранее поставленному вектору, и как только долетит - проверять на сущности рядом или же если изначально по вектору была найдена сущность - лететь за ней.

Тобишь по сути мне нужно двигать по вектору еще один вектор с точкой (по ней же потом рисовать партикл) до финальной точки, как можно настроить такое движение? Каждый тик двигая его на N дальше по вектору, или по отрезкам, в зависимости от расстояния..

Вот пример (С Юнити, там проще дебажить вектора)

xAeDLExsRLqaY2.png
 
Java:
double length = start.distanceTo(end);
double speedFactor = 3;
double motionX = (end.xCoord-start.xCoord)/length * speedFactor;
double motionY = (end.yCoord-start.yCoord)/length * speedFactor;
double motionZ = (end.zCoord-start.zCoord)/length * speedFactor;
расстояние до векторов думаю понятно как считать
 
67
1
3
Как я понял, тебе, в тот момент, как происходит создание летящего объекта нужно определить, есть ли на его пути какие-либо цели, и, если есть, то лететь всегда в направлении этого объекта (следовать за ним, вплоть до достижения), если же нет, то просто пролететь в изначально заданном направлении определённое расстояние.
Если тебе изначально даны точки A B, то всё просто:
получаешь отрезок AB, проверяешь пересекает ли он какую либо цель, если их несколько, то выбираешь ближаёшую, запоминаешь её (допустим её координаты - вектор C) и просто на каждом шагу расчитываешь новое направление (C - D) / ||C - D|| (это единичный ветор, имеющий направление от D к C, где D - текущие координаты твоего объекта (его можно домножить на число, задающее скорость движения), и его просто на каждом шагу прибавляешь к координатам твоего объекта. Если же отрезок AB не пересекает никаких объектов, то единичный вектор это просто (B-A)/||B-A||, его достаточно посчитать 1 раз (домножить на скорость, если нужно), и на каждом шагу просто прибавлять к координатам объекта. Для расчёта поподания в первом случае (следование до цели), проверяешь на каждом шагу, пересекаются ли хитбоксы твоего объекта и цели; во втором случае проверяешь, находится ли точка B в границах хитбокса твоего объекта (учитывай тот факт, что если скорость полёта большая, то ты можешь пропустить нужный шаг, поэтому имеет смысл учитывать скорость и/или проверять не пролетел ли ты мимо (не изменил ли вектор (B-C) своё направление на противоположеное)).

Если же ты изначально имеешь точку A и вектор направления полёта объекта, то на самом первом шаге нужно найти, что первым встречается на пути. Для этого можно использовать ray casting. После того, как цель найдена, если это двигающийся объект, то осчитаешь его целью, за которой надо следовать (как описано выше), если не двигающийся, то считаешь его точкой B.
1573722926114.png
 
Последнее редактирование:
Сверху