void ActorTracer::doTrace(btCollisionObject *actor, const Ogre::Vector3 &start, const Ogre::Vector3 &end, const PhysicEngine *enginePass) { const btVector3 btstart(start.x, start.y, start.z); const btVector3 btend(end.x, end.y, end.z); const btTransform &trans = actor->getWorldTransform(); btTransform from(trans); btTransform to(trans); from.setOrigin(btstart); to.setOrigin(btend); ClosestNotMeConvexResultCallback newTraceCallback(actor, btstart-btend, btScalar(0.0)); newTraceCallback.m_collisionFilterMask = CollisionType_World | CollisionType_HeightMap | CollisionType_Actor; btCollisionShape *shape = actor->getCollisionShape(); assert(shape->isConvex()); enginePass->dynamicsWorld->convexSweepTest(static_cast<btConvexShape*>(shape), from, to, newTraceCallback); // Copy the hit data over to our trace results struct: if(newTraceCallback.hasHit()) { const btVector3& tracehitnormal = newTraceCallback.m_hitNormalWorld; mFraction = newTraceCallback.m_closestHitFraction; mPlaneNormal = Ogre::Vector3(tracehitnormal.x(), tracehitnormal.y(), tracehitnormal.z()); mEndPos = (end-start)*mFraction + start; } else { mEndPos = end; mPlaneNormal = Ogre::Vector3(0.0f, 0.0f, 1.0f); mFraction = 1.0f; } }
void ActorTracer::findGround(const Actor* actor, const osg::Vec3f& start, const osg::Vec3f& end, const btCollisionWorld* world) { const btVector3 btstart(start.x(), start.y(), start.z()); const btVector3 btend(end.x(), end.y(), end.z()); const btTransform &trans = actor->getCollisionObject()->getWorldTransform(); btTransform from(trans.getBasis(), btstart); btTransform to(trans.getBasis(), btend); ClosestNotMeConvexResultCallback newTraceCallback(actor->getCollisionObject(), btstart-btend, btScalar(0.0)); // Inherit the actor's collision group and mask newTraceCallback.m_collisionFilterGroup = actor->getCollisionObject()->getBroadphaseHandle()->m_collisionFilterGroup; newTraceCallback.m_collisionFilterMask = actor->getCollisionObject()->getBroadphaseHandle()->m_collisionFilterMask; newTraceCallback.m_collisionFilterMask &= ~CollisionType_Actor; world->convexSweepTest(actor->getConvexShape(), from, to, newTraceCallback); if(newTraceCallback.hasHit()) { const btVector3& tracehitnormal = newTraceCallback.m_hitNormalWorld; mFraction = newTraceCallback.m_closestHitFraction; mPlaneNormal = osg::Vec3f(tracehitnormal.x(), tracehitnormal.y(), tracehitnormal.z()); mEndPos = (end-start)*mFraction + start; } else { mEndPos = end; mPlaneNormal = osg::Vec3f(0.0f, 0.0f, 1.0f); mFraction = 1.0f; } }
void ActorTracer::doTrace(const btCollisionObject *actor, const osg::Vec3f& start, const osg::Vec3f& end, const btCollisionWorld* world) { const btVector3 btstart = toBullet(start); const btVector3 btend = toBullet(end); const btTransform &trans = actor->getWorldTransform(); btTransform from(trans); btTransform to(trans); from.setOrigin(btstart); to.setOrigin(btend); ClosestNotMeConvexResultCallback newTraceCallback(actor, btstart-btend, btScalar(0.0)); // Inherit the actor's collision group and mask newTraceCallback.m_collisionFilterGroup = actor->getBroadphaseHandle()->m_collisionFilterGroup; newTraceCallback.m_collisionFilterMask = actor->getBroadphaseHandle()->m_collisionFilterMask; const btCollisionShape *shape = actor->getCollisionShape(); assert(shape->isConvex()); world->convexSweepTest(static_cast<const btConvexShape*>(shape), from, to, newTraceCallback); // Copy the hit data over to our trace results struct: if(newTraceCallback.hasHit()) { const btVector3& tracehitnormal = newTraceCallback.m_hitNormalWorld; mFraction = newTraceCallback.m_closestHitFraction; mPlaneNormal = osg::Vec3f(tracehitnormal.x(), tracehitnormal.y(), tracehitnormal.z()); mEndPos = (end-start)*mFraction + start; mHitPoint = toOsg(newTraceCallback.m_hitPointWorld); mHitObject = newTraceCallback.m_hitCollisionObject; } else { mEndPos = end; mPlaneNormal = osg::Vec3f(0.0f, 0.0f, 1.0f); mFraction = 1.0f; mHitPoint = end; mHitObject = nullptr; } }
void ActorTracer::findGround(btCollisionObject *actor, const Ogre::Vector3 &start, const Ogre::Vector3 &end, const PhysicEngine *enginePass) { const btVector3 btstart(start.x, start.y, start.z+1.0f); const btVector3 btend(end.x, end.y, end.z+1.0f); const btTransform &trans = actor->getWorldTransform(); btTransform from(trans.getBasis(), btstart); btTransform to(trans.getBasis(), btend); ClosestNotMeConvexResultCallback newTraceCallback(actor, btstart-btend, btScalar(0.0)); newTraceCallback.m_collisionFilterMask = CollisionType_World | CollisionType_HeightMap | CollisionType_Actor; const btBoxShape *shape = dynamic_cast<btBoxShape*>(actor->getCollisionShape()); assert(shape); btVector3 halfExtents = shape->getHalfExtentsWithMargin(); halfExtents[2] = 1.0f; btBoxShape box(halfExtents); enginePass->dynamicsWorld->convexSweepTest(&box, from, to, newTraceCallback); if(newTraceCallback.hasHit()) { const btVector3& tracehitnormal = newTraceCallback.m_hitNormalWorld; mFraction = newTraceCallback.m_closestHitFraction; mPlaneNormal = Ogre::Vector3(tracehitnormal.x(), tracehitnormal.y(), tracehitnormal.z()); mEndPos = (end-start)*mFraction + start; mEndPos[2] += 1.0f; } else { mEndPos = end; mPlaneNormal = Ogre::Vector3(0.0f, 0.0f, 1.0f); mFraction = 1.0f; } }
const bool NewPhysicsTrace(NewPhysTraceResults* const out, const Ogre::Vector3& start, const Ogre::Vector3& end, const Ogre::Vector3& BBHalfExtents, const Ogre::Vector3& rotation, bool isInterior, OEngine::Physic::PhysicEngine* enginePass) { //if (!traceobj->incellptr) // return false; //if(enginePass->dynamicsWorld->getCollisionObjectArray().at(60)->getCollisionShape()->isConvex()) // std::cout << "It's convex\n"; const btVector3 btstart(start.x, start.y, start.z); const btVector3 btend(end.x, end.y, end.z); const btQuaternion btrot(rotation.y, rotation.x, rotation.z); //y, x, z const btBoxShape newshape(btVector3(BBHalfExtents.x, BBHalfExtents.y, BBHalfExtents.z)); const btTransform from(btrot, btstart); const btTransform to(btrot, btend); // warning: unused variable ... /* float x = from.getOrigin().getX(); float y = from.getOrigin().getY(); float z = from.getOrigin().getZ(); float x2 = to.getOrigin().getX(); float y2 = to.getOrigin().getY(); float z2 = to.getOrigin().getZ(); */ //std::cout << "BtFrom: " << x << "," << y << "," << z << "\n"; //std::cout << "BtTo: " << x2 << "," << y2 << "," << z2 << "\n"; //std::cout << "BtTo: " << to.getOrigin().getX() << "," << to.getOrigin().getY() << "," << to.getOrigin().getZ() << "\n"; btCollisionWorld::ClosestConvexResultCallback newTraceCallback(btstart, btend); newTraceCallback.m_collisionFilterMask = (traceType == collisionWorldTrace) ? Only_Collision : Only_Pickup; enginePass->dynamicsWorld->convexSweepTest(&newshape, from, to, newTraceCallback); //newTraceCallback. //std::cout << "NUM: " << enginePass->dynamicsWorld->getNumCollisionObjects() << "\n"; // Copy the hit data over to our trace results struct: out->fraction = newTraceCallback.m_closestHitFraction; Ogre::Vector3& outhitnormal = out->hitNormal; const btVector3& tracehitnormal = newTraceCallback.m_hitNormalWorld; outhitnormal.x = tracehitnormal.x(); outhitnormal.y = tracehitnormal.y(); outhitnormal.z = tracehitnormal.z(); Ogre::Vector3& outhitpos = out->endPos; const btVector3& tracehitpos = newTraceCallback.m_hitPointWorld; outhitpos.x = tracehitpos.x(); outhitpos.y = tracehitpos.y(); outhitpos.z= tracehitpos.z(); // StartSolid test: { out->startSolid = false; //btCollisionObject collision; //collision.setCollisionShape(const_cast<btBoxShape* const>(&newshape) ); //CustomContactCallback crb; //world.world->contactTest(&collision, crb); //out->startSolid = crb.hit; // If outside and underground, we're solid if (!isInterior) //Check if we are interior { } // If inside and out of the tree, we're solid else { btVector3 aabbMin, aabbMax; enginePass->broadphase->getBroadphaseAabb(aabbMin, aabbMax); //std::cout << "AABBMIN" << aabbMin.getX() <<"," <<aabbMin.getY() << "," << aabbMin.getZ() << "\n"; //std::cout << "AABBMAX" << aabbMax.getX() <<"," <<aabbMax.getY() << "," << aabbMax.getZ() << "\n"; //std::cout << "AABBMAX" << aabbMax << "\n"; if (!TestPointAgainstAabb2(aabbMin, aabbMax, *(const btVector3* const)&(start) ) ) { //We're solid out->startSolid = true; } } } const bool hasHit = newTraceCallback.hasHit(); return hasHit; }