0

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

我的数学很糟糕,我的物理也很糟糕,但我一直在阅读,在 SO 的帮助下,以及来自这个维基百科条目的以下内容,我得到了这个

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 转换为度数吗?即使我这样做了,它仍然不起作用。

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

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

4

2 回答 2

1

一方面,我认为水平速度应该是:

float hVel = v * cos(angle2);

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

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

F = ma

由于我们正在将此弹丸从零速度加速到 v,因此加速度将等于 v。但是,您需要将此加速度乘以物体的质量才能获得所需的正确力。

CGPoint force = cpv(hVel, vVel) * projectileMass;
于 2010-01-05T19:09:01.523 回答
0

好的。问题是(除了 v*cos(angle) 的拼写错误)您将力量与冲动混淆了。

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

  • 通过使用设置器手动更改速度,将速度设置为所需的速度 cpBodySetVel(cpBody *body, cpFloat Vel),或
  • 假设初始速度为 0,对物体施加一个冲量。

我怎么强调都不为过,力量与冲动不同:

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

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

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

于 2010-02-04T04:22:51.847 回答