Google
 

lunes, julio 10, 2006

Ogre: Colisiones de rayos

Con el motor 3d Ogre podemos lanzar rayos contra el escenario para averiguar con que objetos colisionan. No nos sirve para colisionar contra el entorno pues los rayos solo "chocan" con la envoltura de los objetos (bounding-box en este caso) así que sólo es una colisión aproximada. Pero es útil, por ejemplo, para poder seleccionar objetos con el ratón:
 1 Ray ray = mCamera->getCameraToViewportRay(mMousePos.x, mMousePos.y);
2
3 RaySceneQuery* rsq = mSceneMgr->createRayQuery(ray);
5 rsq->execute();
6
7 float dist = 50000.0f;
8
9 MovableObject* o = NULL;
10 RaySceneQueryResult& result = rsq->getLastResults();
11 for(RaySceneQueryResult::iterator ri = result.begin(); ri != result.end(); ri++) {
12 RaySceneQueryResultEntry* e = &(*ri);
13
14 if(e->distance <>movable) {
15 dist = e->distance;
16 o = e->movable;
17 }
18 }
19
20 if(o != NULL) {
21 // TODO objeto seleccionado
22 }
23
Esta consulta sólo funciona con mallas, si además queremos también calcular colisiones contra objetos especiales como billboards habrá que añadir:
 4 rsq->setQueryTypeMask(SceneManager::FX_TYPE_MASK);

2 comentarios:

Jonathan dijo...

Oye .. perdona que sea muy lento pero no entiendo en donde poner este código, y no se de donde salen mMousepos.x y mMousepos.y ... podrías explicarme un poco más.

Le intente buscar pero no eh dado con la forma de hacerlo.

Lo que estoy haciendo es poder seleccionar un objeto con el mouse y saber que objeto es. para despues yo hacer otras cosas con el.

Gracias.

Victor M. dijo...

Para coger las coordenadas del ratón debes usar OIS:

http://www.ogre3d.org/wiki/index.php/Using_OIS