Box2D(Cocos2D)随时间推移的恒定力

时间:2011-06-14 10:49:31

标签: xcode math cocos2d-iphone physics box2d-iphone

我是一个相当聪明的人,但当我看到某种数学时,我可能会成为一个巨大的白痴。我真的可以在这里使用一些帮助。

当我学习iOS游戏开发时,我一直在研究大量的东西,并且在进行一些搜索时遇到了一个公式。这是公式:

  

x(t)= x(0)+ v(0)* t + .5(F / m)* t ^ 2

还说明了解决x和y:

  

Fx =(x(t) - x(0) - vx(0)* t)* 2m / t ^ 2

     

Fy =(y(t) - y(0) - vy(0)* t)* 2m / t ^ 2

来源:Box2D.org forums

现在我的实际问题是什么意思?请记住,在这种情况下,我是一个白痴。如果有人能够用简单的术语解释变量以及它们与box2d的关系,那将会很棒。我该如何应用这个公式?这是我的代码示例(发射射弹):

- (void)spawnProjectile:(CGPoint)from direction:(CGPoint)direction inParent:(CCNode*)parentNode
{
    double curTime = CACurrentMediaTime();

    double timeTillShotDies = curTime + SHOT_TYPE1_EXIST_TIME;

    b2Body *shotBody = projectileBodyTracker[nextShot];

    b2Vec2 moveToPosition = b2Vec2(from.x/PTM_RATIO, from.y/PTM_RATIO);
    shotBody->SetTransform(moveToPosition, 0.0);
    shotBody->SetActive(true);

    CCSprite *shot = [projectiles objectAtIndex:nextShot];
    shot.position = ccp(from.x/PTM_RATIO, from.y/PTM_RATIO);

    shot.visible = YES;
    [projectilesTracker replaceObjectAtIndex:nextShot withObject:[NSNumber numberWithDouble:timeTillShotDies]];
    CCParticleSystemQuad *particle = [projectileParticleTracker objectAtIndex:nextShot];
    [particle resetSystem];
    nextShot++;
    if(nextShot >= projectiles.count) nextShot = 0;

    // dx2 and dy2 are analog stick values (see below code)
    b2Vec2 force = b2Vec2(dx2, dy2);
    shotBody->SetLinearVelocity(force);

    [AudioController playLaserShot];
}

在这个特殊的代码块中,我从模拟器所处的角度向玩家发射。我还需要使用公式从敌人射击到玩家。这是一个自上而下的太空射击游戏。

总而言之,就box2d代码而言,如何解决x和y随时间的恒定力?

额外信息:

dx2 = (float)joypadBG2.position.x - (float)convertedPoint.x;
dy2 = (float)joypadBG2.position.y - (float)convertedPoint.y;

所有对象都预先加载并保持这种状态。机体设置为非活动状态,精灵设置为不可见。粒子系统停止了。再次使用抛射物则相反。

非常感谢您提供的任何帮助。我希望我没有忘记任何事情。

2 个答案:

答案 0 :(得分:1)

第一个等式描述了受恒定力作用的物体的运动。 对象从位置x(0)开始,速度为v(0)。 x和v都是向量,因此在2d射手中,x(0)将是(x0,y0)或xy位置,v(0)将是(vx0,vy0)。

如果没有重力,则在未推进的射弹(没有推进器的射弹)上F = 0, 所以速度会不变。

x(t1)= x(t0)+ vx *(t1-t0) y(t1)= y(t0)+ vy *(t1-t0)

t1-t0或dt(delta-t)是自您上次更新射弹位置以来经过的时间。

如果物体或重力超过物体上的力,则速度会随时间而变化。

vx(t1)= vx(t0)+ ax *(t1-t0) vy(t1)= vy(t0)+ ay *(t1-t0)

a是加速度。在游戏中,你通常不关心质量和力量,只关心加速度。在物理学中,a = F / m。

编辑1: 在计算机游戏中,您可以非常频繁地更新对象的位置(通常每秒约60次)。您在上次更新时拥有对象的位置和速度,并且您想要计算新位置。

通过假设速度恒定来更新位置:

positionVectorAt(newTime) = positionVector(lastTime) + velocityVector*(newTime - lastTime);

如果物体的速度发生变化,您还可以更新速度:

velocityVectorAt(newTime) = velocityVector(lastTime) + accelerationVector*(newTime - lastTime);

假设我们有一个精灵

positionVector.x=100; 
positionVector.y=10;

初始速度为

velocityVector.x = 3;
velocityVector.y = -10;

精灵正在使用推进器,它每秒提供一次水平加速度

thrusterVector.x= 5; 

并且它还受到重力的影响,该重力给出了每秒的垂直加速度

gravityVector.y = -10;

更新精灵位置的代码将是:

deltaTime = now - lastTime; // Time elapsed since last position update

// Update the position
positionVector.x = positionVector.x + velocityVector.x * deltaTime;
positionVector.y = positionVector.y + velocityVector.y * deltaTime;

// Update the velocity
velocityVector.x = velocityVector.x + (thrusterVector.x + gravityVector.x) * deltaTime;
velocityVector.y = velocityVector.y + (thrusterVector.y + gravityVector.y) * deltaTime;

// Done! The sprite now has a new position and a new velocity!

答案 1 :(得分:1)

以下是一个快速解释:

x(t) = x(0) + v(0)*t + .5 (F/m) * t^2
Fx = (x(t) - x(0) - vx(0)*t) * 2m/t^2
Fy = (y(t) - y(0) - vy(0)*t) * 2m/t^2

这3个方程是标准运动方程式:

  • t:时间
  • x(t):时间t
  • 的位置
  • v(t):速度t
  • vx(t):时间t
  • 的速度水平分量
  • vy(t):时间t
  • 的速度垂直分量
  • m:mass
  • F:强制
  • Fx:力量的水平分量
  • Fy:力量的垂直分量

当然,每当您看到x(0)vy(0)时,这些值都会在时间t获取,即它们是初始值。这些方程是basic cinematic equations,具有基本的电影变量(位置,速度,力,质量)。