Векторы, вычисление сил движения с максимальной скоростью.

Я создаю небольшой космический шутер. Я когда-либо сталкивался с математической задачей, когда дело касалось физики космоса.

Описать это словами можно следующим образом: Есть максимальная скорость. Так что, если вы дадите полную скорость, ваш корабль будет перемещаться с этим по экрану снова и снова, как в старых играх с астероидами. Если затем отпустить ракетный ускоритель, ваш корабль должен продолжать двигаться с этой скоростью по экрану.

Затем сложная часть, в которой я застрял прямо сейчас.

Если вы повернете корабль на ЛЮБОЙ угол и снова дадите ускорение, корабль должен попытаться добраться в этом направлении и НИКОГДА не превышайте максимальную скорость, когда речь идет о том, насколько быстро он движется. так что мой вопрос. у кого-нибудь есть хорошая идея формулы для этого вопроса? кажется, что это уже делалось раньше, если вы знаете, что искать. :)

Я добавлю это маленькое изображение, чтобы проиллюстрировать, что пытаются сделать с некоторыми векторными вычислениями. Max speed movement with force

Красное кольцо: максимальная скорость

Зеленая линия: текущее направление судна.

Черная линия: направление (я) и скорость движения корабля по осям x и y.

Черное кольцо: происхождение движения.

Могу проиллюстрировать это, но трудно найти для этого хорошее математическое решение. :)

РЕДАКТИРОВАТЬ

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

    //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];

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

Решение найдено! Выложил сюда как это делали.

7
задан PaulR 25 July 2018 в 09:22
поделиться