This is the source code for OgreNewt 2 tutorial.
Table of contents
OgreNewtApplication.h
#ifndef __OgreNewtApplication_h_ #define __OgreNewtTut_h_ #include "ExampleApplication.h" #include <OgreNewt.h> #include "OgreNewt_BasicFrameListener.h" class OgreNewtApplication : public ExampleApplication { public: OgreNewtApplication(void); ~OgreNewtApplication(void); void createScene(); void createFrameListener(void); void crazyCallback(OgreNewt::Body* body, float timeStep, int threadIndex ); private: OgreNewt::World *mWorld; }; #endif
OgreNewtApplication.cpp
#if OGRE_PLATFORM == OGRE_PLATFORM_WIN32 #define WIN32_LEAN_AND_MEAN #include "windows.h" #endif #include "OgreNewtApplication.h" OgreNewtApplication::OgreNewtApplication(void) { mWorld = new OgreNewt::World(); } OgreNewtApplication::~OgreNewtApplication(void) { delete mWorld; } void OgreNewtApplication::createScene() { Ogre::Light *light = mSceneMgr->createLight("main_light"); light->setPosition(0, 50, 0); light->setDiffuseColour(Ogre::ColourValue(1, 0.5, 0.5)); mSceneMgr->setAmbientLight(Ogre::ColourValue(0.5,0.5,0.5)); mCamera->setPosition(Ogre::Vector3(100,50,100)); mCamera->lookAt(0,0,0); Ogre::Vector3 size(100.0,5.0,100.0); Ogre::SceneNode* node = mSceneMgr->getRootSceneNode()->createChildSceneNode(); Ogre::Entity* ent = mSceneMgr->createEntity( "floorobj", "box.mesh" ); node->attachObject( ent ); node->setScale( size ); OgreNewt::CollisionPtr col( new OgreNewt::CollisionPrimitives::TreeCollision( mWorld, ent, true)); OgreNewt::Body* floorbody = new OgreNewt::Body( mWorld, col ); floorbody->attachNode(node); floorbody->setPositionOrientation( Ogre::Vector3(0,-5,0), Ogre::Quaternion::IDENTITY ); // BOX size = Ogre::Vector3( 5, 5, 5 ); node = mSceneMgr->getRootSceneNode()->createChildSceneNode(); ent = mSceneMgr->createEntity("box_body", "box.mesh" ); node->attachObject( ent ); node->setScale( size ); // rigid body. OgreNewt::CollisionPrimitives::Box *boxcol = new OgreNewt::CollisionPrimitives::Box(mWorld, size); col = OgreNewt::CollisionPtr(boxcol); OgreNewt::Body* bod = new OgreNewt::Body( mWorld, col ); bod->attachNode( node ); // initial position bod->setPositionOrientation( Ogre::Vector3(0,20,5), Ogre::Quaternion::IDENTITY ); Ogre::Real mass = 10.0; Ogre::Vector3 inertia, centerOfMass; boxcol->calculateInertialMatrix(inertia, centerOfMass); inertia*=mass; bod->setMassMatrix( mass, inertia ); bod->setCenterOfMass(centerOfMass); bod->setStandardForceCallback(); // CYLINDER // cylinder with a radius of 5.5, height of 10.3 size = Ogre::Vector3( 10.3, 5.5, 5.5 ); node = mSceneMgr->getRootSceneNode()->createChildSceneNode(); ent = mSceneMgr->createEntity("cylinder_body", "cylinder.mesh" ); node->attachObject( ent ); node->setScale( size ); // rigid body. OgreNewt::CollisionPrimitives::Cylinder *cylCol = new OgreNewt::CollisionPrimitives::Cylinder(mWorld, 5.5, 10.3); col = OgreNewt::CollisionPtr(cylCol); bod = new OgreNewt::Body( mWorld, col ); bod->attachNode( node ); // initial position bod->setPositionOrientation( Ogre::Vector3(20,15,15), Ogre::Quaternion(Ogre::Degree(45),Ogre::Vector3(1,1,0)) ); mass = 5.0; cylCol->calculateInertialMatrix(inertia, centerOfMass); inertia*=mass; bod->setMassMatrix( mass, inertia ); bod->setCenterOfMass(centerOfMass); bod->setStandardForceCallback(); // CONE // cone with a radius of 4.8, height of 5.0 size = Ogre::Vector3( 5.0, 4.8, 4.8 ); node = mSceneMgr->getRootSceneNode()->createChildSceneNode(); ent = mSceneMgr->createEntity("cone_body", "cone.mesh" ); node->attachObject( ent ); node->setScale( size ); // rigid body. OgreNewt::CollisionPrimitives::Cone *coneCol = new OgreNewt::CollisionPrimitives::Cone(mWorld, 4.8, 5.0); col = OgreNewt::CollisionPtr(coneCol); bod = new OgreNewt::Body( mWorld, col ); bod->attachNode( node ); // initial position bod->setPositionOrientation( Ogre::Vector3(0,26,5), Ogre::Quaternion(Ogre::Degree(45), Ogre::Vector3(1,0,0)) ); mass = 15.0; coneCol->calculateInertialMatrix(inertia, centerOfMass); inertia*=mass; bod->setMassMatrix( mass, inertia ); bod->setCenterOfMass(centerOfMass); bod->setStandardForceCallback(); // CONE // cone with a radius of 4.8, height of 10.0 size = Ogre::Vector3( 10.0, 4.8, 4.8 ); node = mSceneMgr->getRootSceneNode()->createChildSceneNode(); ent = mSceneMgr->createEntity("crazy_cone_body", "cone.mesh" ); node->attachObject( ent ); node->setScale( size ); // rigid body. coneCol = new OgreNewt::CollisionPrimitives::Cone(mWorld, 4.8, 5.0); col = OgreNewt::CollisionPtr(coneCol); bod = new OgreNewt::Body( mWorld, col ); bod->attachNode( node ); // initial position bod->setPositionOrientation( Ogre::Vector3(20,26,5), Ogre::Quaternion::IDENTITY ); mass = 20.0; coneCol->calculateInertialMatrix(inertia, centerOfMass); inertia*=mass; bod->setMassMatrix( mass, inertia ); bod->setCenterOfMass(centerOfMass); bod->setCustomForceAndTorqueCallback<OgreNewtApplication>(&OgreNewtApplication::crazyCallback, this); } void OgreNewtApplication::createFrameListener() { mFrameListener = new ExampleFrameListener( mWindow, mCamera ); mRoot->addFrameListener( mFrameListener ); OgreNewt::BasicFrameListener* mOgreNewtListener; mOgreNewtListener = new OgreNewt::BasicFrameListener( mWindow, mWorld ); mRoot->addFrameListener( mOgreNewtListener ); } void OgreNewtApplication::crazyCallback(OgreNewt::Body *body, float timeStep, int threadIndex) { Ogre::Vector3 force(0,10,0), pointToApply(4,4,4); body->addLocalForce(force, pointToApply); } #if OGRE_PLATFORM == OGRE_PLATFORM_WIN32 INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR strCmdLine, INT ) #else int main(int argc, char *argv[]) #endif { // Create application object OgreNewtApplication app; try { app.go(); } catch( Ogre::Exception& e ) { #if OGRE_PLATFORM == OGRE_PLATFORM_WIN32 MessageBox( NULL, e.getFullDescription().c_str(), "An exception has occured!", MB_OK | MB_ICONERROR | MB_TASKMODAL); #else std::cerr << "An exception has occured: " << e.getFullDescription().c_str() << std::endl; #endif } return 0; }