2010-01-05 51 views
0

我需要实现一点Ai,它可以将冲量施加到刚体上以击中目标。就像炮弹从大炮射出一样。我使用Chipmunk Dynamics作为物理引擎。射弹运动与花栗鼠动力学计算

我的数学是可怕的,因为是我的物理学,但我一直在读了起来,并从那么一点点的帮助,从这个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. 我知道弧度及其与度数的差异,以及如何在两者之间进行转换。但我应该在哪里使用?我应该将角度1和角度2转换为度数吗?即使我这样做,它仍然不起作用。

总之,关于物理和花栗鼠有很多我不明白。所以我在这里,寻求帮助。

有什么花栗鼠,我可以用它来解决这个问题,或者如果有人必须弄清楚自己,我真的很感谢一些帮助。

回答

1

原因之一,我认为水平速度应该是:

float hVel = v * cos(angle2); 

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

我从来没有使用花栗鼠,但我猜你不能直接对对象应用速度?你必须施加一种力量,它将物体加速到一个特定的速度。对于力公式很简单:

F = ma 

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

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

你是对的cos(角度)。我也猜测它是cpv(hVel * pmass,vVel * pMass)。这是有道理的,但我仍然没有得到期望的结果。我认为引力可能是问题,我假设花栗鼠将重力模拟为9.8i。 – gargantuan 2010-01-05 20:04:26

0

好的。问题是(除了v * cos(角度)的拼写错误),你会用冲动混淆力量。

以角度施加力不会使物体的速度具有所需的角度和大小。你必须:

  • 通过手动改变使用cpBodySetVel(cpBody *body, cpFloat Vel)设定器假设初始速度的速度,或
  • 设置速度为所需的速度为0时,施加冲动到对象。

我不能强调这一点,力是不一样的冲动:

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

我不认为花栗鼠允许应用冲动。但是,您可以通过将力分为算法的时间步长,施加一个时间步长的力并随后移除力来模拟冲动。但是,坚持使用setter来设置速度可能会更好。

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

+0

对不起,我读过Chipmunk,并假设C++的Chipmunk :)不过,物理学建议是一样的:维基百科中的公式是用于速度的角度,当你不对物体施加任何力时(只有力是重力)。 – Ezequiel 2010-02-04 04:41:24

+0

我明白你在说什么。也许我的变量名是一个不好的选择。我的意思是'冲动的力量'。也许混合术语并不是一个好主意,但当时对我来说是有意义的。花栗鼠的确可以让你施加冲动。 – gargantuan 2010-02-04 20:46:42

+0

有一些调试信息会很好,你可以应用impluse并获得速度吗?另外,我想用一个你使用的数据的例子:弹丸的初始位置,目标的位置。 我希望这不是太多问。我是一名物理学家,我使用花栗鼠的Python扩展,所以我想我可以帮助你。 – Ezequiel 2010-02-05 16:43:05