Page 1 of 1

collision

Posted: Thu Jun 02, 2005 6:52 am
by tivi
Hi,

I´m really a beginner with Irrlicht and I´m sure it must be easy to solve my problem, but I don´t know how to use collision with more than one object. Here´s my code:

Code: Select all

int main()
{
	IrrlichtDevice *device = createDevice(EDT_DIRECTX9,dimension2d<s32>(640,480),16,false,false,false,0);
	device->setWindowCaption(L"Test");

	IVideoDriver* driver = device->getVideoDriver();
	ISceneManager* smgr = device->getSceneManager();

	IAnimatedMesh* mesh = smgr->getMesh("level\\tst.my3d");
	IAnimatedMeshSceneNode* node = smgr->addAnimatedMeshSceneNode( mesh );
	ISceneNode* scene = smgr->addOctTreeSceneNode(mesh->getMesh(0));

	IAnimatedMesh* sphere = smgr->getMesh("level\\sph.my3d"); 
	node = smgr->addAnimatedMeshSceneNode( sphere );
	scene = smgr->addOctTreeSceneNode(sphere->getMesh(0));

	ITriangleSelector* selector = 0;

	if (node)
	{
		node->setMaterialFlag(EMF_LIGHTING, true);

		selector = smgr->createOctTreeTriangleSelector(mesh->getMesh(0),node,64);
		node->setTriangleSelector( selector );
		selector->drop();

	}
	
	ICameraSceneNode* cam = smgr->addCameraSceneNodeFPS(0,50.0f,30.0f);
	device->getCursorControl()->setVisible(false);
	cam->setPosition(vector3df(0,300,0));

	ISceneNodeAnimator* coll = smgr->createCollisionResponseAnimator(selector,
																	 cam,
																	 vector3df(5,13,5),
																	 vector3df(0,-30.0f,0),
																	 vector3df(0,13,0));
	cam->addAnimator(coll);
	coll->drop();


	while ( device->run())
	{
		driver->beginScene(true,true,SColor(0,50,50,50));

		smgr->drawAll();

		driver->endScene();
	}
	device->drop();


	return 0;
}
I can load both objects but creating a second Triangleselector crashes the program. I hope my question is not too stupid, but I don´t know what to do.
Please help me and sorry for my bad english.

Tom

Posted: Thu Jun 02, 2005 12:23 pm
by Pax
Hi, are you sure you can load your 2 objects with that path? (I couldn't, and i think that might be your crash problem)

For multiple collisions look for the threads from EtCaptor (explanation) and Gromito (sample code).

Code: Select all

...
IVideoDriver* driver = device->getVideoDriver();
   ISceneManager* smgr = device->getSceneManager();
   
   IMetaTriangleSelector* selector = 0;
   selector= smgr->createMetaTriangleSelector();

   IAnimatedMesh* mesh = smgr->getMesh("level1/tst.my3d");
   IAnimatedMeshSceneNode* level1_node = smgr->addAnimatedMeshSceneNode( mesh );
   ISceneNode* scene = smgr->addOctTreeSceneNode(mesh->getMesh(0));
   ITriangleSelector *level1selector= smgr ->createOctTreeTriangleSelector(mesh ->
                     getMesh(0), level1_node, 128);
   selector -> addTriangleSelector(level1selector);
   level1selector -> drop();


   IAnimatedMesh* sphere = smgr->getMesh("level2/sph.my3d");
   IAnimatedMeshSceneNode* level2_node = smgr->addAnimatedMeshSceneNode( sphere );
   //node = smgr->addAnimatedMeshSceneNode( sphere );
   ISceneNode* level2 = smgr->addOctTreeSceneNode(sphere->getMesh(0));
   ITriangleSelector *level2selector= smgr ->createOctTreeTriangleSelector(sphere ->
                     getMesh(0), level2_node, 128);
   selector -> addTriangleSelector(level2selector);
   level2selector -> drop();   



//   ITriangleSelector* selector = 0;

   if (level1_node)
   {
      level1_node->setMaterialFlag(EMF_LIGHTING, true);
   }
   
   ICameraSceneNode* cam = smgr->addCameraSceneNodeFPS(0,50.0f,30.0f);
   device->getCursorControl()->setVisible(false);
   cam->setPosition(vector3df(0,300,0));
...

Posted: Fri Jun 03, 2005 10:54 am
by tivi
Hi,

Many thanks for your code, this solves my problem.
I will look at the examples you mentioned.

"path\\file" don´t work for you? I have no problems loading my 3d objects this way.
the other way to load the files works too.
I´m using VC++ 6.0 with SP5

cheers,
Tom