120 likes | 247 Views
This guide demonstrates how to create a physical representation of a game character using Bullet Physics. You'll learn to set up a dynamic capsule shape as a bounding object, disable rotation, add movement forces, and adjust parameters for natural movement. The steps include extracting files, running the character control solution, and compiling the code. By manipulating player character dynamics and integrating physics, this resource helps implement realistic motion in your game development projects.
E N D
PhysicsCharacter Controller Physical representation of a game character
Basics • http://cg.iit.bme.hu/gamedev/KIC/05_PhysicsEngine/ • 05_02_Bullet_CharacterControl_Base.zip • Extract • Run: CharacterControl.sln • Set includeandlibrarypaths (if not correct) • Set workingdirectory(if not $(SolutionDir)/bin) • Compile • Run
Exercise • Give the character a physical representation • Use a capsule shape as a bounding object • Make the capsule dynamic • Disable rotation • Add forces to move it in the scene • The physical representation of the scene is already loaded (static boxes)(examine the source code!!) • Play with the parameters until the movement feels natural • (Next slides show one solution)
PlayerCharacter.h #include "btBulletDynamicsCommon.h" classPlayerCharacter { public: PlayerCharacter(Ogre::SceneManager* sm,btDiscreteDynamicsWorld* phyW); protected: btRigidBody* mPhysicsController;
PlayerCharacter.cpp PlayerCharacter::PlayerCharacter(Ogre::SceneManager* sm, btDiscreteDynamicsWorld* phyW) { … btCollisionShape* physicsShape = newbtCapsuleShape(2.0,5.0); btDefaultMotionState* physicsMotionState = newbtDefaultMotionState(btTransform(btQuaternion(0,0,0,1), btVector3(0,5,0))); btScalarmass = 1; btVector3 inertia(0,0,0); physicsShape->calculateLocalInertia(mass,inertia); btRigidBody::btRigidBodyConstructionInforigidBodyCI(mass, physicsMotionState, physicsShape, inertia); mPhysicsController = newbtRigidBody(rigidBodyCI); mPhysicsController->setAngularFactor(0); //disable rotation //mPhysicsController->setDamping(0.3,0); phyW->addRigidBody(mPhysicsController); }
PlayerCharacter.cpp void PlayerCharacter::update(float t, float dt) { … btTransformworldTrans; mPhysicsController->getMotionState()->getWorldTransform(worldTrans); //we don’t need rotation as it is fixed //btQuaternionrot = worldTrans.getRotation(); //node->setOrientation(rot.w(), rot.x(), rot.y(), rot.z()); node->setPosition(worldTrans.getOrigin().x(), worldTrans.getOrigin().y()-5, worldTrans.getOrigin().z()); mPhysicsController->setLinearVelocity(btVector3(0,0,0)); }
PlayerCharacter.cpp void PlayerCharacter::move(float amount) { if(inAction()) return; Ogre::Vector3 m = amount * getDirection() * 150; Ogre::LogManager::getSingleton().logMessage("Applying force: " + Ogre::StringConverter::toString(m)); mPhysicsController->activate(true); mPhysicsController->applyImpulse(btVector3(m.x,m.y,m.z), btVector3(0,-0.5,0)); if(hasWeapon) action = PA_WEAPON_HOLD; else action = PA_NONE; pose = PP_RUN; }
OgreCharacter.cpp playerCharacter = new PlayerCharacter(sceneManager, physxHandler->getScene());
More physics • Constraints/joints • Ray casting (bullets, terrain, vehicle) • Complex geometries • Convex • Concave • Height field • Collision filtering • Soft bodies • Particles, fluids