弹丸运动计算与花栗鼠动力学

时间:2010-01-05 19:05:49

标签: cocos2d-iphone physics chipmunk

我需要实施一点Ai,可以对刚体施加冲动以击中目标。就像从大炮射出的炮弹一样。我正在使用Chipmunk Dynamics作为物理引擎。

我的数学很糟糕,就像我的物理学一样,但我一直在阅读,并且在SO {以及wikipedia entry以下的一点帮助下,我得到了这个

float x = target.x = launchPos.x;
float y = target.y = launchPos.y;
float g = 9.8;
float v = 100;
float angle1, angle2;

float tmp = pow(v, 4) - g * (g * pow(x, 2) + 2 * y * pow(v, 2));

if(tmp < 0){
NSLog(@"No Firing Solution");
}else{
angle1 = atan2(pow(v, 2) + sqrt(tmp), g * x);
angle2 = atan2(pow(v, 2) - sqrt(tmp), g * x);
}

// Split the velocities
float vVel = v * sin(angle2);
//NSLog(@"Vertical Velocity: %f", vVel);

float hVel = v / cos(angle2);
//NSLog(@"Horizontal Velocity: %f", hVel);

CGPoint force = cpv(hVel, vVel);

这应该给我一个角度,从中我可以计算发射射弹所需的水平和垂直速度。

然而,它不起作用,出于多种原因,这并不让我感到惊讶。首先是因为我在数学和物理方面很糟糕,但也因为我对其他一些事情感到困惑。

  1. 此方法似乎没有考虑到质量。应该是?我原以为这非常重要?但后来,我在大学学习艺术,所以我可能错了。

  2. Box2d有PTM_RATIO,但我在花栗鼠中找不到类似的东西,那么我的值如何与花栗鼠中的空间坐标相对应?

  3. 我知道弧度以及它们与度数的区别,以及如何在两者之间进行转换。但是我应该在这里使用哪个?我应该将angle1和angle2转换为度吗?即使我这样做,它仍然无效。

  4. 总之,我不了解物理和花栗鼠的很多东西。所以我在这里,寻求帮助。

    花栗鼠中有什么东西可以用来解决这个问题,或者如果有人不得不自己解决这个问题,我真的很感激一些帮助。

2 个答案:

答案 0 :(得分:1)

首先,我认为水平速度应该是:

float hVel = v * cos(angle2);

而且,你是正确的,你需要考虑质量。看起来你直接从速度推导出力矢量,这是不正确的。

我从未使用过Chipmunk,但我猜你不能直接对物体施加速度?您必须施加一个力,将物体加速到特定的速度。力的等式很简单:

F = ma

由于我们将这个射弹从零速度加速到v,加速度将等于v。但是,你需要将此加速度乘以物体的质量,以获得所需的正确力。

CGPoint force = cpv(hVel, vVel) * projectileMass;

答案 1 :(得分:0)

确定。问题是(除了v * cos(角度)的拼写错误之外)你用冲动来混淆力量。

施加一个角度的力不会使物体的速度达到所需的角度和大小。你必须:

  • 使用cpBodySetVel(cpBody *body, cpFloat Vel) setter手动更改速度,将速度设置为所需的速度,或
  • 假设初始速度为0,则对该对象应用脉冲

我不能强调这一点,力量与冲动不一样:

  • 如果对物体施加恒定力,速度会随时间连续变化,从0速度到无限速度......根本不是你想要的。
  • 如果对物体施加一次脉冲,速度将立即从v0变为v0 +脉冲/质量。

我不认为花栗鼠允许施加冲动。但是你可以通过将力除以算法的时间步长来模拟一个脉冲,将力施加一个时间步,然后去除力。但是最好坚持使用设定器来设定速度。

如果你真的必须对身体施加恒定的力量才能到达目标,那么方程式就不是你在维基百科中找到的那些。