Top Banner
PhysX
39

PhysX. Kezdeti teendők Letöltés: OgrePhysicsBase.zip Kicsomagol Futtat: OgrePhysics.sln Include és library útvonalak beállítása Working directory beállítása.

Apr 01, 2015

Download

Documents

Martha Corns
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: PhysX. Kezdeti teendők Letöltés: OgrePhysicsBase.zip Kicsomagol Futtat: OgrePhysics.sln Include és library útvonalak beállítása Working directory beállítása.

PhysX

Page 2: PhysX. Kezdeti teendők Letöltés: OgrePhysicsBase.zip Kicsomagol Futtat: OgrePhysics.sln Include és library útvonalak beállítása Working directory beállítása.

Kezdeti teendőkLetöltés: OgrePhysicsBase.zipKicsomagolFuttat: OgrePhysics.slnInclude és library útvonalak beállításaWorking directory beállításaFordítFuttat

Page 3: PhysX. Kezdeti teendők Letöltés: OgrePhysicsBase.zip Kicsomagol Futtat: OgrePhysics.sln Include és library útvonalak beállítása Working directory beállítása.
Page 4: PhysX. Kezdeti teendők Letöltés: OgrePhysicsBase.zip Kicsomagol Futtat: OgrePhysics.sln Include és library útvonalak beállítása Working directory beállítása.

#include "Ogre.h"#define OIS_DYNAMIC_LIB#include <OIS/OIS.h>

using namespace Ogre;

Root* ogreRoot;SceneManager* sceneManager;Camera* camera;RenderWindow* renderWindow;OIS::InputManager* OISInputManager;SceneNode* box1Node;SceneNode* box2Node;SceneNode* box3Node;

Page 5: PhysX. Kezdeti teendők Letöltés: OgrePhysicsBase.zip Kicsomagol Futtat: OgrePhysics.sln Include és library útvonalak beállítása Working directory beállítása.

createGround();

SceneNode* rootNode = sceneManager->getRootSceneNode();box1Node = rootNode->createChildSceneNode();Entity* box1 = sceneManager->createEntity("box1", "doboz.mesh");box1Node->attachObject(box1);box1Node->setScale(10,10,10);box1Node->setPosition(0,10,0);

box2Node = rootNode->createChildSceneNode();Entity* box2 = sceneManager->createEntity("box2", "doboz.mesh");box2Node->attachObject(box2);box2Node->setScale(15,15,15);box2Node->setPosition(5,30,0);

box3Node = rootNode->createChildSceneNode();Entity* box3 = sceneManager->createEntity("box3", "doboz.mesh");box3Node->attachObject(box3);box3Node->setScale(5,5,5);box3Node->setPosition(-2,50,5);

sceneManager->setSkyBox(true, "Sky", 10, true);

Page 6: PhysX. Kezdeti teendők Letöltés: OgrePhysicsBase.zip Kicsomagol Futtat: OgrePhysics.sln Include és library útvonalak beállítása Working directory beállítása.

Próba

Page 7: PhysX. Kezdeti teendők Letöltés: OgrePhysicsBase.zip Kicsomagol Futtat: OgrePhysics.sln Include és library útvonalak beállítása Working directory beállítása.

class PhysicsHandler;PhysicsHandler* physicsHandler;class PhysicsHandler: public FrameListener{

public:

PhysicsHandler (){

}~PhysicsHandler (){

}bool frameStarted(const FrameEvent& evt){

return true;}

};

class ControlDeviceHandler : public FrameListener

void setupListeners(){

ogreRoot->addFrameListener(new ControlDeviceHandler());physicsHandler = new PhysicsHandler();ogreRoot->addFrameListener(physicsHandler);

}

Page 8: PhysX. Kezdeti teendők Letöltés: OgrePhysicsBase.zip Kicsomagol Futtat: OgrePhysics.sln Include és library útvonalak beállítása Working directory beállítása.

Bullet Physics-hez mi kell indulásképpen?#include "btBulletDynamicsCommon.h"

Include path beállítása: ..\BulletSDK_vc10\include

Library path beállítása: ..\BulletSDK_vc10\src\lib

Library megadása : • LinearMath_vs2010_debug.lib• BulletCollision_vs2010_debug.lib• BulletDynamics_vs2010_debug.lib

Próba… fordul-e?

Page 9: PhysX. Kezdeti teendők Letöltés: OgrePhysicsBase.zip Kicsomagol Futtat: OgrePhysics.sln Include és library útvonalak beállítása Working directory beállítása.

class PhysicsHandler : public FrameListener{protected: bool inited; btDiscreteDynamicsWorld * dynamicsWorld;public:

PhysicsHandler(){

inited = false; //collision configuration contains default setup for memory , collision setup. //Advanced users can create their oconfiguration . btDefaultCollisionConfiguration* collisionConfiguration = new

btDefaultCollisionConfiguration(); //use the default collision dispatcher. //For parallel processing you can use a diffent dispatcher ( see Extras/BulletMultiThreaded ) btCollisionDispatcher* dispatcher = new btCollisionDispatcher(collisionConfiguration); //btDbvtBoadphase is a good general purpose broadphase . You can also try out btAxis3Sweep . btBroadphaseInterface * overlappingPairCache = new btDbvtBroadphase(); //the default constraint solver. //For parallel processing you can use a different solver (see Extras/BulletMultiThreaded) btSequentialImpulseConstraintSolver * solver = new btSequentialImpulseConstraintSolver; dynamicsWorld = new btDiscreteDynamicsWorld ( dispatcher, overlappingPairCache, solver, collisionConfiguration); dynamicsWorld->setGravity(btVector3(0 , -100 ,0));

inited = true;}

Page 10: PhysX. Kezdeti teendők Letöltés: OgrePhysicsBase.zip Kicsomagol Futtat: OgrePhysics.sln Include és library útvonalak beállítása Working directory beállítása.

Szimulációbool frameStarted(const FrameEvent& evt){

if(!inited)return true;

dynamicsWorld->stepSimulation(evt.timeSinceLastFrame, 7);

return true;}

Próba… fordul-e, fut-e?

Page 11: PhysX. Kezdeti teendők Letöltés: OgrePhysicsBase.zip Kicsomagol Futtat: OgrePhysics.sln Include és library útvonalak beállítása Working directory beállítása.

class PhysicsHandler : public FrameListener{protected:.. btCollisionShape* groundShape; btDefaultMotionState* groundMotionState; btRigidBody* groundRigidBody;public:

PhysicsHandler(){

... dynamicsWorld->setGravity(btVector3(0 , -100 ,0));

groundShape = new btStaticPlaneShape(btVector3(0,1,0), 0); groundMotionState = new

btDefaultMotionState(btTransform(btQuaternion(0,0,0,1),btVector3(0,0,0))); btRigidBody::btRigidBodyConstructionInfo groundRigidBodyCI(0,groundMotionState,groundShape,btVector3(0,0,0)); btRigidBody* groundRigidBody = new btRigidBody(groundRigidBodyCI); dynamicsWorld->addRigidBody(groundRigidBody);

inited = true;}

Próba… fordul-e, fut-e?

Page 12: PhysX. Kezdeti teendők Letöltés: OgrePhysicsBase.zip Kicsomagol Futtat: OgrePhysics.sln Include és library útvonalak beállítása Working directory beállítása.

class PhysicsHandler : public FrameListener{protected:.. btCollisionShape* groundShape; btDefaultMotionState* groundMotionState; btRigidBody* groundRigidBody;public:

PhysicsHandler(){

... dynamicsWorld->setGravity(btVector3(0 , -100 ,0));

groundShape = new btStaticPlaneShape(btVector3(0,1,0), 0); groundMotionState = new

btDefaultMotionState(btTransform(btQuaternion(0,0,0,1),btVector3(0,0,0))); btRigidBody::btRigidBodyConstructionInfo groundRigidBodyCI(0,groundMotionState,groundShape,btVector3(0,0,0)); btRigidBody* groundRigidBody = new btRigidBody(groundRigidBodyCI); dynamicsWorld->addRigidBody(groundRigidBody);

inited = true;}

Próba… fordul-e, fut-e?

Page 13: PhysX. Kezdeti teendők Letöltés: OgrePhysicsBase.zip Kicsomagol Futtat: OgrePhysics.sln Include és library útvonalak beállítása Working directory beállítása.

class PhysXBoxObject{protected: SceneNode* ogreNode; btRigidBody* physicsBody; btCollisionShape* physicsShape; btDefaultMotionState* physicsMotionState;public: PhysXBoxObject(SceneNode* ogreNode, btDiscreteDynamicsWorld*

dynamicsWorld) { this->ogreNode = ogreNode; physicsShape = new btBoxShape( btVector3(btScalar(ogreNode->getScale().x * 0.5), btScalar(ogreNode->getScale().y * 0.5), btScalar(ogreNode->getScale().z * 0.5))); physicsMotionState = new btDefaultMotionState(btTransform(btQuaternion(0,0,0,1), btVector3(ogreNode->getPosition().x, ogreNode->getPosition().y, ogreNode->getPosition().z))); btScalar mass = 1; btVector3 inertia(0,0,0); physicsShape->calculateLocalInertia(mass,inertia); btRigidBody::btRigidBodyConstructionInfo rigidBodyCI(mass, physicsMotionState, physicsShape, inertia); physicsBody = new btRigidBody(rigidBodyCI); dynamicsWorld->addRigidBody(physicsBody); }};

Page 14: PhysX. Kezdeti teendők Letöltés: OgrePhysicsBase.zip Kicsomagol Futtat: OgrePhysics.sln Include és library útvonalak beállítása Working directory beállítása.

class PhysicsHandler : public FrameListener{protected:

...PhysXBoxObject* boxes[3];

public:PhysicsHandler(){…

dynamicsWorld->addRigidBody(groundRigidBody);

boxes[0] = new PhysXBoxObject(box1Node, dynamicsWorld); boxes[1] = new PhysXBoxObject(box2Node, dynamicsWorld); boxes[2] = new PhysXBoxObject(box3Node, dynamicsWorld);

inited = true;}

Page 15: PhysX. Kezdeti teendők Letöltés: OgrePhysicsBase.zip Kicsomagol Futtat: OgrePhysics.sln Include és library útvonalak beállítása Working directory beállítása.

class PhysXBoxObject{public:

void update(){

btTransform worldTrans; physicsMotionState->getWorldTransform(worldTrans); btQuaternion rot = worldTrans.getRotation(); ogreNode->setOrientation(rot.w(), rot.x(), rot.y(), rot.z()); ogreNode->setPosition(worldTrans.getOrigin().x(), worldTrans.getOrigin().y(), worldTrans.getOrigin().z());

}

Page 16: PhysX. Kezdeti teendők Letöltés: OgrePhysicsBase.zip Kicsomagol Futtat: OgrePhysics.sln Include és library útvonalak beállítása Working directory beállítása.

Próba

class PhysicsHandler : public FrameListener{…

bool frameStarted(const FrameEvent& evt){

...

boxes[0]->update();boxes[1]->update();boxes[2]->update();

return true;}

Page 17: PhysX. Kezdeti teendők Letöltés: OgrePhysicsBase.zip Kicsomagol Futtat: OgrePhysics.sln Include és library útvonalak beállítása Working directory beállítása.

class PhysXBallObject{protected:SceneNode* ogreNode;btRigidBody* physicsBody;btCollisionShape* physicsShape; btDefaultMotionState* physicsMotionState;public:

PhysXBallObject(SceneNode* ogreNode, btDiscreteDynamicsWorld* dynamicsWorld){this->ogreNode = ogreNode; physicsShape = new btSphereShape(btScalar(3)); physicsMotionState = new btDefaultMotionState(btTransform(btQuaternion(0,0,0,1), btVector3(camera->getPosition().x, camera->getPosition().y, camera->getPosition().z))); btScalar mass = 1; btVector3 inertia(0,0,0); physicsShape->calculateLocalInertia(mass, inertia); btRigidBody::btRigidBodyConstructionInfo rigidBodyCI(mass, physicsMotionState, physicsShape, inertia); physicsBody = new btRigidBody(rigidBodyCI); dynamicsWorld->addRigidBody(physicsBody); physicsBody->applyCentralImpulse(btVector3(camera->getDirection().x * 200, camera->getDirection().y * 200, camera->getDirection().z * 200)); }void update(){ btTransform worldTrans; physicsMotionState->getWorldTransform(worldTrans); btQuaternion rot = worldTrans.getRotation(); ogreNode->setOrientation(rot.w(), rot.x(), rot.y(), rot.z()); ogreNode->setPosition(worldTrans.getOrigin().x(), worldTrans.getOrigin().y(), worldTrans.getOrigin().z());}};

Page 18: PhysX. Kezdeti teendők Letöltés: OgrePhysicsBase.zip Kicsomagol Futtat: OgrePhysics.sln Include és library útvonalak beállítása Working directory beállítása.

class PhysicsHandler : public FrameListener{protected:

…std::vector<PhysXBallObject*> balls;

public:void addBall(SceneNode* ogreNode){

balls.push_back(new PhysXBallObject(ogreNode, mPhysicsScene));}bool frameStarted(const FrameEvent& evt){

…boxes[0]->update();boxes[1]->update();boxes[2]->update();

std::vector<PhysXBallObject*>::iterator it = balls.begin();std::vector<PhysXBallObject*>::iterator itend = balls.end();while(it != itend){

(*it)->update();it++;

}

return true;}

Page 19: PhysX. Kezdeti teendők Letöltés: OgrePhysicsBase.zip Kicsomagol Futtat: OgrePhysics.sln Include és library útvonalak beállítása Working directory beállítása.

void addBall(){

static int id = 0;SceneNode* ballNode = sceneManager->getRootSceneNode()->createChildSceneNode();Entity *ballEnt = sceneManager->createEntity("ball"+StringConverter::toString(id),"strippedBall.mesh");ballNode->attachObject(ballEnt);ballNode->setScale(3,3,3);physicsHandler->addBall(ballNode);id++;

}

class ControlDeviceHandler : public FrameListener...

Page 20: PhysX. Kezdeti teendők Letöltés: OgrePhysicsBase.zip Kicsomagol Futtat: OgrePhysics.sln Include és library útvonalak beállítása Working directory beállítása.

class ControlDeviceHandler : public FrameListener{…bool frameStarted(const FrameEvent& evt)

{if( mKeyboard->isKeyDown(OIS::KC_SPACE) &&

mTimeUntilNextToggle < 0){

addBall();mTimeUntilNextToggle = 0.5f;

}…

Page 21: PhysX. Kezdeti teendők Letöltés: OgrePhysicsBase.zip Kicsomagol Futtat: OgrePhysics.sln Include és library útvonalak beállítása Working directory beállítása.

Próba

Page 22: PhysX. Kezdeti teendők Letöltés: OgrePhysicsBase.zip Kicsomagol Futtat: OgrePhysics.sln Include és library útvonalak beállítása Working directory beállítása.

Statikus ActorPhysXBoxObject(SceneNode* ogreNode,

btDiscreteDynamicsWorld* dynamicsWorld){... btScalar mass = 0;…

Ekkor az update függvényre sincs szükség!!

Page 23: PhysX. Kezdeti teendők Letöltés: OgrePhysicsBase.zip Kicsomagol Futtat: OgrePhysics.sln Include és library útvonalak beállítása Working directory beállítása.

Utána állítsuk vissza dynamic actor-ra (mass != 0)!!

Page 24: PhysX. Kezdeti teendők Letöltés: OgrePhysicsBase.zip Kicsomagol Futtat: OgrePhysics.sln Include és library útvonalak beállítása Working directory beállítása.

PhysXBallObject:... physicsBody = new btRigidBody(rigidBodyCI); physicsBody->setDamping(0.1, 0.3); physicsBody->setRestitution(0.6);

PhysicsHandler:... btRigidBody* groundRigidBody = new btRigidBody(groundRigidBodyCI); groundRigidBody->setRestitution(1.0);

Próba…lehet más értékekkel is próbálkozni ...

Page 25: PhysX. Kezdeti teendők Letöltés: OgrePhysicsBase.zip Kicsomagol Futtat: OgrePhysics.sln Include és library útvonalak beállítása Working directory beállítása.

Animáció//globális változóSceneNode* hammerNode;

class AnimController : public FrameListener{public:

bool frameStarted(const FrameEvent& evt){

hammerNode->rotate(Vector3::UNIT_Y, Radian(evt.timeSinceLastFrame * 2.0f));

return true;}

};

void setupListeners(){

ogreRoot->addFrameListener(new AnimController());…}

Page 26: PhysX. Kezdeti teendők Letöltés: OgrePhysicsBase.zip Kicsomagol Futtat: OgrePhysics.sln Include és library útvonalak beállítása Working directory beállítása.

void setupScene(){

hammerNode = rootNode->createChildSceneNode();SceneNode* tempNode = hammerNode->createChildSceneNode();Entity* hammer = sceneManager->createEntity("hammer", "TrollMace.mesh");tempNode->attachObject(hammer);tempNode->rotate(Vector3::UNIT_X,Radian(Degree(90)));hammerNode->setScale(30,30,30);hammerNode->setPosition(0,5,30);

}

Page 27: PhysX. Kezdeti teendők Letöltés: OgrePhysicsBase.zip Kicsomagol Futtat: OgrePhysics.sln Include és library útvonalak beállítása Working directory beállítása.

Próba

Page 28: PhysX. Kezdeti teendők Letöltés: OgrePhysicsBase.zip Kicsomagol Futtat: OgrePhysics.sln Include és library útvonalak beállítása Working directory beállítása.

class PhysXHammerObject{protected: SceneNode* ogreNode; btRigidBody* physicsBody; btCollisionShape* physicsCompoundShape; btCollisionShape* physicsHeadShape; btCollisionShape* physicsHandleShape; btDefaultMotionState* physicsMotionState;public: PhysXHammerObject(SceneNode* ogreNode, btDiscreteDynamicsWorld* dynamicsWorld) { this->ogreNode = ogreNode; physicsHeadShape = new btBoxShape(btVector3(ogreNode->getScale().x

*0.25f, ogreNode->getScale().y * 0.25 * 0.5f, ogreNode->getScale().z * 0.25 * 0.5f)); physicsHandleShape = new btBoxShape(btVector3( ogreNode->getScale().x * 0.5f * 0.1f, ogreNode->getScale().y * 0.5f, ogreNode->getScale().z * 0.5f * 0.1f)); btCompoundShape* allShapes = new btCompoundShape(); physicsCompoundShape = allShapes; allShapes->addChildShape(btTransform(btQuaternion(0,0,0,1), btVector3(0,ogreNode->getScale().y * 0.865f,0)), physicsHeadShape); allShapes->addChildShape(btTransform(btQuaternion(0,0,0,1), btVector3(0,ogreNode->getScale().y * 0.5,0)), physicsHandleShape);...

Page 29: PhysX. Kezdeti teendők Letöltés: OgrePhysicsBase.zip Kicsomagol Futtat: OgrePhysics.sln Include és library útvonalak beállítása Working directory beállítása.

... physicsMotionState = new btDefaultMotionState(btTransform(btQuaternion(0,0,0,1), btVector3(camera->getPosition().x,

camera->getPosition().y, camera->getPosition().z)));

btScalar mass = 1; btVector3 inertia(0,0,0); physicsCompoundShape->calculateLocalInertia(mass, inertia); btRigidBody::btRigidBodyConstructionInfo rigidBodyCI(mass, physicsMotionState, physicsCompoundShape, inertia); physicsBody = new btRigidBody(rigidBodyCI); dynamicsWorld->addRigidBody(physicsBody); physicsBody->setCollisionFlags( physicsBody->getCollisionFlags() | btCollisionObject::CF_KINEMATIC_OBJECT); physicsBody->setActivationState(DISABLE_DEACTIVATION); }...

Page 30: PhysX. Kezdeti teendők Letöltés: OgrePhysicsBase.zip Kicsomagol Futtat: OgrePhysics.sln Include és library útvonalak beállítása Working directory beállítása.

void update(){

SceneNode* tempNode = ((SceneNode*) ogreNode->getChild(0)); Vector3 pos = tempNode->_getDerivedPosition(); Quaternion orient = tempNode->_getDerivedOrientation();

btTransform worldTrans; worldTrans.setRotation(btQuaternion(orient.x,orient.y,orient.z,orient.w)); worldTrans.setOrigin(btVector3(pos.x, pos.y, pos.z)); physicsMotionState->setWorldTransform(worldTrans);

}};

class PhysicsHandler : public FrameListener{protected:

PhysXHammerObject* hammer;…

PhysicsHandler(){

…hammer = new PhysXHammerObject(hammerNode, dynamicsWorld);

}bool frameStarted(const FrameEvent& evt){

…hammer->update();

}

Page 31: PhysX. Kezdeti teendők Letöltés: OgrePhysicsBase.zip Kicsomagol Futtat: OgrePhysics.sln Include és library útvonalak beállítása Working directory beállítása.

Próba

Page 32: PhysX. Kezdeti teendők Letöltés: OgrePhysicsBase.zip Kicsomagol Futtat: OgrePhysics.sln Include és library útvonalak beállítása Working directory beállítása.

Önálló (otthoni) feladat

Kamera köré egy kinematikus Actor-t.Lehessen löködni a dobozokat.

Page 33: PhysX. Kezdeti teendők Letöltés: OgrePhysicsBase.zip Kicsomagol Futtat: OgrePhysics.sln Include és library útvonalak beállítása Working directory beállítása.

class Explosive{public:

Explosive(SceneManager* sceneManager, btDiscreteDynamicsWorld* dynamicsWorld){static int id = 0;

float a = Math::RangeRandom(0, 360);float d = Math::RangeRandom(50, 120);float x = Math::Cos(a) * d;float z = Math::Sin(a) * d;

SceneNode* node = sceneManager->getRootSceneNode()->createChildSceneNode();Entity* entity = sceneManager->createEntity("explosive"+StringConverter::toString(id),"explosive.mesh");node->attachObject(entity);node->setScale(10,10,10);node->setPosition(x,0,z);

id++;}

};

Page 34: PhysX. Kezdeti teendők Letöltés: OgrePhysicsBase.zip Kicsomagol Futtat: OgrePhysics.sln Include és library útvonalak beállítása Working directory beállítása.

void setupExplosives()

{

for(int i = 0; i <8; i ++)

new Explosive(sceneManager, physicsHandler->getWorld());

}

int _tmain(int argc, _TCHAR* argv[])

{

setupScene();

setupListeners();

setupExplosives();

}

class PhysicsHandler : public FrameListener{…public:

btDiscreteDynamicsWorld* getWorld() { return dynamicsWorld; }…

Page 35: PhysX. Kezdeti teendők Letöltés: OgrePhysicsBase.zip Kicsomagol Futtat: OgrePhysics.sln Include és library útvonalak beállítása Working directory beállítása.

Próba

Page 36: PhysX. Kezdeti teendők Letöltés: OgrePhysicsBase.zip Kicsomagol Futtat: OgrePhysics.sln Include és library útvonalak beállítása Working directory beállítása.

protected:

btRigidBody* physicsBody;

btCollisionShape* physicsShape;

btDefaultMotionState* physicsMotionState;

public:

Explosive(SceneManager* sceneManager, NxScene* physXScene)

{

node->setPosition(x,0,z);

physicsShape = new btBoxShape(btVector3(2.5,5,2.5));

physicsMotionState =

new btDefaultMotionState(btTransform(btQuaternion(0,0,0,1),

btVector3(x,5,z)));

Page 37: PhysX. Kezdeti teendők Letöltés: OgrePhysicsBase.zip Kicsomagol Futtat: OgrePhysics.sln Include és library útvonalak beállítása Working directory beállítása.

btScalar mass = 0; btVector3 inertia(0,0,0); physicsShape->calculateLocalInertia(mass,inertia); btRigidBody::btRigidBodyConstructionInfo rigidBodyCI(mass, physicsMotionState, physicsShape, inertia); physicsBody = new btRigidBody(rigidBodyCI); dynamicsWorld->addRigidBody(physicsBody);

physicsBody->setCollisionFlags(physicsBody->getCollisionFlags() | btCollisionObject::CF_CUSTOM_MATERIAL_CALLBACK); physicsBody->setCollisionFlags(physicsBody->getCollisionFlags() | btCollisionObject::CF_NO_CONTACT_RESPONSE); if(id == 0) gContactProcessedCallback = globalTriggerCallback;

id++;}

Page 38: PhysX. Kezdeti teendők Letöltés: OgrePhysicsBase.zip Kicsomagol Futtat: OgrePhysics.sln Include és library útvonalak beállítása Working directory beállítása.

Trigger report//Globális függvénybool globalTriggerCallback(btManifoldPoint& cp, void* body0, void* body1) { btRigidBody* rigidbody0 = (btRigidBody*)body0; btRigidBody* rigidbody1 = (btRigidBody*)body1; if(!(rigidbody0->getCollisionFlags() &

btCollisionObject::CF_CUSTOM_MATERIAL_CALLBACK) && !(rigidbody1->getCollisionFlags() &

btCollisionObject::CF_CUSTOM_MATERIAL_CALLBACK)) return true;

static int cnt = 0; printf("Trigger Callback %i !!!!\n", cnt++);

float f = 100; btVector3 force(Math::RangeRandom(-f, f),Math::RangeRandom(0, 5 *

f),Math::RangeRandom(-f, f)); rigidbody0->applyCentralImpulse(force); rigidbody1->applyCentralImpulse(force);

return true; }

Page 39: PhysX. Kezdeti teendők Letöltés: OgrePhysicsBase.zip Kicsomagol Futtat: OgrePhysics.sln Include és library útvonalak beállítása Working directory beállítása.

Próba