自由落体问题

时间:2010-04-25 02:29:02

标签: c++ physics

好的,我会尽力解释我的问题。我有这个程序,你可以选择5个球。当您选择一个时,可以在按下鼠标按钮并且光标位于球的半径范围内时拖动它。

问题在于,当用户停止按下鼠标按钮时,我需要一种让球向上移动的方法,就像他将它发送到空中然后让它再次掉落一样。我有一种方法可以知道时间,速度和加速度,但我不知道如何实现它。

现在我有了这个:

void Circle::Fall(float velocity,float time)
{    
    if(this->posY >= 580)
    {
        this->posY = 580;
        this->vfall= 0.0f;
    }
    else if(this->posY < 580)
    {
        //this->distance=9.81f * 0.5f*time*time;
        this->vfall+= velocity;
        this->posY += this->vfall;
    } 
}

就这样,它就会崩溃,我无法达到我试图解释的效果。

另外,我正在计算这样的时间(以防它有帮助):

difX=(x> event.motion.xrel)? x-event.motion.xrel : event.motion.xrel-x;
difY=(y> event.motion.yrel)? y-event.motion.yrel : event.motion.yrel-y;

我正在使用difY作为时间变量


好的,对不起,我现在用英语。我将尝试让这更容易理解:

在释放咔哒声时,你需要用鼠标的速度让球浮起一点点,就像一只手在投入一些冲动后将球扔向空中。它不需要掉头或任何东西只是在Y上稍微上升。我正在使用SDL以防你需要知道

你也可以从窗户底部取出球,当你松开它们时,它们会自动返回它们

3 个答案:

答案 0 :(得分:2)

我认为你需要通过声音向上设置初始速度。

如果存储垂直速度,可以将其设置为正数。然后每一帧,将速度加到位置,然后从速度中减去一点,使其像重力一样。

所以请this->yVelocity(或使用您自己的语言; D)和this->yPosition,以及gravityMagnitude,这可能类似于-0.1。< / p>

每一帧,做这样的事情:

this->yVelocity += gravityMagnitude; //Subtracts 0.1
this->yPosition += this->yVelocity; //Make it actually move

这将逼真地模拟重力,因为球的运动将模仿二次函数。

另外,这样一来,如果你想让球首先浮起来,只要他们放手就说出来:

this->yVelocity = 2.0; //Or some other positive number

它会以一点速度开始。

答案 1 :(得分:2)

我想你想要这本书:Physics for Game Developers

答案 2 :(得分:1)

真的将我的记忆拉回到高中物理学。你需要的是suvat公式,特别是位移公式:

           1   2
s = ut  +  - at
           2
  • s是位移(从初始位置开始)。
  • 你是起步速度。
  • t是经过的时间。
  • a是加速度。

所以,考虑到你将球投向(例如)每秒5米,加速度为-9.8米每秒平方(地球上),它在1秒后的位置将高于起始高度。

请注意,您只需要担心这些方程式(重力)的上下变换,除非您的应用程序如此逼真以至于需要考虑风阻。

您需要做的就是存储初始位移(高度)和速度(仅垂直分量),然后您可以计算任何给定时间值的位移。

请记住,这些方程适用于恒定加速情况。它们可能(大部分)在地球周围(但大部分)可能在重力迅速变化的地方(如黑洞附近)不太适应。