【发布时间】:2023-04-07 23:08:01
【问题描述】:
我正在制作一款小型太空射击游戏。当涉及到空间物理学时,我曾经对数学问题感到困惑。
用文字描述如下: 有一个最大速度。 因此,如果您全速行驶,您的飞船将像在旧的小行星游戏中一样,一遍又一遍地在屏幕上移动。 如果随后释放火箭助推器,您的飞船应该会继续以该速度在屏幕上移动。
然后是我现在卡住的棘手部分。
如果您将船旋转任意角度并再次提供助力,船应该尝试到达这个方向,并且在移动速度方面永远不要超过最大速度。所以我的问题是。有人有这个问题的好主意公式吗?如果您知道要寻找什么,就感觉以前已经完成了。 :)
我将添加这个小图像来说明尝试通过一些矢量计算完成的工作。
红环:最大速度
绿线:当前船舶方向。
黑线:方向以及船在 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];
要获得加速速度,用户必须按住按钮。当用户松开按钮时,加速度设置为零,必须再次加速以提供最大加速度油门。
找到了解决方案!在这里发布了它是如何完成的。
【问题讨论】:
-
我认为这是一个二维的东西?保留单独的 x 和 y 速度指示器。如果您以某个角度推进,则将该角度推力分解为 x 和 y 分量,从而允许您分别调整船的 x/y 速度分量。每次调整速度时,检查船速,如果达到最大值则停止调整。
-
请纠正我的误解,但在图像 #3 中,速度的组合矢量不是大于红环允许的速度吗?
-
不,因为 x 和 y 加在一起等于 circels 最大运动。绿线可能更长。在 #3 中,绿线应该是圆直径的全长。
-
分离 X 和 Y 运动不是一个坏主意!
-
+1 用您的问题制作图表
标签: javascript math vector game-physics