std::pair<std::string,float> PhysicEngine::rayTest(btVector3& from,btVector3& to) { std::string name = ""; float d = -1; float d1 = 10000.; btCollisionWorld::ClosestRayResultCallback resultCallback1(from, to); resultCallback1.m_collisionFilterMask = COL_WORLD|COL_RAYCASTING; dynamicsWorld->rayTest(from, to, resultCallback1); if (resultCallback1.hasHit()) { name = static_cast<RigidBody&>(*resultCallback1.m_collisionObject).mName; d1 = resultCallback1.m_closestHitFraction; d = d1; } btCollisionWorld::ClosestRayResultCallback resultCallback2(from, to); resultCallback2.m_collisionFilterMask = COL_ACTOR_INTERNAL|COL_ACTOR_EXTERNAL; dynamicsWorld->rayTest(from, to, resultCallback2); float d2 = 10000.; if (resultCallback2.hasHit()) { d2 = resultCallback1.m_closestHitFraction; if(d2<=d1) { name = static_cast<PairCachingGhostObject&>(*resultCallback2.m_collisionObject).mName; d = d2; } } return std::pair<std::string,float>(name,d); }
std::pair<std::string,float> PhysicEngine::rayTest(btVector3& from,btVector3& to,bool raycastingObjectOnly,bool ignoreHeightMap, Ogre::Vector3* normal) { std::string name = ""; float d = -1; btCollisionWorld::ClosestRayResultCallback resultCallback1(from, to); if(raycastingObjectOnly) resultCallback1.m_collisionFilterMask = CollisionType_Raycasting; else resultCallback1.m_collisionFilterMask = CollisionType_World; if(!ignoreHeightMap) resultCallback1.m_collisionFilterMask = resultCallback1.m_collisionFilterMask | CollisionType_HeightMap; dynamicsWorld->rayTest(from, to, resultCallback1); if (resultCallback1.hasHit()) { name = static_cast<const RigidBody&>(*resultCallback1.m_collisionObject).mName; d = resultCallback1.m_closestHitFraction; if (normal) *normal = Ogre::Vector3(resultCallback1.m_hitNormalWorld.x(), resultCallback1.m_hitNormalWorld.y(), resultCallback1.m_hitNormalWorld.z()); } return std::pair<std::string,float>(name,d); }
std::pair<std::string,float> PhysicEngine::rayTest(btVector3& from,btVector3& to) { std::string name = ""; float d = -1; float d1 = 10000.; btCollisionWorld::ClosestRayResultCallback resultCallback1(from, to); resultCallback1.m_collisionFilterMask = CollisionType_Raycasting; dynamicsWorld->rayTest(from, to, resultCallback1); if (resultCallback1.hasHit()) { name = static_cast<const RigidBody&>(*resultCallback1.m_collisionObject).mName; d1 = resultCallback1.m_closestHitFraction; d = d1; } return std::pair<std::string,float>(name,d); }