Я строю небольшой космический шутер. Я когда-либо сталкивался с математической проблемой, когда дело доходит до космической физики.
Описать это словами можно следующим образом:
Максимальная скорость есть.
Поэтому, если вы дадите полную скорость, ваш корабль будет перемещаться по экрану снова и снова, как в старых играх с астероидами.
Если затем отпустите ускорение ракеты, то ваш корабль должен продолжать двигаться с этой скоростью по экрану.
Тогда сложная часть, где я застрял прямо сейчас.
Если вы поворачиваете корабль на ЛЮБОЙ угол и снова разгоняетесь, корабль должен попытаться добраться в этом направлении, и НИКОГДА не превышать максимальную скорость, когда дело касается скорости его движения. так что мой вопрос У кого-нибудь есть хорошая идея формулы для этого вопроса? кажется, что это было сделано раньше, если вы знаете, что искать. :)
Я добавлю это маленькое изображение, чтобы проиллюстрировать, что пытаются сделать с помощью некоторых векторных расчетов.
![Max speed movement with force](https://i.stack.imgur.com/DGbod.png)
Красное кольцо: максимальная скорость
Зеленая линия: текущее направление корабля.
Черная линия: направление (я) и как быстро корабль движется в х и у.
Черное кольцо: начало движения.
Могу проиллюстрировать это, но трудно найти хорошее математическое решение для этого. :)
EDIT
Это код, который я сейчас использую в каждом кадре. Он дает движение кораблю, но не дает силы движения, которую пользователь должен противопоставить своим ракетным ускорителям, чтобы корабль остановился или замедлился. При этом он останавливается, как только вы отпускаете ускоряющую скорость для корабля.
//Calculates ship movement rules
var shipVelocityVec = GetVectorPosByAngle(shipMoveSpeed, shipRotationAngle);
var shipUnitVec =$V([Math.cos(shipRotationAngle),Math.sin(shipRotationAngle),0]);
var rawAccel = shipAccelSpeed / shipMass;
var scale = (shipUnitVec.dot(shipVelocityVec))/(shipTopSpeed * shipTopSpeed);
var v1 = shipUnitVec.subtract(shipVelocityVec.multiply(scale));
var finalAccelVec = v1.multiply(rawAccel);
console.log(finalAccelVec);
//move ship according to rules
var shipPosVector = $V([shipxPos, shipyPos, 0]);
var movementVector = shipPosVector.add(finalAccelVec);
shipxPos = movementVector.elements[0];
shipyPos = movementVector.elements[1];
Чтобы задать скорость ускорения, пользователь должен держать кнопку нажатой. В тот момент, когда пользователь отпускает кнопку, ускорение устанавливается на ноль, и ему приходится снова увеличивать скорость, чтобы обеспечить максимальное ускорение.
Решение найдено! Выложите здесь, как это было сделано.