用于NetPlay的完全可复制的JavaScript Physic 2D引擎



是否有任何完全可复制的JavaScript Physic 2D引擎,因此我们可以将模拟状态保存为字节数组,然后将其加载到另一台计算机(同一体系结构)中,以便两个仿真都可以执行同样的下一步?

我已经听说过,box2d有一些(缓存?)数据,我们无法与身体/力量/关节一起存储。

根据我的经验,物理发动机状态的完全复制是困难和不必要的。

对于实时多人游戏,通常您可以运行本地物理模拟,如果状态(位置,旋转,速度)与服务器状态有太大不同,则对其进行更正。虚幻引擎使用这种方法,请访问https://docs.unrealengine.com/udk/three/networkingoverview.html#physics

游戏只需要物理场景的初始状态即可执行动画(例如基于转弯的游戏),也不需要完整的物理引擎状态。如果您以确定性的方式使用物理引擎是确定性的。要以两个客户的方式重新播放物理动画,请记住:

  • 重置(重新创建)b2World在开始模拟之前,要摆脱b2World中的任何内部状态。
  • 建立您的物理世界,在其初始位置上创建身体等等。
  • 在所有客户端上使用相同的固定时间步长进行模拟前进(使用渲染帧delta时间,因为在所有客户端上都不一样!)。
  • 如果您需要在模拟过程中与身体互动(例如,使用力),那么在同一步骤号码上进行它很重要。。

作为一个例子,以下功能每次都会在所有客户端上返回相同的结果,如果它们都获得了相同的InitialPhysicsState

float deterministicFunction( InitialPhysicsState state ){
    b2World* world = createWorld(state);
    b2Body* body = world->GetBodyList();
    for(int i=0; i<100; i++){
        if(i==50){
            body->ApplyForce(b2Vec2(10.0f, 2.0f));
        }
        world->Step(0.01f, 8, 3);
    }
    return body->GetPosition().y;
}

最新更新