OgreBullet Simple Tutorials HERE

SXtheOne

28-05-2010 20:28:05

UPDATE: From now on this tutorial can be reached also from OgreBullet Wiki: http://www.ogre3d.org/wiki/index.php/OgreBullet

Hi!

This tutorial will guide you through the configuration of an OgreBullet project from configuring the components to creating the first simple demo which will have some collision detection.
My native language is not english so if you find grammatical errors, please post a comment. Thanks!

What you need:
- Ogre 1.65 (must be already configured)
- Bullet 2.76 (you can download from here: http://code.google.com/p/bullet/downloads/list)
- OgreBullet (I used rev. 2902, svn at the time of writing: https://ogreaddons.svn.sourceforge.net/svnroot/ogreaddons/trunk/ogrebullet)

IDE what I used and will refer to:
- Visual Studio 2008 C++ Express SP1

Also good if you have:
- Ogre AppWizard (the basic project is generated with this. Wiki: http://www.ogre3d.org/wiki/index.php/The_Complete_Blanks_Guide_To_Using_The_OGRE_SDK_AppWizard)

Preparation:
- Unpack Bullet and fetch OgreBullet to a place in the hard drive.
- set an environment variable:
BULLET_HOME C:\OgreSDK\AddOns\bullet-2.76 (if this is were you unpacked bullet)
You can find the place in Windows XP following this path: open Control Panel (classic view) / System / Advanced / Environment Variables. Set it in the User Variables box.

- build Bullet in your IDE (I do it in VS2008 Express)
The project file for VS 2008 is here: ....\bullet-2.76\msvc\2008\BULLET_PHYSICS.sln
Build it in debug and release mode. It should compile without any problem.

- build OgreBullet also: ....\OgreBullet\OgreBullet_SDK.sln
VS2008 converted the project without any errors for me.
When you build the debug version of the demos you may have some errors about missing .lib files.
Put these files to ....\OgreBullet\lib\Debug\:
BulletCollision.lib, can be found here: ....\bullet-2.76\msvc\2008\src\BulletCollision\Debug\
BulletDynamics.lib, can be found here: ....\bullet-2.76\msvc\2008\src\BulletDynamics\Debug\
ConvexDecomposition.lib, can be found here: ....\bullet-2.76\msvc\2008\Extras\ConvexDecomposition\Debug\
GIMPACTUtils.lib, can be found here: ....\bullet-2.76\msvc\2008\Extras\GIMPACTUtils\Debug\
LinearMath.lib, can be found here:....\bullet-2.76\msvc\2008\src\LinearMath\Debug\

There may some files what we don't need now but later. For example BulletSoftBody.lib. If something is missing when you use more from Bullet, don't forget to copy it to the right place.
If you want to RUN the demos and it can't find resources.cfg don't wonder. This tutorial is not about these demos but I think you can solve it yourself. There are some problems with paths :)

If you want to build the release version of the demos (or any OgreBullet project!) you have to put the Bullet .lib files to the ....\OgreBullet\lib\Release folder.
But beware! You have to put the RELEASE version of Bullet .lib files to this dir, not the same files what were listed before.

Now we have the required files, let's close this project and start a new!

If you have Ogre Appwizard installed, create a new Ogre project:
New project – Ogre SDK Application – OgreBullet_Collision_test – Finish
I refer to the classes with the names what are generated from the project name. If you want to use another name, be careful with the different names.
If you don't have Appwizard just create a basic Ogre application what is able to create a window, fire up a FrameListener and able to handle keyboard/mouse input. From now on I refer to Appwizard basic project.

Before we start coding we need to do some configuration:
- Open Project\Properties (Alt+F7)
- Go to Configuration Properties\C/C++\General
- Find Additional Include Directories, open with '...' button
- Put $(BULLET_HOME)\src to the end of the list.
- Change the Configuration (in the top-left corner of the window) to Release and do the same here as well.

- Now go to Configuration Properties\Linker\Input
- Find Additional Dependencies
- Add required elements. In the end it should contain these:
OgreMain_d.lib OIS_d.lib OgreBulletCollisions_d.lib OgreBulletDynamics_d.lib bulletcollision.lib bulletdynamics.lib LinearMath.lib GIMPACTutils.lib ConvexDecomposition.lib
- Change the Configuration (in the top-left corner of the window) to Release and insert these to the same place as before:
OgreMain.lib OIS.lib OgreBulletCollisions.lib OgreBulletDynamics.lib bulletcollision.lib bulletdynamics.lib LinearMath.lib GIMPACTutils.lib ConvexDecomposition.lib

- Now close this window and go to Tools\Options\Projects and Solutions\VC++ Directories\
- Set Show directories for: Include files
- Put these into the list (your path to OgreBullet needed):
....\OgreBullet\Collisions\include
....\OgreBullet\Dynamics\include
Change to Library files and put these to the list:
....\OgreBullet\lib\Debug
....\OgreBullet\lib\Release

Build the project. It should be working

We won't change OgreBullet_Collision_test.cpp so you can close it if you want.

Open OgreBullet_Collision_test.h. From now on everything happens here.
You can split it to .h and .cpp file if you like. It's not a big program so I won't :)
Note: I won't use namespaces. It's because this way you can see what class contains what function.

The coding part starts here!

We need this header to be able to use OgreBullet:

#include "OgreBulletDynamicsRigidBody.h"


Now change the constuctor of your basic program (insert two extra fields):

OgreBullet_Collision_testFrameListener(
SceneManager *sceneMgr,
RenderWindow* win,
Camera* cam,
Vector3 &gravityVector,
AxisAlignedBox &bounds)
: ExampleFrameListener(win, cam),
mSceneMgr(sceneMgr)


The gravityVector defines the gravity in our example and I thought that the bounds defines the bounds where Bullet is active. But it seems that it has no effect. Anyway we need it :)

Find createFrameListener(void) function and change the call of the previously modified function:

void createFrameListener(void)
{
mFrameListener= new OgreBullet_Collision_testFrameListener( mSceneMgr,
mWindow,
mCamera,
Vector3(0,-9.81,0), // gravity vector for Bullet
AxisAlignedBox (Ogre::Vector3 (-10000, -10000, -10000), //aligned box for Bullet
Ogre::Vector3 (10000, 10000, 10000)));
mRoot->addFrameListener(mFrameListener);
}


Now we have our frameListener as before but with the new parameters included.
Maybe try to run it. Nothing changed yet. So, define these variables in the OgreBullet_Collision_testFrameListener class:

class OgreBullet_CollisiontestFrameListener : public ExampleFrameListener
{
private:
SceneManager* mSceneMgr;
OgreBulletDynamics::DynamicsWorld *mWorld; // OgreBullet World
OgreBulletCollisions::DebugDrawer *debugDrawer;
int mNumEntitiesInstanced;

std::deque<OgreBulletDynamics::RigidBody *> mBodies;
std::deque<OgreBulletCollisions::CollisionShape *> mShapes;

mWorld will be the main variable for OgreBullet (like mRoot for Ogre).
debugDrawer will be explained soon.
mBodies and mShapes will handle the Bullet shapes and bodies. We need them to be able to free the memory and therefore get rid of memory leaks.
Let's set up the basics of OgreBullet. Go to OgreBullet_Collision_testFrameListener constructor and paste these:

mMoveSpeed = 50; // defined in ExampleFrameListener
mNumEntitiesInstanced = 0; // how many shapes are created
mSceneMgr = sceneMgr;
// Start Bullet
mWorld = new OgreBulletDynamics::DynamicsWorld(mSceneMgr, bounds, gravityVector);

// add Debug info display tool
debugDrawer = new OgreBulletCollisions::DebugDrawer();
debugDrawer->setDrawWireframe(true); // we want to see the Bullet containers

mWorld->setDebugDrawer(debugDrawer);
mWorld->setShowDebugShapes(true); // enable it if you want to see the Bullet containers
SceneNode *node = mSceneMgr->getRootSceneNode()->createChildSceneNode("debugDrawer", Ogre::Vector3::ZERO);
node->attachObject(static_cast <SimpleRenderable *> (debugDrawer));


mMoveSpeed is declared in ExampleFrameListener.h and is responsible for the maximum speed of the camera movement.
mNumEntitiesInstanced is a counter what we use when we create objects dynamically (we can't have two object using the same name).
mSceneMgr is the Ogre Scene Manager.
mWorld is the OgreBullet main variable.
debugDrawer will be used to show graphical debug information about OgreBullet. We use the setDrawWireframe(true) function to set the bounding Box/Sphere/etc. what Bullet uses for collisions visible. Turn is off if you don't want to see but it's very good for debuging.
Debugdrawer needs Ogre to be able to draw to the screen. That's why we create a node for it.

Of course we need to delete the variables/deques in the destructor:

~OgreBullet_Collision_testFrameListener(){
// OgreBullet physic delete - RigidBodies
std::deque<OgreBulletDynamics::RigidBody *>::iterator itBody = mBodies.begin();
while (mBodies.end() != itBody)
{
delete *itBody;
++itBody;
}
// OgreBullet physic delete - Shapes
std::deque<OgreBulletCollisions::CollisionShape *>::iterator itShape = mShapes.begin();
while (mShapes.end() != itShape)
{
delete *itShape;
++itShape;
}
mBodies.clear();
mShapes.clear();
delete mWorld->getDebugDrawer();
mWorld->setDebugDrawer(0);
delete mWorld;
}


Set the position of the camera. Find createCamera(void) and change the setPosition to this:

mCamera->setPosition(Vector3(0,18,70));


Let's create the scene. Go to OgreBullet_Collision_testApp class and find the createScene(void) function. Delete the rows which defines the default OgreHead (these were the first three row in my code).
We won't create the scene here because this function is called before the frameListener. I don't want to change the ExampleApplication.h file so let's go back to OgreBullet_Collision_testFrameListener constructor and insert this code after the last row.
First, create the floor:

// Define a floor plane mesh
Entity *ent;
Plane p;
p.normal = Vector3(0,1,0); p.d = 0;
MeshManager::getSingleton().createPlane(
"FloorPlane", ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME,
p, 200000, 200000, 20, 20, true, 1, 9000, 9000, Vector3::UNIT_Z);
// Create an entity (the floor)
ent = mSceneMgr->createEntity("floor", "FloorPlane");
ent->setMaterialName("Examples/BumpyMetal");
mSceneMgr->getRootSceneNode()->createChildSceneNode()->attachObject(ent);

If you run the program now, you can see an endless (at least it seems endless) plane with texture. Let's add collision detection to it!

OgreBulletCollisions::CollisionShape *Shape;
Shape = new OgreBulletCollisions::StaticPlaneCollisionShape(Ogre::Vector3(0,1,0), 0); // (normal vector, distance)

OgreBulletDynamics::RigidBody *defaultPlaneBody = new OgreBulletDynamics::RigidBody(
"BasePlane",
mWorld);
defaultPlaneBody->setStaticShape(Shape, 0.1, 0.8); // (shape, restitution, friction)
// push the created objects to the deques
mShapes.push_back(Shape);
mBodies.push_back(defaultPlaneBody);

Try to run it and you can see there are some errors. We need a header to be included:

#include "Shapes/OgreBulletCollisionsStaticPlaneShape.h" // for static planes

Now the plane is detecting collisions! But how to test it when the camera is going through it? Let's create some boxes and throw them into the scene!
This header is needed to be able to create a box...:

#include "Shapes/OgreBulletCollisionsBoxShape.h" // for Boxes

...and we need boxes. Let's redefine the processUnbufferedKeyInput() function. Originally it is defined in the ExampleFrameListener. I won't start to explain it, so if you didn't already know this start reading the Ogre basic tutorials :)


bool processUnbufferedKeyInput(const FrameEvent& evt)
{
bool ret = ExampleFrameListener::processUnbufferedKeyInput(evt);

// create and throw a box if 'B' is pressed
if(mKeyboard->isKeyDown(OIS::KC_B) && mTimeUntilNextToggle <=0)
{
Vector3 size = Vector3::ZERO; // size of the box
// starting position of the box
Vector3 position = (mCamera->getDerivedPosition() + mCamera->getDerivedDirection().normalisedCopy() * 10);

// create an ordinary, Ogre mesh with texture
Entity *entity = mSceneMgr->createEntity(
"Box" + StringConverter::toString(mNumEntitiesInstanced),
"cube.mesh");
entity->setCastShadows(true);
// we need the bounding box of the box to be able to set the size of the Bullet-box
AxisAlignedBox boundingB = entity->getBoundingBox();
size = boundingB.getSize(); size /= 2.0f; // only the half needed
size *= 0.96f; // Bullet margin is a bit bigger so we need a smaller size
// (Bullet 2.76 Physics SDK Manual page 18)
entity->setMaterialName("Examples/BumpyMetal");
SceneNode *node = mSceneMgr->getRootSceneNode()->createChildSceneNode();
node->attachObject(entity);
node->scale(0.05f, 0.05f, 0.05f); // the cube is too big for us
size *= 0.05f; // don't forget to scale down the Bullet-box too

// after that create the Bullet shape with the calculated size
OgreBulletCollisions::BoxCollisionShape *sceneBoxShape = new OgreBulletCollisions::BoxCollisionShape(size);
// and the Bullet rigid body
OgreBulletDynamics::RigidBody *defaultBody = new OgreBulletDynamics::RigidBody(
"defaultBoxRigid" + StringConverter::toString(mNumEntitiesInstanced),
mWorld);
defaultBody->setShape( node,
sceneBoxShape,
0.6f, // dynamic body restitution
0.6f, // dynamic body friction
1.0f, // dynamic bodymass
position, // starting position of the box
Quaternion(0,0,0,1));// orientation of the box
mNumEntitiesInstanced++;

defaultBody->setLinearVelocity(
mCamera->getDerivedDirection().normalisedCopy() * 7.0f ); // shooting speed

// push the created objects to the deques
mShapes.push_back(sceneBoxShape);
mBodies.push_back(defaultBody);
mTimeUntilNextToggle = 0.5;
}
return ret;
}


The code is well commented here so I won't explain everything in detail. If you press the 'B' key a box will be created.
The box is created in several phase like the plane before. First we create the Ogre-box by loading a mesh. This is needed to be able to see the actual box with texture.
After this we create the shape for Bullet what is a BoxCollisionShape this time. This means that we want a box-shaped collision object.
When this is ready we arrived to the last step. We need a RigidBody and we use the setShape() function to bind together the box the shape and the RigidBody.
The size variable is self-explanatory but it is good to know that getBoundingBox() will give us the smallest box what can be drawn around the object (in our case the cube).
When you run this demo and push the 'B' key, you can see the created box floating in the air. That's not what we want.
So, the last step is to make the box move. We need to override the frameStarted() and frameEnded() functions. Here they are:

bool frameStarted(const FrameEvent& evt)
{
bool ret = ExampleFrameListener::frameStarted(evt);

mWorld->stepSimulation(evt.timeSinceLastFrame); // update Bullet Physics animation

return ret;
}

bool frameEnded(const FrameEvent& evt)
{
bool ret = ExampleFrameListener::frameEnded(evt);

mWorld->stepSimulation(evt.timeSinceLastFrame); // update Bullet Physics animation

return ret;
}


The only needed function to make Bullet functional is the stepSimulation().

That's it. You can throw boxes!

I hope this tutorial was helpful. If it was or if you found grammatical/coding error please post a comment!

Thanks for reading and have a nice day! :)

TechnoBulldog

31-05-2010 01:59:52

Wow, dude, awesome! I honestly am too big of a beginner to go sorting through the demos, so this is really a lifesaver! This will hopefully be just enough to get me started! Thanks so much!

SXtheOne

31-05-2010 07:36:25

Wow, dude, awesome! I honestly am too big of a beginner to go sorting through the demos, so this is really a lifesaver! This will hopefully be just enough to get me started! Thanks so much!

You are welcome! :D When I first saw the demos in the OgreBullet SVN, I felt like you. It was several hours of hard work until I figured out the basics. It's good to see that someone got help from my simple tutorial :)

tuan kuranes

31-05-2010 12:28:32

Great work, Would be great if you could put it on Ogre Wiki and link it on Ogre wiki bullet page.

SXtheOne

31-05-2010 19:42:24

Great work, Would be great if you could put it on Ogre Wiki and link it on Ogre wiki bullet page.

Thanks, I'm glad you like it! :D

Ok I will create a page for it :) .
Also I plan to add several little updates like how to add a sphere and maybe a static trimesh if I have some time.

One question before start: when you say 'put it on Ogre wiki' you mean the tutorial page (http://www.ogre3d.org/wiki/index.php/Ogre_Tutorials) or is it enough if I create a link on the OgreBullet wiki only?

TechnoBulldog

31-05-2010 21:56:26

I would really look forward to more tutorials like these, really.

I don't think there is a category that would fit for OgreBullet tutorials. Maybe just Ogre Tutorials. Then just link to it from the OgreBullet wiki page.

SXtheOne

01-06-2010 20:56:19

I made the Wikis. They are reachable from the OgreBullet Wiki:

http://www.ogre3d.org/wiki/index.php/OgreBullet

If somebody finds some errors, please correct them!

TechnoBulldog

01-06-2010 21:03:18

I forgot to mention this, but I can confirm that your tutorial is compatible with Ogre 1.7.1.

Fish

02-06-2010 00:21:07

Nice work.

- Fish

SXtheOne

02-06-2010 09:35:32

I forgot to mention this, but I can confirm that your tutorial is compatible with Ogre 1.7.1.

Thanks for the info, I'll update the wiki.

zhengjianfeng

15-10-2010 03:51:02

I hava some error like this :

1> Is creating library ..\..\..\/OgreBulletDynamicsDemo_d.lib And the object ..\..\..\/OgreBulletDynamicsDemo_d.exp
1>ConvexDecomposition.lib(vlookup.obj) : error LNK2019: Cannot resolve the external symbols "__declspec(dllimport) public: void __thiscall std::_Container_base_secure::_Orphan_all(void)const " (__imp_?_Orphan_all@_Container_base_secure@std@@QBEXXZ),This symbol in the function "protected: void __thiscall std::vector<class Vlookup::VertexPosition,class std::allocator<class Vlookup::VertexPosition> >::_Tidy(void)" (?_Tidy@?$vector@VVertexPosition@Vlookup@@V?$allocator@VVertexPosition@Vlookup@@@std@@@std@@IAEXXZ) be referenced

1>ConvexDecomposition.lib(concavity.obj) : error LNK2001: Cannot resolve the external symbols "__declspec(dllimport) public: void __thiscall std::_Container_base_secure::_Orphan_all(void)const " (__imp_?_Orphan_all@_Container_base_secure@std@@QBEXXZ)

How to solve this problem?

the answer is Character encoding Settings :)

zhengjianfeng

15-10-2010 11:06:42

I was too careless
here
------------------------------------------------------
- build OgreBullet also: ....\OgreBullet\OgreBullet_SDK.sln
VS2008 converted the project without any errors for me.
When you build the debug version of the demos you may have some errors about missing .lib files.
Put these files to ....\OgreBullet\lib\Debug\:
BulletCollision.lib, can be found here: ....\bullet-2.76\msvc\2008\src\BulletCollision\Debug\
BulletDynamics.lib, can be found here: ....\bullet-2.76\msvc\2008\src\BulletDynamics\Debug\
ConvexDecomposition.lib, can be found here: ....\bullet-2.76\msvc\2008\Extras\ConvexDecomposition\Debug\
GIMPACTUtils.lib, can be found here: ....\bullet-2.76\msvc\2008\Extras\GIMPACTUtils\Debug\
LinearMath.lib, can be found here:....\bullet-2.76\msvc\2008\src\LinearMath\Debug\
------------------------------------------------------
I carefully read, and finally solved
thanks!!!!

Draq

17-10-2010 13:48:49

Hello,

Is there any OgreBullet tutorial for Ogre 1.7.1 (and Bullet 2.76)??

SXtheOne

19-10-2010 09:32:21

Hello,

Is there any OgreBullet tutorial for Ogre 1.7.1 (and Bullet 2.76)??


Have you read the first several sentences of the tutorial put into the wiki?

What you need:

- Ogre 1.65 (must be already configured). It is reported that this tutorial is compatible with Ogre 1.7.1 also


You should visit the Wiki page (the link is the opening sentence of this thread) before asking questions. If you tried and it is not working that's OK if you ask questions but don't be an write-only guy.

Draq

19-10-2010 11:23:08

I alway search before writing - yes, I tried it and first tutorial is compatible, but second doesn't. :/

SXtheOne

19-10-2010 14:16:18

I alway search before writing - yes, I tried it and first tutorial is compatible, but second doesn't. :/

Ok, that's something :)
I personally use Ogre 1.6.5 but maybe somebody can help, so what is the problem with tutorial 2?

Draq

19-10-2010 16:42:02

Can't compile it.
As I found on Wiki:
ExampleApplication - The ExampleApplication.h framework (and partner in crime ExampleFrameListener?) was used in the Ogre sample applications to show off the wizbang features of the engine. They provided standard handling for the examples (WASD-moving, FPS and other stat info, etc..)
From Ogre 1.7 (Cthugha) it was replaced by the samples framework, OgreBites.


So I don't know what to use instead of ExampleApplication (probably BaseApplication, but I'm not sure) and ExampleFrameListener.

I'll probably try NxOgre. It looks like it will be easier to learn (more tutorials, etc.) and engine doesn't matter, because I need only rigid blocks collisions and bouncing ;)

SXtheOne

20-10-2010 12:11:58

Can't compile it.
As I found on Wiki:
ExampleApplication - The ExampleApplication.h framework (and partner in crime ExampleFrameListener?) was used in the Ogre sample applications to show off the wizbang features of the engine. They provided standard handling for the examples (WASD-moving, FPS and other stat info, etc..)
From Ogre 1.7 (Cthugha) it was replaced by the samples framework, OgreBites.


So I don't know what to use instead of ExampleApplication (probably BaseApplication, but I'm not sure) and ExampleFrameListener.

I'll probably try NxOgre. It looks like it will be easier to learn (more tutorials, etc.) and engine doesn't matter, because I need only rigid blocks collisions and bouncing ;)


It uses PhysX, right? I don't recommend using PhysiX but it's my own thing. I asked someone to help you.

BR,

SX

TechnoBulldog

20-10-2010 22:26:10

If the problem is ExampleApplication, I still used it. Ogre1.7.1 still has ExampleApplication.h and ExampleFrameListener.h, they are included in the include/Ogre folder. Was there something else wrong?

I can't remember if I changed the names of ExampleApplication and ExampleFrameListeners to that, I think it comes that way, but I'm not sure. Don't remember.

Draq

20-10-2010 23:46:08

thanks, it helped. I've searched on the Ogre wiki page and trying to go to exampleframe listener definition, but didn't open include folder. -.-'
I couldn't finish this tutorial becaue couldn't find these classes. I managed to run demo using tutorial's full source code, tomorrow I'll try to learn something from this tut. xD

Btw I see that Bullet isn't so popular in OGRE community. Does anyone know reason why? It seems to be good engine ;d

TechnoBulldog

21-10-2010 00:39:24

I think the reason Bullet isn't so popular amongst the Ogre community is because it's more difficult to integrate and harder to get started with. I mean to say, it's easier to start learning with NxOgre than OgreBullet because there are simply more tutorials out there and a more active community. I tried learning OgreBullet, but I couldn't because there really weren't any tutorials. This was an absolutely great tutorial, but it's nothing compared to the NxOgre tutorials. The fact that there is more help and it's easier to find help with NxOgre makes people naturally flock to it, and once they know how to use it, they don't have a need to try anything else.

I'm not trying to be biased, but I know I am. I personally gave up on OgreBullet a while back and am using NxOgre, if it isn't apparent.

-- Edited --

To be honest, there aren't a lot of changes to the basic structure of Ogre between 1.6.5 and 1.7.1. At least, I can't think of any....

SXtheOne

21-10-2010 09:21:04

I think the reason Bullet isn't so popular amongst the Ogre community is because it's more difficult to integrate and harder to get started with. I mean to say, it's easier to start learning with NxOgre than OgreBullet because there are simply more tutorials out there and a more active community. I tried learning OgreBullet, but I couldn't because there really weren't any tutorials. This was an absolutely great tutorial, but it's nothing compared to the NxOgre tutorials. The fact that there is more help and it's easier to find help with NxOgre makes people naturally flock to it, and once they know how to use it, they don't have a need to try anything else.

I'm not trying to be biased, but I know I am. I personally gave up on OgreBullet a while back and am using NxOgre, if it isn't apparent.

-- Edited --

To be honest, there aren't a lot of changes to the basic structure of Ogre between 1.6.5 and 1.7.1. At least, I can't think of any....


It's sad but I think you are right. It's hard to start Bullet. But after you managed to start it don't give up it's getting better :) I'm using it for a couple of month and it's getting easier every day. :) Although it is true that the documentation is not really good.
But, it is stable free and hardware-independent! With source code :)

TechnoBulldog

21-10-2010 19:16:22

Although I do enjoy the open source hardware independent-ness, I found the lack of easy to understand documentation hard to overcome.

AE86takumi

12-12-2013 05:52:32


bool frameStarted(const FrameEvent& evt)
{
bool ret = ExampleFrameListener::frameStarted(evt);

mWorld->stepSimulation(evt.timeSinceLastFrame); // update Bullet Physics animation

return ret;
}

bool frameEnded(const FrameEvent& evt)
{
bool ret = ExampleFrameListener::frameEnded(evt);

mWorld->stepSimulation(evt.timeSinceLastFrame); // update Bullet Physics animation

return ret;
}



Can anyone tell me why mWorld->stepSimulation(evt.timeSinceLastFrame); is needed in both the frameStarted and frameEnded? doesnt evt.timesincelastframe return the time since the last event of the same type? So in frameStarted evt would be the amount of time that has passed since last frame's frameStarted. Wouldnt that mean that by having mWorld->stepSimulation(evt.timeSinceLastFrame); in both frameStarted and frameEnded make the bullet world step twice as fast as it should?

Thanks.