Bullet Physic - Ringtoss game: цель
Я и мой друг пытаемся создать игровой движок для симулятора рингтоссов, используя физику пули на VS C++. Все идет довольно хорошо, пока нам не понадобится какой-то способ определить счет (определить, было ли кольцо помещено внутрь шеста). Для кольца я использую btCompoundShape с 36 маленьким Шпере, вот код:
btRigidBody* SceneManager::AddRing(float rad, float thick, float x, float y, float z, float mass)
{
btTransform t;
btCompoundShape *comShape = new btCompoundShape;
btSphereShape* sphere = new btSphereShape(thick / 2.0);
//sphere->setUserIndex(8);
float masses[36];
for (int i = 0; i < 36; i++)
{
t.setIdentity();
t.setOrigin(btVector3((rad - thick / 2.0)*sin(3.14159265359 / 180.0 * 10 * i), 0, (rad - thick / 2.0)*cos(3.14159265359 / 180.0 * 10 * i)));
comShape->addChildShape(t, sphere);
//comShape->addChildShape(t, box);
masses[i] = mass / 36;
}
btVector3 inertia(0, 0, 0);
t.setIdentity();
comShape->calculatePrincipalAxisTransform(masses, t, inertia);
t.setIdentity();
t.setOrigin(btVector3(x, y, z));
btMotionState* motion = new btDefaultMotionState(t);
btRigidBody::btRigidBodyConstructionInfo info(mass, motion, comShape, inertia);
btRigidBody* body = new btRigidBody(info);
sceneWorld->addRigidBody(body);
vRigidBody.push_back(body);
return body;
}
Во всяком случае, я попробовал три разных способа проверить цель:
Я использую callBackFunc и body->setUserIndex(int i), однако для этого метода кольцо должно касаться только полюса, чтобы считаться целью.
Я проверяю положение центра кольца относительно полюса, этот способ работает, но иногда, когда кольцо подходит близко к полюсу или стоит сбоку от него, оно также считается.
Я проверяю 4 точки на кольце, как 4 направления на компасе относительно положения полюса, это приводит к тому же результату, что и выше.
Я новичок в физике пули, если кто-нибудь из адептов, который мог бы помочь, я был бы очень признателен.