将重力应用到简单的2D球投掷模拟器中

时间:2018-01-22 01:24:16

标签: math 2d gravity

我正在创建一个简单的模拟器,用于基本投掷球形物体(我巧妙地称之为)。当用户点击屏幕时,球将开始以该方向(从球到鼠标的距离)行进。球将受到重力的影响,因此以抛物线行进。

原计划是按照以下方式实现此目的(伪代码,为清晰起见,删除了动态刻度校正):

on click:
    ball.forwardTheta = atan2(mouseY - ball.y, mouseY - ball.x)
    ball.speed = sqrt((mouseX - ball.x)^2 + (mouseY - ball.y)^2) / 50

tick:
    ball.x += ball.speed * cos(ball.forwardTheta),
    ball.y += ball.speed * sin(ball.forwardTheta);
    ball.forwardTheta += Math.PI / constGravity;

这导致一个系统的工作方式类似于我喜欢的方式,但是,我担心这会引起进一步的问题,例如一旦我尝试实现以反射角度弹跳的球等。,目前大多数时候球以 Pi / 2 (直线向下)的角度与表面碰撞,这意味着没有反射角。
经过一些研究,似乎一个常见的简单重力实现是通过从每个刻度的移动物体的y坐标减去一个恒定的重力值,但这对我来说似乎不合适,但更多的是作弊,所以我的问题是“适当的“在2D空间中对物体的抛物线运动实施重力的方法。

1 个答案:

答案 0 :(得分:2)

重力会产生加速度,因此速度(不是明确的坐标)会改变每个刻度。

一般情况下

ball.speed.x = ball.speed.x + acceleration.x * timequant
ball.speed.y = ball.speed.y + acceleration.y * timequant

对于y向重力的情况

ball.speed.y = ball.speed.y + g * timequant

和速度的x分量不会改变

不是速度的分量表示可以帮助你进行反射计算(例如,垂直边界的反射否定x分量)