void CharacterDemo::updateCamera() { //#define DISABLE_CAMERA 1 #ifdef DISABLE_CAMERA DemoApplication::updateCamera(); return; #endif //DISABLE_CAMERA glMatrixMode(GL_PROJECTION); glLoadIdentity(); btTransform characterWorldTrans; //look at the vehicle characterWorldTrans = m_ghostObject->getWorldTransform(); btVector3 up = characterWorldTrans.getBasis()[1]; btVector3 backward = -characterWorldTrans.getBasis()[2]; up.normalize (); backward.normalize (); m_cameraTargetPosition = characterWorldTrans.getOrigin(); m_cameraPosition = m_cameraTargetPosition + up * 10.0 + backward * 12.0; //use the convex sweep test to find a safe position for the camera (not blocked by static geometry) btSphereShape cameraSphere(0.2f); btTransform cameraFrom,cameraTo; cameraFrom.setIdentity(); cameraFrom.setOrigin(characterWorldTrans.getOrigin()); cameraTo.setIdentity(); cameraTo.setOrigin(m_cameraPosition); btCollisionWorld::ClosestConvexResultCallback cb( characterWorldTrans.getOrigin(), cameraTo.getOrigin() ); cb.m_collisionFilterMask = btBroadphaseProxy::StaticFilter; m_dynamicsWorld->convexSweepTest(&cameraSphere,cameraFrom,cameraTo,cb); if (cb.hasHit()) { btScalar minFraction = cb.m_closestHitFraction;//btMax(btScalar(0.3),cb.m_closestHitFraction); m_cameraPosition.setInterpolate3(cameraFrom.getOrigin(),cameraTo.getOrigin(),minFraction); } //update OpenGL camera settings glFrustum(-1.0, 1.0, -1.0, 1.0, 1.0, 10000.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(m_cameraPosition[0],m_cameraPosition[1],m_cameraPosition[2], m_cameraTargetPosition[0],m_cameraTargetPosition[1], m_cameraTargetPosition[2], m_cameraUp.getX(),m_cameraUp.getY(),m_cameraUp.getZ()); }
bool Cam_HasHit(std::shared_ptr<BtEngineClosestConvexResultCallback> cb, btTransform &cameraFrom, btTransform &cameraTo) { btSphereShape cameraSphere(16.0); cb->m_closestHitFraction = 1.0; cb->m_hitCollisionObject = NULL; bt_engine_dynamicsWorld->convexSweepTest(&cameraSphere, cameraFrom, cameraTo, *cb); return cb->hasHit(); }
bool Cam_HasHit(std::shared_ptr<BtEngineClosestConvexResultCallback> cb, btTransform &cameraFrom, btTransform &cameraTo) { btSphereShape cameraSphere(COLLISION_CAMERA_SPHERE_RADIUS); cameraSphere.setMargin(COLLISION_MARGIN_DEFAULT); cb->m_closestHitFraction = 1.0; cb->m_hitCollisionObject = nullptr; bt_engine_dynamicsWorld->convexSweepTest(&cameraSphere, cameraFrom, cameraTo, *cb); return cb->hasHit(); }