Обнаружение столкновений с пулей - PullRequest
3 голосов
/ 02 февраля 2012

Я создал приложение с Ogre3D, уже породив объекты пули, и пока все, что мне нужно, это обнаруживать столкновения между объектами.

Я посмотрел демоверсию CollisionInterfaceDemo, и она не совсем соответствует моим потребностям.

Каковы необходимые шаги для обнаружения столкновений, скажем, 3 сферы, только чтобы знать, сталкивается ли она (меня не волнует точка столкновения)?

Я только знаю, что могу переместить объект CollisionObject, установив его преобразование.

Ответы [ 2 ]

4 голосов
/ 02 февраля 2012

Если вы используете Bullet, есть несколько демонстраций, на которые вы можете посмотреть, чтобы начать работу.

Но в основном, вот краткое изложение (большая часть этого взята из их примеров):

В вашем заголовке или где-либо еще ваша физическая система:

btDefaultCollisionConfiguration*        mPhysicsConfig;
btCollisionDispatcher*                  mPhysicsDispatcher;
btBroadphaseInterface*                  mPhysicsCache;
btSequentialImpulseConstraintSolver*    mPhysicsSolver;
btDiscreteDynamicsWorld*                mPhysicsWorld;
btAlignedObjectArray<btCollisionShape*> mPhysicsShapes;

Первый (инициализация):

///collision configuration contains default setup for memory, collision setup.
mPhysicsConfig = new btDefaultCollisionConfiguration();

///use the default collision dispatcher. For parallel processing you can use a diffent dispatcher (see Extras/BulletMultiThreaded)
mPhysicsDispatcher = new    btCollisionDispatcher(mPhysicsConfig);

///btDbvtBroadphase is a good general purpose broadphase. You can also try out btAxis3Sweep.
mPhysicsCache = new btDbvtBroadphase();

///the default constraint solver. For parallel processing you can use a different solver (see Extras/BulletMultiThreaded)
mPhysicsSolver = new btSequentialImpulseConstraintSolver;
mPhysicsWorld = new btDiscreteDynamicsWorld(mPhysicsDispatcher,mPhysicsCache,mPhysicsSolver,mPhysicsConfig);
mPhysicsWorld->setGravity(btVector3(0,-9.81f,0));

Каждый кадр (обычно это происходит в функции обновления):

mPhysicsWorld->stepSimulation( timestep , 10 );

Добавьте сферу (указатель просто возвращается, чтобы облегчить доступ после создания):

btRigidBody* MyPhysicsSystem::CreateSphere(float sx, float px, float py, float pz, float mass)
{
    btCollisionShape* colShape = new btSphereShape(btScalar(sx));
    mPhysicsShapes.push_back(colShape);

    btTransform startTransform;
    startTransform.setIdentity();

    btScalar    tMass(mass);

    //rigidbody is dynamic if and only if mass is non zero, otherwise static
    bool isDynamic = (tMass != 0.f);

    btVector3 localInertia(0,0,0);
    if (isDynamic)
        colShape->calculateLocalInertia(tMass,localInertia);

    startTransform.setOrigin(btVector3(px,py,pz));

    //using motionstate is recommended, it provides interpolation capabilities, and only synchronizes 'active' objects
    btDefaultMotionState* myMotionState = new btDefaultMotionState(startTransform);
    btRigidBody::btRigidBodyConstructionInfo rbInfo(tMass,myMotionState,colShape,localInertia);
    btRigidBody* body = new btRigidBody(rbInfo);
    mPhysicsWorld->addRigidBody(body);
    return body;
}

И это все!

Повторно:

  1. Инициализируйте вещи, необходимые пули для симуляции.
  2. Создайте объект и добавьте его в "мир" пули.
  3. Обновите этот мир в каждом кадре на несколько временных шагов.

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

Надеюсь, это поможет!

1 голос
/ 02 февраля 2012

При работе с обнаружением столкновений между сферами вам нужно знать 2 вещи: радиус каждой сферы и их положение.

Затем вам нужно пройти через каждую сферу и сравнить ее с остальными.Для каждой пары сначала нужно определить расстояние между ними.

http://www.purplemath.com/modules/distform.htm

Это базовая 2-мерная формула расстояния, чтобы сделать ее трехмерной, все, что вам нужно сделать, это добавить (z2- z1) возводить квадрат в квадрат с двумя другими координатами перед квадратным укоренением результата.

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

Я не совсем знаком с Ogre3D, но если вы можете трансформировать объект, вы сможете получить егопозиционировать также.

...