Castle Battle  1.0
Public Member Functions | Private Attributes | List of all members
Physics Class Reference

Physics class will handle all things related to collisions, creating Bullet physics objects and the physics simulation. More...

#include <physics.h>

Public Member Functions

 Physics (const core::aabbox3df irrBox)
 Default constructor, given a boundbix will create the opposite physics ground. More...
 
 ~Physics ()
 
void initWorld ()
 Init physics instances of the World. More...
 
btTransform getGround ()
 Return ground transform. More...
 
void UpdatePhysics (u32 delta, u32 fps)
 World step simulation. More...
 
void UpdateRender (btRigidBody *btbody)
 Update graphic object transformation. More...
 
btRigidBody * createCannonBall (scene::ISceneNode *node, core::vector3df position, f32 radius)
 Create the projectile physics instance. More...
 
btRigidBody * createTreasure (scene::IMeshSceneNode *node, core::vector3df scale, core::vector3df position)
 Create the treasure physics instance. More...
 
btRigidBody * createCastleBlock (scene::ISceneNode *node, core::vector3df rotation, core::vector3df scale, core::vector3df position)
 Create a castle block. More...
 

Private Attributes

btDiscreteDynamicsWorld * World
 Type of discrete rigid body simulation. More...
 
std::list< btRigidBody * > Objects
 List of btRigitBody instances. More...
 
btDefaultCollisionConfiguration * collisionConfiguration
 Default collision system. More...
 
btBroadphaseInterface * broadPhase
 Bounding box overlapping interface. More...
 
btCollisionDispatcher * dispatcher
 Collision system dispatcher. More...
 
btSequentialImpulseConstraintSolver * solver
 Internal bullet solver. More...
 
btTransform ground
 Ground transform properties. More...
 

Detailed Description

Physics class will handle all things related to collisions, creating Bullet physics objects and the physics simulation.

Remember that ONLY Bullet shape dimensions are x2 greater than Irrlicht unit. That means whenever you want to add an object from irrlicht extent you have to consider only half of it : irrSceneNode->getExtent() * 0.5f.

Constructor & Destructor Documentation

◆ Physics()

Physics::Physics ( const core::aabbox3df  irrBox)

Default constructor, given a boundbix will create the opposite physics ground.

Parameters
irrBoxaabbox3df irrlicht world bounding box
10  {
11 
12  this->collisionConfiguration = new btDefaultCollisionConfiguration();
13  /*this->broadPhase = new btAxisSweep3(
14  toBulletVector(core::vector3df(irrBox.MinEdge)), toBulletVector(core::vector3df(irrBox.MaxEdge))
15  );*/
16  this->broadPhase = new btAxisSweep3(btVector3(-100000, -100000, -100000), btVector3(100000, 100000, 100000));
17 
18  this->dispatcher = new btCollisionDispatcher(collisionConfiguration);
19  this->solver = new btSequentialImpulseConstraintSolver();
20  this->initWorld();
21 }
btSequentialImpulseConstraintSolver * solver
Internal bullet solver.
Definition: physics.h:28
btCollisionDispatcher * dispatcher
Collision system dispatcher.
Definition: physics.h:26
btBroadphaseInterface * broadPhase
Bounding box overlapping interface.
Definition: physics.h:24
void initWorld()
Init physics instances of the World.
Definition: physics.cpp:28
btDefaultCollisionConfiguration * collisionConfiguration
Default collision system.
Definition: physics.h:22

◆ ~Physics()

Physics::~Physics ( )
22  {
23  delete this->collisionConfiguration;
24  delete this->broadPhase;
25  delete this->dispatcher;
26  delete this->solver;
27 }
btSequentialImpulseConstraintSolver * solver
Internal bullet solver.
Definition: physics.h:28
btCollisionDispatcher * dispatcher
Collision system dispatcher.
Definition: physics.h:26
btBroadphaseInterface * broadPhase
Bounding box overlapping interface.
Definition: physics.h:24
btDefaultCollisionConfiguration * collisionConfiguration
Default collision system.
Definition: physics.h:22

Member Function Documentation

◆ createCannonBall()

btRigidBody * Physics::createCannonBall ( scene::ISceneNode *  node,
core::vector3df  position,
f32  radius 
)

Create the projectile physics instance.

Parameters
nodeISceneNode graphic node
positionvector3df position to set
radiusf32 radius of the projectile
See also
Physics
Ball
MotionStateManager
65  {
66  btTransform transformer;
67  transformer.setIdentity();
68  transformer.setOrigin(toBulletVector(position));
69 
70 // btDefaultMotionState *motion = new btDefaultMotionState(transformer);
71  MotionStateManager *motion = new MotionStateManager(transformer, node);
72  btCollisionShape *sphere = new btSphereShape(radius);
73 
74  btVector3 localInertia;
75  sphere->calculateLocalInertia(2600.f, localInertia);
76  btRigidBody::btRigidBodyConstructionInfo ballRigidBodyCI(2600,motion,sphere,localInertia);
77  ballRigidBodyCI.m_friction =2.5f;
78  ballRigidBodyCI.m_restitution = 0.001f;
79  ballRigidBodyCI.m_spinningFriction = 2.1f;
80  ballRigidBodyCI.m_rollingFriction = 2.1f;
81  ballRigidBodyCI.m_angularDamping = 0.65f;
82  btRigidBody *rigidBody = new btRigidBody(ballRigidBodyCI);
83  rigidBody->setUserPointer((void *)(node));
84 
85  this->Objects.push_back(rigidBody);
86 
87  this->World->addRigidBody(rigidBody);
88  return rigidBody;
89 }
btVector3 toBulletVector(core::vector3df vec)
Convert given Irrlicht vector3d vector to Bullect btVector3.
Definition: bullethelper.cpp:11
btDiscreteDynamicsWorld * World
Type of discrete rigid body simulation.
Definition: physics.h:15
MotionStateManager handles physics motion of objects.
Definition: motionstatemanager.h:8
std::list< btRigidBody * > Objects
List of btRigitBody instances.
Definition: physics.h:20

◆ createCastleBlock()

btRigidBody * Physics::createCastleBlock ( scene::ISceneNode *  node,
core::vector3df  rotation,
core::vector3df  scale,
core::vector3df  position 
)

Create a castle block.

So it will be sensible to collision.

Parameters
nodeISceneNoe node of the irrlicht graphic object.
rotationvector3df rotation of the object
scalevector3df scaling of the node passed.
positionvector3df position of the object.
See also
Castle::createBlock();
Castle::buildCastle();
MotionStateManager;
90  {
91  btTransform transformer;
92  transformer.setIdentity();
93 // quat.setEuler(irr::core::DEGTORAD*rotation.X,irr::core::DEGTORAD*rotation.Y,irr::core::DEGTORAD*rotation.Z);
94  transformer.setRotation(EulerToQuaternion(rotation));
95  transformer.setOrigin(toBulletVector(position));
96  MotionStateManager* motion = new MotionStateManager(transformer,node);
97  core::vector3df extents = core::vector3df(scale.X,scale.Y,scale.Z)*0.5f;
98  btCollisionShape* box = new btBoxShape(toBulletVector(extents));
99  btVector3 localInertia;
100  btScalar mass = 1500.f;
101  btVector3 minEdge, maxEdge;
102 
103  box->calculateLocalInertia(mass, localInertia);
104  box->getAabb(transformer,minEdge,maxEdge);
105 // std::cout<<"btMin "<<minEdge[1]<<" irrMin"<<node->getBoundingBox().MinEdge.Y<<" irrMax"<<node->getBoundingBox().MaxEdge.Y<<" "<<maxEdge[1]<<" "<<std::endl;
106 
107  btRigidBody::btRigidBodyConstructionInfo blockInfo = btRigidBody::btRigidBodyConstructionInfo(mass,motion,box,localInertia);
108  blockInfo.m_friction = 10.f;
109  blockInfo.m_restitution = 0.001f;
110  blockInfo.m_spinningFriction = 100.f;
111  blockInfo.m_linearDamping = 0.05f;
112  blockInfo.m_rollingFriction = 100.f;
113  blockInfo.m_angularDamping = 0.8f;
114  btRigidBody* rigidBody = new btRigidBody(blockInfo);
115  rigidBody->activate(true);
116  rigidBody->setUserPointer((void *) node);
117  this->Objects.push_back(rigidBody);
118  this->World->addRigidBody(rigidBody);
119  return rigidBody;
120 
121 }
btVector3 toBulletVector(core::vector3df vec)
Convert given Irrlicht vector3d vector to Bullect btVector3.
Definition: bullethelper.cpp:11
btQuaternion EulerToQuaternion(const core::vector3df &euler)
Convert given Irrlicht euler angle to Bullet quaternion angle.
Definition: bullethelper.cpp:18
btDiscreteDynamicsWorld * World
Type of discrete rigid body simulation.
Definition: physics.h:15
MotionStateManager handles physics motion of objects.
Definition: motionstatemanager.h:8
std::list< btRigidBody * > Objects
List of btRigitBody instances.
Definition: physics.h:20

◆ createTreasure()

btRigidBody * Physics::createTreasure ( scene::IMeshSceneNode *  node,
core::vector3df  scale,
core::vector3df  position 
)

Create the treasure physics instance.

Parameters
nodeIMeshSceneNode mesh node of the irrlicht graphic object.
scalevector3df scaling of the node passed.
positionvector3df position of the object.
See also
Target
::checkTarget
MotionStateManager
122  {
123  btTransform transformer;
124  transformer.setIdentity();
125  transformer.setOrigin(toBulletVector(position));
126  core::vector3df _extent = node->getBoundingBox().getExtent();
127  btCollisionShape* box = new btBoxShape(toBulletVector(_extent*0.5f));
128  btVector3 minEdge, maxEdge;
129  btVector3 localInertia;
130  btScalar mass = 2780.f;
131  transformer.setOrigin(btVector3(toBulletVector(position)[0], 0, toBulletVector(position)[2]));
132  MotionStateManager *motion = new MotionStateManager(transformer,node);
133 
134  box->calculateLocalInertia(mass, localInertia);
135  btRigidBody::btRigidBodyConstructionInfo targetInfo = btRigidBody::btRigidBodyConstructionInfo(mass,motion,box,localInertia);
136  targetInfo.m_friction = 10.f;
137  targetInfo.m_restitution = 0.001f;
138  targetInfo.m_spinningFriction = 100.f;
139  targetInfo.m_linearDamping = 0.05f;
140  targetInfo.m_rollingFriction = 100.f;
141  targetInfo.m_angularDamping = 0.8f;
142  btRigidBody* rigidBody = new btRigidBody(targetInfo);
143  rigidBody->activate(true);
144  rigidBody->setUserPointer((void *) node);
145  this->Objects.push_back(rigidBody);
146  this->World->addRigidBody(rigidBody);
147  return rigidBody;
148 }
btVector3 toBulletVector(core::vector3df vec)
Convert given Irrlicht vector3d vector to Bullect btVector3.
Definition: bullethelper.cpp:11
btDiscreteDynamicsWorld * World
Type of discrete rigid body simulation.
Definition: physics.h:15
MotionStateManager handles physics motion of objects.
Definition: motionstatemanager.h:8
std::list< btRigidBody * > Objects
List of btRigitBody instances.
Definition: physics.h:20

◆ getGround()

btTransform Physics::getGround ( )

Return ground transform.

49 { return this->ground; }
btTransform ground
Ground transform properties.
Definition: physics.h:30

◆ initWorld()

void Physics::initWorld ( )

Init physics instances of the World.

Like ground, collision configuration, gravity and friction. A ground is created.

28  {
29 
30  this->World = new btDiscreteDynamicsWorld(this->dispatcher, this->broadPhase, this->solver, this->collisionConfiguration);
31  this->World->setGravity(btVector3(0,-10,0));
32 
33  btCollisionShape* groundShape = new btStaticPlaneShape(btVector3(0, 1, 0),-1);
34  this->ground = btTransform(btQuaternion(0, 0, 0, 1), btVector3(0, 1, 0));
35  btDefaultMotionState* groundMotionState = new btDefaultMotionState(ground);
36 
37  btRigidBody::btRigidBodyConstructionInfo groundRigidBodyCI = btRigidBody::btRigidBodyConstructionInfo(0, groundMotionState, groundShape, btVector3(0, 0, 0));
38  groundRigidBodyCI.m_restitution = 1.f;
39  groundRigidBodyCI.m_friction = 1.5f;
40  groundRigidBodyCI.m_rollingFriction = 1.5f;
41  groundRigidBodyCI.m_spinningFriction = 1.5f;
42 
43  btRigidBody* groundRigidBody = new btRigidBody(groundRigidBodyCI);
44  this->World->addRigidBody(groundRigidBody);
45  groundRigidBody->setUserPointer((void *) 0);
46  this->Objects.push_back(groundRigidBody);
47 
48 }
btSequentialImpulseConstraintSolver * solver
Internal bullet solver.
Definition: physics.h:28
btCollisionDispatcher * dispatcher
Collision system dispatcher.
Definition: physics.h:26
btBroadphaseInterface * broadPhase
Bounding box overlapping interface.
Definition: physics.h:24
btDiscreteDynamicsWorld * World
Type of discrete rigid body simulation.
Definition: physics.h:15
std::list< btRigidBody * > Objects
List of btRigitBody instances.
Definition: physics.h:20
btTransform ground
Ground transform properties.
Definition: physics.h:30
btDefaultCollisionConfiguration * collisionConfiguration
Default collision system.
Definition: physics.h:22

◆ UpdatePhysics()

void Physics::UpdatePhysics ( u32  delta,
u32  fps 
)

World step simulation.

This must be sync with Irrlicht

DEPRECATED, MotionStateManager will handle this now!/

50  {
51 
52  this->World->stepSimulation(TDeltaTime);
53 
55 
56 // for(std::list<btRigidBody *>::iterator Iterator = Objects.begin(); Iterator != Objects.end(); ++Iterator) {
57 // if((*Iterator)->getUserPointer() != 0)
58 // this->UpdateRender(*Iterator);
59 //
60 // }
61 
62 
63 }
btDiscreteDynamicsWorld * World
Type of discrete rigid body simulation.
Definition: physics.h:15

◆ UpdateRender()

void Physics::UpdateRender ( btRigidBody *  btbody)

Update graphic object transformation.

DEPRECATED, MotionStateManager will handle this now!/

See also
MotionStateManager
Deprecated:
150  {
151  return;
152  scene::ISceneNode *Node = static_cast<scene::ISceneNode *>(TObject->getUserPointer());
153 
154  // Set position
155  btVector3 Point = TObject->getCenterOfMassPosition();
156  std::cout<<Point.getX()<<" "<<Point.getY()<<" "<<Point.getZ()<< "BULLET"<<std::endl;
157  Node->setPosition(core::vector3df((f32)Point[0], (f32)Point[1], (f32)Point[2]));
158  std::cout<<Node->getAbsolutePosition().X<<" "<<Node->getAbsolutePosition().Y<<" "<<Node->getAbsolutePosition().Z<<"irrlicht"<<std::endl;
159 
160 // // Set rotation ---testing
161  core::vector3df Euler;
162  const btQuaternion& TQuat = TObject->getOrientation();
163  core::quaternion q(TQuat.getX(), TQuat.getY(), TQuat.getZ(), TQuat.getW());
164  q.toEuler(Euler);
165  Euler *= core::RADTODEG;
166  Node->setRotation(Euler);
167 }

Member Data Documentation

◆ broadPhase

btBroadphaseInterface* Physics::broadPhase
private

Bounding box overlapping interface.

◆ collisionConfiguration

btDefaultCollisionConfiguration* Physics::collisionConfiguration
private

Default collision system.

◆ dispatcher

btCollisionDispatcher* Physics::dispatcher
private

Collision system dispatcher.

◆ ground

btTransform Physics::ground
private

Ground transform properties.

◆ Objects

std::list<btRigidBody *> Physics::Objects
private

List of btRigitBody instances.

All this btRigidBody have a pointer to corresponding graphic object. This system is not used anymore.

See also
MotionStateManager
Deprecated:

◆ solver

btSequentialImpulseConstraintSolver* Physics::solver
private

Internal bullet solver.

◆ World

btDiscreteDynamicsWorld* Physics::World
private

Type of discrete rigid body simulation.


The documentation for this class was generated from the following files: