【问题标题】:Projectile Motion calculation with chipmunk dynamics弹丸运动计算与花栗鼠动力学
【发布时间】:2010-01-05 19:05:49
【问题描述】:

我需要实现一点 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. 我知道弧度以及它们在度数上的差异,以及如何在两者之间进行转换。但是我应该在这里使用哪个?我应该将角度 1 和角度 2 转换为度数吗?即使我这样做了,它仍然不起作用。

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

花栗鼠中有什么东西可以用来解决这个问题,或者如果有人必须自己解决这个问题,我非常感谢一些帮助。

【问题讨论】:

    标签: cocos2d-iphone physics chipmunk


    【解决方案1】:

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

    float hVel = v * cos(angle2);
    

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

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

    F = ma
    

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

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

    【讨论】:

    • 你对 cos(angle) 的看法是正确的。我也猜测它是 cpv(hVel * pmass, vVel * pMass)。这是有道理的,但我仍然没有得到想要的结果。我认为重力可能是问题所在,我假设花栗鼠将重力模拟为 9.8i。
    【解决方案2】:

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

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

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

    这一点我怎么强调都不为过,原力与冲动是不一样的:

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

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

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

    【讨论】:

    • 抱歉,我读过 Chipmunk 并假设 C++ 的 Chipmunk :) 不过,物理学建议是一样的:维基百科中的公式是当你不对物体施加任何力时速度的角度(只有力是重力)。
    • 我明白你在说什么。也许我的变量名是一个糟糕的选择。我所说的“力量”是指“冲动的力量”。也许混合术语不是一个好主意,但这对我当时来说是有意义的。花栗鼠确实允许你施加冲动。
    • 如果有一些调试信息就好了,你能应用 impluse 并获得速度吗?另外,我想要一个您使用的数据示例:弹丸的初始位置,目标的位置。我希望这不是太多的要求。我是一名物理学家,我使用过花栗鼠的 python 扩展,所以我想我可以帮助你。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-29
    • 2019-04-20
    相关资源
    最近更新 更多