我需要实施一点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);
这应该给我一个角度,从中我可以计算发射射弹所需的水平和垂直速度。
然而,它不起作用,出于多种原因,这并不让我感到惊讶。首先是因为我在数学和物理方面很糟糕,但也因为我对其他一些事情感到困惑。
此方法似乎没有考虑到质量。应该是?我原以为这非常重要?但后来,我在大学学习艺术,所以我可能错了。
Box2d有PTM_RATIO,但我在花栗鼠中找不到类似的东西,那么我的值如何与花栗鼠中的空间坐标相对应?
我知道弧度以及它们与度数的区别,以及如何在两者之间进行转换。但是我应该在这里使用哪个?我应该将angle1和angle2转换为度吗?即使我这样做,它仍然无效。
总之,我不了解物理和花栗鼠的很多东西。所以我在这里,寻求帮助。
花栗鼠中有什么东西可以用来解决这个问题,或者如果有人不得不自己解决这个问题,我真的很感激一些帮助。
答案 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手动更改速度,将速度设置为所需的速度,或我不能强调这一点,力量与冲动不一样:
我不认为花栗鼠允许施加冲动。但是你可以通过将力除以算法的时间步长来模拟一个脉冲,将力施加一个时间步,然后去除力。但是最好坚持使用设定器来设定速度。
如果你真的必须对身体施加恒定的力量才能到达目标,那么方程式就不是你在维基百科中找到的那些。