При моделировании n-тела с использованием ReactPhysics3D столкновения не обнаружено - PullRequest
4 голосов
/ 29 мая 2019

В настоящее время я работаю над симуляцией n-тела с использованием ReactPhysics3D (https://www.reactphysics3d.com/).

. Я выполнил простое моделирование столкновения двух сфер. Затем я печатаю координаты двух сфер в процессе симуляции.проблема в том, что они не сталкиваются, а проходят друг через друга. Затем они сталкиваются в странной позиции.

Вот настройка Два шара созданы Первая сфера имеет положение (-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
----------------

Не могли бы вы дать мне несколько советов, почему я получаю этот результат? Я угадал неправильную инициализацию или неправильный способ печати координат, но я не смог понять это. Спасибо

1 Ответ

2 голосов
/ 03 июня 2019

Примечание: это просто хорошее предположение, потому что числа складываются.

Я думаю, что дополнительное преобразование -2 в его форму столкновения вызывает этот нежелательный эффект.

Это ваша логика инициализации для сферы1.I

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 ожидаемое Pos (-1,5) Фактическое (-0,5) => diff | 1 |

Сфера 2: направление: -1,0Ожидаемый Pos (-0,5) Фактический (-1,5) => diff | 1 |

Ваши ожидаемые позиции провалились ровно на 1 в каждом направлении движения.Две сферы, которые перемещаются на 1 единицу друг к другу слишком далеко, создают общее расстояние 2, что в точности соответствует вашему количеству перевода в форму столкновения сферы 1.

enter image description here

Пожалуйста, проверьте это, это может быть просто совпадением ...

...