使用 ReactPhysics3D 在 n 体模拟中未检测到碰撞

No collision is detected in n-body simulation using ReactPhysics3D

我目前正在使用 ReactPhysics3D(https://www.reactphysics3d.com/) 进行 n 体模拟。

我对两个球体的碰撞做了简单的模拟。然后,我在模拟运行时打印两个球体的坐标。问题是它们不会碰撞,而是会相互穿过。然后,他们以奇怪的姿势相撞。

这是设置 创建了两个球体 第一个球体的位置为 (-2, 0, 0),初始速度为 (1, 0, 0),半径 = 0.5,质量 = 10 第二个球体的位置为 (0, 0, 0),初始速度为 (-1, 0, 0),半径 = 0.5,质量 = 10

我以为他们会在0: (-1.5, 0.0, 0.0)的位置发生碰撞 1: (-0.5, 0.0, 0.0) 但他们穿过它并在 0: (-0.5, 0.0, 0.0)1: (-1.5, 0.0, 0.0)

处相撞

这是我的代码

int main (int argc, char **argv) {
    Vector3 gravity = Vector3(0.0, 0.0, 0.0);

    double mSimulationTime = 2.0;
    DynamicsWorld dynamicsWorld(gravity);

    // create a rigid body with the position
    Vector3 initPosition1(-2.0, 0.0, 0.0);
    Quaternion quaternion1 = Quaternion::identity();
    Transform transform1(initPosition1, quaternion1);
    RigidBody * body1 = dynamicsWorld.createRigidBody(transform1);

    // set the initial velocity, material, and the shape
    SphereShape sphere1(decimal(0.5));
    body1->addCollisionShape(&sphere1, transform1, decimal(10.0));
    Vector3 init_velocity1 = Vector3(1.0, 0.0, 0.0); 
    body1->setLinearVelocity(init_velocity1);
    body1->getMaterial().setBounciness(decimal(1.0));
    body1->getMaterial().setFrictionCoefficient(decimal(0.0));
    body1->setType(BodyType::DYNAMIC);

    // create a rigid body with the position
    Vector3 initPosition2(0.0, 0.0, 0.0);
    Quaternion quaternion2 = Quaternion::identity();
    Transform transform2(initPosition2, quaternion2);
    RigidBody * body2 = dynamicsWorld.createRigidBody(transform2);

    // set the initial velocity, material, and the shape
    SphereShape sphere2(decimal(0.5));
    body2->addCollisionShape(&sphere2, transform2, decimal(10.0));
    Vector3 init_velocity2 = Vector3(-1.0, 0.0, 0.0);
    body2->setLinearVelocity(init_velocity2);
    body2->getMaterial().setBounciness(decimal(1.0));
    body2->getMaterial().setFrictionCoefficient(decimal(0.0));
    body2->setType(BodyType::DYNAMIC);

    const float timeStep = 1.0 / 60.0;

    while (mSimulationTime >= timeStep) {
        mSimulationTime -= timeStep;
        dynamicsWorld.update(timeStep);
        double x, y, z;

        x = body1->getTransform().getPosition().x;
        y = body1->getTransform().getPosition().y;
        z = body1->getTransform().getPosition().z;
        printf("0: (%f, %f, %f)\n", x, y, z);

        x = body2->getTransform().getPosition().x;
        y = body2->getTransform().getPosition().y;
        z = body2->getTransform().getPosition().z;
        printf("1: (%f, %f, %f)\n", x, y, z);

        printf("collision = %s\n", dynamicsWorld.testOverlap(body1, body2) ? "=============================================================" : "false");
        printf("num = %d\n", dynamicsWorld.getNbRigidBodies());
        printf("----------------\n\n");
    }
}

这是输出

0: (-1.983333, 0.000000, 0.000000)
1: (-0.016667, 0.000000, 0.000000)
collision = false
num = 2
----------------

0: (-1.966667, 0.000000, 0.000000)
1: (-0.033333, 0.000000, 0.000000)
collision = false
num = 2
----------------

0: (-1.950000, 0.000000, 0.000000)
1: (-0.050000, 0.000000, 0.000000)
collision = false
num = 2
----------------

0: (-1.933333, 0.000000, 0.000000)
1: (-0.066667, 0.000000, 0.000000)
collision = false
num = 2
----------------

0: (-1.916667, 0.000000, 0.000000)
1: (-0.083333, 0.000000, 0.000000)
collision = false
num = 2
----------------

0: (-1.900000, 0.000000, 0.000000)
1: (-0.100000, 0.000000, 0.000000)
collision = false
num = 2
----------------

0: (-1.883333, 0.000000, 0.000000)
1: (-0.116667, 0.000000, 0.000000)
collision = false
num = 2
----------------

0: (-1.866667, 0.000000, 0.000000)
1: (-0.133333, 0.000000, 0.000000)
collision = false
num = 2
----------------

0: (-1.850000, 0.000000, 0.000000)
1: (-0.150000, 0.000000, 0.000000)
collision = false
num = 2
----------------

0: (-1.833333, 0.000000, 0.000000)
1: (-0.166667, 0.000000, 0.000000)
collision = false
num = 2
----------------

0: (-1.816667, 0.000000, 0.000000)
1: (-0.183333, 0.000000, 0.000000)
collision = false
num = 2
----------------

0: (-1.800000, 0.000000, 0.000000)
1: (-0.200000, 0.000000, 0.000000)
collision = false
num = 2
----------------

0: (-1.783334, 0.000000, 0.000000)
1: (-0.216667, 0.000000, 0.000000)
collision = false
num = 2
----------------

0: (-1.766667, 0.000000, 0.000000)
1: (-0.233333, 0.000000, 0.000000)
collision = false
num = 2
----------------

0: (-1.750000, 0.000000, 0.000000)
1: (-0.250000, 0.000000, 0.000000)
collision = false
num = 2
----------------

0: (-1.733334, 0.000000, 0.000000)
1: (-0.266667, 0.000000, 0.000000)
collision = false
num = 2
----------------

0: (-1.716667, 0.000000, 0.000000)
1: (-0.283333, 0.000000, 0.000000)
collision = false
num = 2
----------------

0: (-1.700000, 0.000000, 0.000000)
1: (-0.300000, 0.000000, 0.000000)
collision = false
num = 2
----------------

0: (-1.683334, 0.000000, 0.000000)
1: (-0.316667, 0.000000, 0.000000)
collision = false
num = 2
----------------

0: (-1.666667, 0.000000, 0.000000)
1: (-0.333333, 0.000000, 0.000000)
collision = false
num = 2
----------------

0: (-1.650000, 0.000000, 0.000000)
1: (-0.350000, 0.000000, 0.000000)
collision = false
num = 2
----------------

0: (-1.633334, 0.000000, 0.000000)
1: (-0.366667, 0.000000, 0.000000)
collision = false
num = 2
----------------

0: (-1.616667, 0.000000, 0.000000)
1: (-0.383333, 0.000000, 0.000000)
collision = false
num = 2
----------------

0: (-1.600000, 0.000000, 0.000000)
1: (-0.400000, 0.000000, 0.000000)
collision = false
num = 2
----------------

0: (-1.583334, 0.000000, 0.000000)
1: (-0.416667, 0.000000, 0.000000)
collision = false
num = 2
----------------

0: (-1.566667, 0.000000, 0.000000)
1: (-0.433333, 0.000000, 0.000000)
collision = false
num = 2
----------------

0: (-1.550000, 0.000000, 0.000000)
1: (-0.450000, 0.000000, 0.000000)
collision = false
num = 2
----------------

0: (-1.533334, 0.000000, 0.000000)
1: (-0.466667, 0.000000, 0.000000)
collision = false
num = 2
----------------

0: (-1.516667, 0.000000, 0.000000)
1: (-0.483334, 0.000000, 0.000000)
collision = false
num = 2
----------------

0: (-1.500000, 0.000000, 0.000000)
1: (-0.500000, 0.000000, 0.000000)
collision = false
num = 2
----------------

0: (-1.483334, 0.000000, 0.000000)
1: (-0.516667, 0.000000, 0.000000)
collision = false
num = 2
----------------

0: (-1.466667, 0.000000, 0.000000)
1: (-0.533333, 0.000000, 0.000000)
collision = false
num = 2
----------------

0: (-1.450001, 0.000000, 0.000000)
1: (-0.550000, 0.000000, 0.000000)
collision = false
num = 2
----------------

0: (-1.433334, 0.000000, 0.000000)
1: (-0.566667, 0.000000, 0.000000)
collision = false
num = 2
----------------

0: (-1.416667, 0.000000, 0.000000)
1: (-0.583333, 0.000000, 0.000000)
collision = false
num = 2
----------------

0: (-1.400001, 0.000000, 0.000000)
1: (-0.600000, 0.000000, 0.000000)
collision = false
num = 2
----------------

0: (-1.383334, 0.000000, 0.000000)
1: (-0.616667, 0.000000, 0.000000)
collision = false
num = 2
----------------

0: (-1.366667, 0.000000, 0.000000)
1: (-0.633333, 0.000000, 0.000000)
collision = false
num = 2
----------------

0: (-1.350001, 0.000000, 0.000000)
1: (-0.650000, 0.000000, 0.000000)
collision = false
num = 2
----------------

0: (-1.333334, 0.000000, 0.000000)
1: (-0.666667, 0.000000, 0.000000)
collision = false
num = 2
----------------

0: (-1.316667, 0.000000, 0.000000)
1: (-0.683333, 0.000000, 0.000000)
collision = false
num = 2
----------------

0: (-1.300001, 0.000000, 0.000000)
1: (-0.700000, 0.000000, 0.000000)
collision = false
num = 2
----------------

0: (-1.283334, 0.000000, 0.000000)
1: (-0.716667, 0.000000, 0.000000)
collision = false
num = 2
----------------

0: (-1.266667, 0.000000, 0.000000)
1: (-0.733333, 0.000000, 0.000000)
collision = false
num = 2
----------------

0: (-1.250001, 0.000000, 0.000000)
1: (-0.750000, 0.000000, 0.000000)
collision = false
num = 2
----------------

0: (-1.233334, 0.000000, 0.000000)
1: (-0.766667, 0.000000, 0.000000)
collision = false
num = 2
----------------

0: (-1.216667, 0.000000, 0.000000)
1: (-0.783333, 0.000000, 0.000000)
collision = false
num = 2
----------------

0: (-1.200001, 0.000000, 0.000000)
1: (-0.800000, 0.000000, 0.000000)
collision = false
num = 2
----------------

0: (-1.183334, 0.000000, 0.000000)
1: (-0.816667, 0.000000, 0.000000)
collision = false
num = 2
----------------

0: (-1.166667, 0.000000, 0.000000)
1: (-0.833333, 0.000000, 0.000000)
collision = false
num = 2
----------------

0: (-1.150001, 0.000000, 0.000000)
1: (-0.850000, 0.000000, 0.000000)
collision = false
num = 2
----------------

0: (-1.133334, 0.000000, 0.000000)
1: (-0.866666, 0.000000, 0.000000)
collision = false
num = 2
----------------

0: (-1.116668, 0.000000, 0.000000)
1: (-0.883333, 0.000000, 0.000000)
collision = false
num = 2
----------------

0: (-1.100001, 0.000000, 0.000000)
1: (-0.900000, 0.000000, 0.000000)
collision = false
num = 2
----------------

0: (-1.083334, 0.000000, 0.000000)
1: (-0.916666, 0.000000, 0.000000)
collision = false
num = 2
----------------

0: (-1.066668, 0.000000, 0.000000)
1: (-0.933333, 0.000000, 0.000000)
collision = false
num = 2
----------------

0: (-1.050001, 0.000000, 0.000000)
1: (-0.950000, 0.000000, 0.000000)
collision = false
num = 2
----------------

0: (-1.033334, 0.000000, 0.000000)
1: (-0.966666, 0.000000, 0.000000)
collision = false
num = 2
----------------

0: (-1.016668, 0.000000, 0.000000)
1: (-0.983333, 0.000000, 0.000000)
collision = false
num = 2
----------------

0: (-1.000001, 0.000000, 0.000000)
1: (-1.000000, 0.000000, 0.000000)
collision = false
num = 2
----------------

0: (-0.983334, 0.000000, 0.000000)
1: (-1.016666, 0.000000, 0.000000)
collision = false
num = 2
----------------

0: (-0.966668, 0.000000, 0.000000)
1: (-1.033333, 0.000000, 0.000000)
collision = false
num = 2
----------------

0: (-0.950001, 0.000000, 0.000000)
1: (-1.050000, 0.000000, 0.000000)
collision = false
num = 2
----------------

0: (-0.933334, 0.000000, 0.000000)
1: (-1.066666, 0.000000, 0.000000)
collision = false
num = 2
----------------

0: (-0.916668, 0.000000, 0.000000)
1: (-1.083333, 0.000000, 0.000000)
collision = false
num = 2
----------------

0: (-0.900001, 0.000000, 0.000000)
1: (-1.100000, 0.000000, 0.000000)
collision = false
num = 2
----------------

0: (-0.883334, 0.000000, 0.000000)
1: (-1.116666, 0.000000, 0.000000)
collision = false
num = 2
----------------

0: (-0.866668, 0.000000, 0.000000)
1: (-1.133333, 0.000000, 0.000000)
collision = false
num = 2
----------------

0: (-0.850001, 0.000000, 0.000000)
1: (-1.150000, 0.000000, 0.000000)
collision = false
num = 2
----------------

0: (-0.833334, 0.000000, 0.000000)
1: (-1.166666, 0.000000, 0.000000)
collision = false
num = 2
----------------

0: (-0.816668, 0.000000, 0.000000)
1: (-1.183333, 0.000000, 0.000000)
collision = false
num = 2
----------------

0: (-0.800001, 0.000000, 0.000000)
1: (-1.200000, 0.000000, 0.000000)
collision = false
num = 2
----------------

0: (-0.783334, 0.000000, 0.000000)
1: (-1.216666, 0.000000, 0.000000)
collision = false
num = 2
----------------

0: (-0.766668, 0.000000, 0.000000)
1: (-1.233333, 0.000000, 0.000000)
collision = false
num = 2
----------------

0: (-0.750001, 0.000000, 0.000000)
1: (-1.250000, 0.000000, 0.000000)
collision = false
num = 2
----------------

0: (-0.733335, 0.000000, 0.000000)
1: (-1.266666, 0.000000, 0.000000)
collision = false
num = 2
----------------

0: (-0.716668, 0.000000, 0.000000)
1: (-1.283333, 0.000000, 0.000000)
collision = false
num = 2
----------------

0: (-0.700001, 0.000000, 0.000000)
1: (-1.299999, 0.000000, 0.000000)
collision = false
num = 2
----------------

0: (-0.683335, 0.000000, 0.000000)
1: (-1.316666, 0.000000, 0.000000)
collision = false
num = 2
----------------

0: (-0.666668, 0.000000, 0.000000)
1: (-1.333333, 0.000000, 0.000000)
collision = false
num = 2
----------------

0: (-0.650001, 0.000000, 0.000000)
1: (-1.349999, 0.000000, 0.000000)
collision = false
num = 2
----------------

0: (-0.633335, 0.000000, 0.000000)
1: (-1.366666, 0.000000, 0.000000)
collision = false
num = 2
----------------

0: (-0.616668, 0.000000, 0.000000)
1: (-1.383333, 0.000000, 0.000000)
collision = false
num = 2
----------------

0: (-0.600001, 0.000000, 0.000000)
1: (-1.399999, 0.000000, 0.000000)
collision = false
num = 2
----------------

0: (-0.583335, 0.000000, 0.000000)
1: (-1.416666, 0.000000, 0.000000)
collision = false
num = 2
----------------

0: (-0.566668, 0.000000, 0.000000)
1: (-1.433333, 0.000000, 0.000000)
collision = false
num = 2
----------------

0: (-0.550001, 0.000000, 0.000000)
1: (-1.449999, 0.000000, 0.000000)
collision = false
num = 2
----------------

0: (-0.533335, 0.000000, 0.000000)
1: (-1.466666, 0.000000, 0.000000)
collision = false
num = 2
----------------

0: (-0.516668, 0.000000, 0.000000)
1: (-1.483333, 0.000000, 0.000000)
collision = false
num = 2
----------------

0: (-0.500001, 0.000000, 0.000000)
1: (-1.499999, 0.000000, 0.000000)
collision = false
num = 2
----------------

0: (-0.483335, 0.000000, 0.000000)
1: (-1.516666, 0.000000, 0.000000)
collision = =============================================================
num = 2
----------------

0: (-0.502335, 0.000000, 0.000000)
1: (-1.497666, 0.000000, 0.000000)
collision = false
num = 2
----------------

0: (-0.519001, 0.000000, 0.000000)
1: (-1.480999, 0.000000, 0.000000)
collision = false
num = 2
----------------

0: (-0.535668, 0.000000, 0.000000)
1: (-1.464333, 0.000000, 0.000000)
collision = false
num = 2
----------------

0: (-0.552335, 0.000000, 0.000000)
1: (-1.447666, 0.000000, 0.000000)
collision = false
num = 2
----------------

0: (-0.569001, 0.000000, 0.000000)
1: (-1.431000, 0.000000, 0.000000)
collision = false
num = 2
----------------

0: (-0.585668, 0.000000, 0.000000)
1: (-1.414333, 0.000000, 0.000000)
collision = false
num = 2
----------------

0: (-0.602334, 0.000000, 0.000000)
1: (-1.397666, 0.000000, 0.000000)
collision = false
num = 2
----------------

0: (-0.619001, 0.000000, 0.000000)
1: (-1.381000, 0.000000, 0.000000)
collision = false
num = 2
----------------

0: (-0.635668, 0.000000, 0.000000)
1: (-1.364333, 0.000000, 0.000000)
collision = false
num = 2
----------------

0: (-0.652334, 0.000000, 0.000000)
1: (-1.347666, 0.000000, 0.000000)
collision = false
num = 2
----------------

0: (-0.669001, 0.000000, 0.000000)
1: (-1.331000, 0.000000, 0.000000)
collision = false
num = 2
----------------

0: (-0.685668, 0.000000, 0.000000)
1: (-1.314333, 0.000000, 0.000000)
collision = false
num = 2
----------------

0: (-0.702334, 0.000000, 0.000000)
1: (-1.297666, 0.000000, 0.000000)
collision = false
num = 2
----------------

0: (-0.719001, 0.000000, 0.000000)
1: (-1.281000, 0.000000, 0.000000)
collision = false
num = 2
----------------

0: (-0.735668, 0.000000, 0.000000)
1: (-1.264333, 0.000000, 0.000000)
collision = false
num = 2
----------------

0: (-0.752334, 0.000000, 0.000000)
1: (-1.247666, 0.000000, 0.000000)
collision = false
num = 2
----------------

0: (-0.769001, 0.000000, 0.000000)
1: (-1.231000, 0.000000, 0.000000)
collision = false
num = 2
----------------

0: (-0.785668, 0.000000, 0.000000)
1: (-1.214333, 0.000000, 0.000000)
collision = false
num = 2
----------------

0: (-0.802334, 0.000000, 0.000000)
1: (-1.197666, 0.000000, 0.000000)
collision = false
num = 2
----------------

0: (-0.819001, 0.000000, 0.000000)
1: (-1.181000, 0.000000, 0.000000)
collision = false
num = 2
----------------

0: (-0.835668, 0.000000, 0.000000)
1: (-1.164333, 0.000000, 0.000000)
collision = false
num = 2
----------------

0: (-0.852334, 0.000000, 0.000000)
1: (-1.147666, 0.000000, 0.000000)
collision = false
num = 2
----------------

0: (-0.869001, 0.000000, 0.000000)
1: (-1.131000, 0.000000, 0.000000)
collision = false
num = 2
----------------

0: (-0.885668, 0.000000, 0.000000)
1: (-1.114333, 0.000000, 0.000000)
collision = false
num = 2
----------------

0: (-0.902334, 0.000000, 0.000000)
1: (-1.097667, 0.000000, 0.000000)
collision = false
num = 2
----------------

0: (-0.919001, 0.000000, 0.000000)
1: (-1.081000, 0.000000, 0.000000)
collision = false
num = 2
----------------

0: (-0.935668, 0.000000, 0.000000)
1: (-1.064333, 0.000000, 0.000000)
collision = false
num = 2
----------------

0: (-0.952334, 0.000000, 0.000000)
1: (-1.047667, 0.000000, 0.000000)
collision = false
num = 2
----------------

你能给我一些建议,为什么我会得到这个结果? 我猜是错误的初始化或错误的坐标打印方式,但我无法弄清楚。 谢谢

注意:这只是一个很好的猜测,因为数字相加。

我认为 -2 对其碰撞形状的额外变换会导致这种不需要的效果。

这是 sphere1 的初始化逻辑。我

Vector3 initPosition1(-2.0, 0.0, 0.0);
Transform transform1(initPosition1, quaternion1);
RigidBody * body1 = dynamicsWorld.createRigidBody(transform1);

// set the initial velocity, material, and the shape
SphereShape sphere1(decimal(0.5));
body1->addCollisionShape(&sphere1, **transform1**, decimal(10.0));

球体 1:方向:+1.0 预期位置 (-1.5) 实际 (-0.5) => 差异 |1|

球体 2:方向:-1.0 预期位置 (-0.5) 实际 (-1.5) => 差异 |1|

您的预期位置在每个移动方向上都失败了 1。两个球体都向彼此移动 1 个单位太远会产生 2 的总距离,这正是您对 sphere1 的碰撞形状的平移量。

请测试一下,这可能只是巧合...