Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





un picking relativamente sencillo

Iniciado por marcode, 02 de Julio de 2008, 03:10:08 AM

« anterior - próximo »

Warchief

Despiste, 2d -> 3d es.


//! Returns a 3d ray which would go through the 2d screen coodinates.
core::line3d<f32> CSceneCollisionManager::getRayFromScreenCoordinates( const core::vector2di& pos, ICameraSceneNode* camera )
{
core::line3d<f32> ln;
// ...
const scene::SViewFrustrum* f = camera->getViewFrustrum();

core::vector3df farLeftUp = f->getFarLeftUp();
core::vector3df lefttoright = f->getFarRightUp() - farLeftUp;
core::vector3df uptodown = f->getFarLeftDown() - farLeftUp;

core::vector2di screenSize = Driver->getScreenSize();

f32 dx = pos.X / (f32)screenSize.X;
f32 dy = pos.Y / (f32)screenSize.Y;

if(camera->isOrthogonal())
ln.start = f->cameraPosition + (lefttoright * (dx-0.5f)) + (uptodown * (dy-0.5f));
else
ln.start = f->cameraPosition;

ln.start = f->cameraPosition;
ln.end = farLeftUp + (lefttoright * dx) + (uptodown * dy);

return ln;
}


Con la línea trazas la colisión. En tu caso, colisión de recta con plano.

Puedes mirar el código del motor [ http://irrlicht.sourceforge.net/ ]


marcode

Gracias, encontré la solución en la página que pusiste, Warchief. La función que necesitaba es exactamente gluUnProject, que desconocía.

A esta función se le pasa la posición del cursor y la distancia z que buscamos, el viewport y las matrices de transformación, y te devuelve las coordenadas en 3D. De manera que con 2 llamadas con diferentes distancias obtenemos un rayo que "sale" del cursor a la escena, y con él se puede determinar su intersección con cualquier plano y por tanto el punto exacto de colisión que buscaba.

ahora lo que he intentado hacer es mi propia función gluUnproject conociendo la fórmula.

CitarTo compute the coordinates (objX, objY, and objZ),
     gluUnProject multiplies the normalized device   coordinates by
     the inverse of model*proj as follows:

http://www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/glu/unproject.html

multiplico la matriz modelview por la de projection, la matriz resultante la invierto. y multiplico el punto 2D de la ventana normalizado por esa matriz.

Es así ¿no?
Pues no funciona :roll:

Bueno, da igual, ya lo resolveré, lo que quería ya lo he encontrado.
size=9]afortunadamente siempre ha habido alguien dispuesto a reinventar la rueda, de lo contrario seguiríamos usando un disco de piedra con un agujero.[/size]






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.