Collison event

radsun

21-02-2008 19:36:15

I have three OgreOde::Body:
-player
-monster
-flame

Collision between Body&Plane and Body&Body works ;D
But how can i have a collision event when player collide with flame.
I don't wont him to push it but only do some code...

:?:

rewb0rn

21-02-2008 20:16:02

http://www.ogre3d.org/wiki/index.php/Og ... n_Handling

Should give some input.

radsun

21-02-2008 20:54:47

I will read it carefully :D
If i had any problems i'll write it here

thx for your article :wink:

radsun

29-02-2008 06:29:15

I have problem with UserObject. :?
There's a class 'Kolizja':
class Kolizja
{
public:
Kolizja(int id){ID=id;};
~Kolizja(){};
int GetID() {return ID;}
void SetID(int id) {ID=id;}
private:
int ID;
};


I have 2 geometris an i set them UserObject:
Kolizja* k_hero;
Kolizja* k_au;

k_hero = new Kolizja(0);
k_au = new Kolizja(1);

feetGeom = new OgreOde::SphereGeometry(radius,_world);
...
feetGeom->setUserObject(static_cast<Kolizja*>(k_hero));

OgreOde::BoxGeometry* aunik = new OgreOde::BoxGeometry(Vector3(1,1,1),_world);
...
aunik->setUserObject(static_cast<Kolizja*>(k_au));


This is my collision function. if (g1->getUserObject()) and if (g2->getUserObject()) never returns true and MessageBox never have been showed. :(
bool collision(OgreOde::Contact* contact)
{
// Check for collisions between things that are connected and ignore them
OgreOde::Geometry * const g1 = contact->getFirstGeometry();
OgreOde::Geometry * const g2 = contact->getSecondGeometry();

if (g1 && g2)
{
const OgreOde::Body * const b1 = g2->getBody();
const OgreOde::Body * const b2 = g1->getBody();
if (b1 && b2 && OgreOde::Joint::areConnected(b1, b2))
return false;
}

//set contact parameters:
contact->setBouncyness(0.1);
contact->setCoulombFriction(OgreOde::Utility::Infinity);

bool Return = true;

if (g1->getUserObject())
{
MessageBox(0,"1",":)",MB_OK);
Return = false;
}

if (g2->getUserObject())
{
MessageBox(0,"2",":)",MB_OK);
Return = false;
}

return Return;
}

When i using it not in collision GetUserObject works ok. For example:
int fds;
if(feetGeom->getUserObject())
{
fds=static_cast<Kolizja*>(feetGeom->getUserObject())->GetID();
if (fds==1)
MessageBox(0,"0",":P",MB_OK);
}

:?:

radsun

03-03-2008 18:08:08

Somebody help my please :roll:

anyone :?:

rewb0rn

03-03-2008 21:00:27

The code looks okay to me. Are you sure your geometries actually collide?

radsun

04-03-2008 15:57:54

Yes, the geometry collide, when i return false it not collide.
I think that there is a problem in geometry->getUserObject() in collide function :?

rewb0rn

04-03-2008 16:03:51

No i mean maybe the geometries that you setUserObjects to never intersect with anything so getUserObject() would always return 0 as the geometries you test don't have any.

radsun

04-03-2008 18:39:46

They have user object:
feetGeom = new OgreOde::SphereGeometry(radius,_world);
...
feetGeom->setUserObject(static_cast<Kolizja*>(k_hero));

and it working but not in Collision.
To check it i used:
if (input->isKeyDown(KC_F9))
{
if(feetGeom->getUserObject())
{
MessageBox(0,"yes","",MB_OK);
}
else
{
MessageBox(0,"no","",MB_OK);
}
}

rewb0rn

04-03-2008 18:57:47

read again

radsun

04-03-2008 20:05:53

No i mean maybe the geometries that you setUserObjects to never intersect with anything so getUserObject() would always return 0 as the geometries you test don't have any.
:shock: :D

You mean that the geometry that i setUserObject() not collide with anything?

i setUserObject to all geo and its working somehow :oops:


Now i have 5 geos:
HERO_UP
HERO_DOWN
ROBO_UP
ROBO_DOWN
BOX

HERO_UP and HERO_DOWN are connected usinng joint, same as ROBO_UP&DOWN.

The collision between HERO and ROBO works :) but beetwen HERO and BOX not :cry:
This is code of declaration BOX:
Kolizja* k_au = new Kolizja(1);

box_body = new OgreOde::Body(_world,"box");
box_body->setPosition(Vector3(0,0,-5));
OgreOde::BoxGeometry* box_geo = new OgreOde::BoxGeometry(Vector3(1,1,1),_world);
box_geo->setUserObject(static_cast<Kolizja*>(k_box));
OgreOde::TransformGeometry* box_trans = new OgreOde::TransformGeometry(_world,_space);
box_trans->setBody(box_body);
box_trans->setEncapsulatedGeometry(box_geo);

Vector3 size3(1,1,1);
size3*=1.75;
OgreOde::BoxMass mass(1.0,size);
mass.setDensity(5.0,size);
box_body->setMass(mass);

is it OK?

rewb0rn

04-03-2008 22:36:55

Set the user object to the TransformGeometry, didn't I mention in the tutorial to do that?

radsun

05-03-2008 14:54:23

In toutrial is written:
Geometry->setUserObject(static_cast<CollisionTestedObject*>(this));
so i used it for SphereGeometry/BoxGeometry :roll:

Now i set it for transform geo and it working great :D