collision between object and object

If you are a new Irrlicht Engine user, and have a newbie-question, this is the forum for you. You may also post general programming questions here.
Post Reply
golf
Posts: 4
Joined: Thu May 11, 2006 5:01 am

collision between object and object

Post by golf »

:? I don't know use function metatriangleseloctor for collision between object(soldier.md2) and object(faerie.md2) but I can check collision camera and each object.I will write code with metatriangle?
sorry my english.Please Help!

My CODE:
#include <irrlicht.h>
#include <iostream>
#include <stdio.h>
#include <conio.h>
#include <windows.h>
#include <math.h>
#include <mmsystem.h>
#include <audiere.h>

using namespace irr;
using namespace audiere;

using namespace core;
using namespace scene;
using namespace video;
using namespace io;
using namespace gui;


#pragma comment(lib, "Irrlicht.lib")
#pragma comment(lib, "audiere.lib")

scene::IAnimatedMeshSceneNode* bnode = 0;

class MyEventReceiver : public IEventReceiver
{

public:

virtual bool OnEvent(SEvent event) {
if (event.EventType == EET_KEY_INPUT_EVENT) {
switch(event.KeyInput.Key) {
case KEY_KEY_R:
if (event.KeyInput.PressedDown) {
bnode->setMD2Animation(irr::scene::EMAT_RUN);
} else {
bnode->setMD2Animation(irr::scene::EMAT_STAND);
}
break;
case KEY_KEY_J:
if(event.KeyInput.PressedDown){
bnode->setMD2Animation(irr::scene::EMAT_JUMP);
}
else{
bnode->setFrameLoop(0,310);
}
break;

case KEY_SPACE :
if(event.KeyInput.PressedDown){
bnode->setFrameLoop(400, 500);
}
break;

case KEY_KEY_Y:
{
core::vector3df r = bnode->getRotation();
if (r.Y == 360)
r.Y=0.0f;
else
r.Y += 10.0f;
bnode->setRotation(r);
}
break;

case KEY_KEY_H:
{
core::vector3df r = bnode->getRotation();
if (r.Y == 360)
r.Y=0.0f;
else
r.Y -= 10.0f;
bnode->setRotation(r);
}
break;

case KEY_KEY_W:
{
core::vector3df pos = bnode->getPosition();
pos.Z+=5.0f;
bnode->setPosition(pos);
}
break;

case KEY_KEY_S:
{
core::vector3df pos = bnode->getPosition();
pos.Z-=5.0f;
bnode->setPosition(pos);
}
break;

case KEY_KEY_A:
{
core::vector3df pos = bnode->getPosition();
pos.X-=5.0f;
bnode->setPosition(pos);
}
break;

case KEY_KEY_D:
{
core::vector3df pos = bnode->getPosition();
pos.X+=5.0f;
bnode->setPosition(pos);
}
break;

return true;
}
return false;
}
}
};

int main(char ** args)
{
// let user select driver type

MyEventReceiver receiver;

video::E_DRIVER_TYPE driverType;

printf("Please select the driver you want for this example:\n"\
" (a) Direct3D 9.0c\n (b) Direct3D 8.1\n (c) OpenGL 1.5\n"\
" (d) Software Renderer\n (e) Apfelbaum Software Renderer\n"\
" (f) NullDevice\n (otherKey) exit\n\n");

char i;
std::cin >> i;

switch(i)
{
case 'a': driverType = video::EDT_DIRECT3D9;break;
case 'b': driverType = video::EDT_DIRECT3D8;break;
case 'c': driverType = video::EDT_OPENGL; break;
case 'd': driverType = video::EDT_SOFTWARE; break;
case 'e': driverType = video::EDT_SOFTWARE2;break;
case 'f': driverType = video::EDT_NULL; break;
default: return 0;
}

// create device

IrrlichtDevice *device =
createDevice(driverType, core::dimension2d<s32>(640, 480), 16, false, false, false, &receiver);

if (device == 0)
return 1; // could not create selected driver.

video::IVideoDriver* driver = device->getVideoDriver();
scene::ISceneManager* smgr = device->getSceneManager();
IGUIEnvironment* guienv = device->getGUIEnvironment();

/*
We add a hello world label to the window, using the GUI environment.
*/
guienv->addStaticText(L"Hello World! This is the Irrlicht Apfelbaum Software renderer!",
rect<int>(10,10,260,22), true);

device->getFileSystem()->addZipFileArchive("map-20kdm2.pk3");


scene::IAnimatedMesh* q3levelmesh = smgr->getMesh("20kdm2.bsp");
scene::ISceneNode* q3node = 0;

/*import music MP3 file*/
AudioDevicePtr devices(OpenDevice());
OutputStreamPtr sound(OpenSound(devices,"06 Sasakure.mp3",false));

sound->setVolume(5.0);
sound->play();
sound->setRepeat(true);

if (q3levelmesh)
q3node = smgr->addOctTreeSceneNode(q3levelmesh->getMesh(0));

scene::ITriangleSelector* selector = 0;

if (q3node)
{
q3node->setPosition(core::vector3df(-1370,-130,-1400));

selector = smgr->createOctTreeTriangleSelector(q3levelmesh->getMesh(0), q3node, 128);
q3node->setTriangleSelector(selector);
selector->drop();
}

scene::ICameraSceneNode* camera =
smgr->addCameraSceneNodeFPS(0, 100.0f, 300.0f, -1, 0, 0, true);
camera->setPosition(core::vector3df(-100,50,-150));

scene::ISceneNodeAnimator* anim = smgr->createCollisionResponseAnimator(
selector, camera, core::vector3df(30,50,30),
core::vector3df(0,-3,0),
core::vector3df(0,50,0));
camera->addAnimator(anim);
anim->drop();

device->getCursorControl()->setVisible(false);

// add 3 animated faeries.

video::SMaterial material;
material.Texture1 = driver->getTexture("faerie2.bmp");
material.Lighting = true;

scene::IAnimatedMeshSceneNode* node = 0;
scene::IAnimatedMesh* faerie = smgr->getMesh("faerie.md2");

if (faerie)
{
node = smgr->addAnimatedMeshSceneNode(faerie);
node->setPosition(core::vector3df(-70,0,-90));
node->setScale(core::vector3df(3,3,3));
node->setMD2Animation(scene::EMAT_RUN);
node->getMaterial(0) = material;

node = smgr->addAnimatedMeshSceneNode(faerie);
node->setPosition(core::vector3df(-70,0,-30));
node->setScale(core::vector3df(3,3,3));
node->setMD2Animation(scene::EMAT_SALUTE);
node->getMaterial(0) = material;

node = smgr->addAnimatedMeshSceneNode(faerie);
node->setPosition(core::vector3df(-70,0,-60));
node->setScale(core::vector3df(3,3,3));
node->setMD2Animation(scene::EMAT_JUMP);
node->getMaterial(0) = material;

}

material.Texture1 = 0;
material.Lighting = false;


selector = smgr->createTriangleSelectorFromBoundingBox(node);

node->setTriangleSelector(selector);
selector->drop();

anim = smgr->createCollisionResponseAnimator(selector, camera, core::vector3df(5,5,5),core::vector3df(0,0,0), core::vector3df(0,0,0));

camera->addAnimator(anim);
anim->drop();

// add 1 animated soldier.

video::SMaterial materials;
materials.Texture1 = driver->getTexture("solo.bmp");
materials.Lighting = false;

//scene::IAnimatedMeshSceneNode* bnode = 0;
scene::IAnimatedMesh* soldier = smgr->getMesh("TRIS.md2");
scene::ISceneNode* soldnode = 0;

if (soldier)
{
bnode = smgr->addAnimatedMeshSceneNode(soldier);
bnode->setPosition(core::vector3df(170,-20,-50));
bnode->setScale(core::vector3df(3,5,3));
bnode->setFrameLoop(0, 310);
bnode->setAnimationSpeed(30);
bnode->setRotation(core::vector3df(0,0,0));
bnode->getMaterial(0) = materials;
}

materials.Texture1 = 0;
materials.Lighting = true;

selector = smgr->createTriangleSelectorFromBoundingBox(bnode);

bnode->setTriangleSelector(selector);
selector->drop();

anim = smgr->createCollisionResponseAnimator(selector, camera, core::vector3df(5,5,5),core::vector3df(0,0,0), core::vector3df(0,0,0));

camera->addAnimator(anim);
anim->drop();

// Add a light

smgr->addLightSceneNode(0, core::vector3df(-60,100,400),
video::SColorf(1.0f,1.0f,1.0f,1.0f),
600.0f);

// create skybox
driver->setTextureCreationFlag(video::ETCF_CREATE_MIP_MAPS, false);

smgr->addSkyBoxSceneNode(
driver->getTexture("irrlicht2_up.jpg"),
driver->getTexture("irrlicht2_dn.jpg"),
driver->getTexture("irrlicht2_lf.jpg"),
driver->getTexture("irrlicht2_rt.jpg"),
driver->getTexture("irrlicht2_ft.jpg"),
driver->getTexture("irrlicht2_bk.jpg"));

driver->setTextureCreationFlag(video::ETCF_CREATE_MIP_MAPS, true);

/*
For not making it to complicated, I'm doing picking inside the drawing loop.
We take two pointers for storing the current and the last selected scene node and
start the loop.
*/


scene::ISceneNode* selectedSceneNode = 0;
scene::ISceneNode* lastSelectedSceneNode = 0;

int lastFPS = -1;

while(device->run())
if (device->isWindowActive())
{
driver->beginScene(true, true, 0);

smgr->drawAll();
guienv->drawAll();
core::line3d<f32> line;
line.start = camera->getPosition();
line.end = line.start + (camera->getTarget() - line.start).normalize() * 1000.0f;

core::vector3df intersection;
core::triangle3df tri;

if (smgr->getSceneCollisionManager()->getCollisionPoint(
line, selector, intersection, tri))
{
driver->setTransform(video::ETS_WORLD, core::matrix4());
driver->setMaterial(material);
}
selectedSceneNode = smgr->getSceneCollisionManager()->getSceneNodeFromCameraBB(camera);
lastSelectedSceneNode = selectedSceneNode;

/*
That's it, we just have to finish drawing.
*/
driver->endScene();

int fps = driver->getFPS();

if (lastFPS != fps)
{
core::stringw str = L"Collision detection example - Irrlicht Engine [";
str += driver->getName();
str += "] FPS:";
str += fps;

device->setWindowCaption(str.c_str());
lastFPS = fps;
}

}

device->drop();

return 0;
}

[/b]
Post Reply