【问题标题】:Box2D (C++) Gravity WellsBox2D (C++) 重力井
【发布时间】:2010-12-06 04:40:46
【问题描述】:

目前我在我的一个游戏中使用 Box2D 物理引擎 - 我想知道我是否可以创建一个重力井,其中所有物体都被吸引到一个任意点。有什么方法可以做到这一点,还是我必须对每个身体施加某种自定义力量? (我尝试制作一个静态的超致密物体,但 Box2D 并没有在物体对物体的基础上应用牛顿万有引力定律)

另外,有没有办法制造一个反重力井?我可以制作一个以任意点为中心的更密集的球体并使用浮力来实现吗?

【问题讨论】:

    标签: c++ physics box2d game-physics gravity


    【解决方案1】:

    不幸的是,Box2D 没有内置此功能。最简单的方法是获取重力井和刚体之间的角度和距离,并相应地设置刚体速度。

    获取角度:

    double dx = rigidBodyX - gravityWellX;
    double dy = rigidBodyY - gravityWellY;
    double angle = atan2(dy, dx);
    // angle is in radians, use atan2(dy, dx) / PI * 180 if 
    // you need degrees
    

    获取距离:

    double dx = rigidBodyX - gravityWellX;
    double dy = rigidBodyY - gravityWellY;
    double dist = sqrt(dx * dx + dy * dy);
    

    我使用 flash 和我编写的名为 QuickBox2D 的库创建了一个快速示例。由于语法与 C++ Box2D 库非常不同,因此它可能没有那么有用,但基本原理是相同的。这也不是一个完美的例子,但它可能会让你开始。

    See The Flash Example

    【讨论】:

    • 我修改了你的 flash 版本并将第 49+50 行更改为 dir.x = currVel.x + (intensity * Math.cos(ang))/(dist * dist); dir.y = currVel.y + (intensity * Math.sin(ang))/(dist * dist);显然在上面的代码之前添加了这个 var dist:Number = dist(big, little);
    • 你需要增加强度,但是这些变化会应用平方反比定律:)
    • 是的,您的权利..您需要根据距离增加强度。很高兴我能帮上忙。
    猜你喜欢
    • 1970-01-01
    • 2014-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多