Problemas con animación de movimiento y seguimiento de la cámara en una aplicación con direct3D

Muy buenas,
tengo una cuestión: estamos trabajando en una aplicación en 3D con directx, y el problema surge en el movimiento.
La escena se ve desde una cámara que sigue al avatar o personaje (a lo chase cam de cualquier juego de coches), y la idea esta en que pinchando con el ratón en algún lugar de la escena, el avatar se debe dirigir hacia ese punto.
Y no se como resolverlo.
Primeramente no se me ocurre como hacer para que las coordenadas por e y de la pantalla (donde se pincha) se conviertan en una posición (x, y, z) del mundo virtual. Se me ocurrió la idea de lanzar un rayo desde el device del direct3D desde la coordenada del ratón hacia el fondo, y ver con que choca, peor no se si funcionaria bien.
También se me ocurre que luego habría problemas de Inteligencia para la búsqueda de una ruta hacia el destino, pero esto ya son problemas menores (al menos por el momento).
Pues nada más, muchas gracias por lo que me puedas contar
BlackMiG
1

1 Respuesta

2.625 pts.
Tengo un articulo que explica muy bien el
Object Picking, y trata de esto, de
Como seleccionar un objecto de la escena
con el ratón. Y explica como pasar las
coordenadas 2d a 3d del Mundo.
Aquí tienes la función que transforma las
coordenadas del ratón a las del mundo, y
lo que hace es trazar una linea.
D3DVECTOR makeray(float FOV, float aspectRatio, WORD mouseX, WORD mouseY, float range)
{
D3DVECTOR lineend,CameraSpacePos;
float NMouseX,NMouseY;
D3DMATRIX matView;
FOV = GRAD2RAD(FOV);
/*
pasamos las coordenadas del ratón
a coordendas de viewport que van del -1.0 al 1.0
1.0 - 2.0*mouseX, es por que el centro del viewport
es el centro de la ventana o pantalla y el centro
de las coordendas del ratón es la esquina superior
izquierda, y de esta manera lo transladamos
*/
NMouseX =(1.0 - ((float)2.0*mouseX/VIEWPORTWIDTH));
NMouseY =(1.0 - ((float)2.0*mouseY/VIEWPORTHEIGHT));
/*
Calculamos la posición del punto NMouseX,NMouseY
con respecto a la camara
*/
CameraSpacePos.y=(NMouseY*tan(FOV/2));
CameraSpacePos.x=(-NMouseX/aspectRatio)*tan(FOV/2);
/*
hallamos el punto final del rayo
*/
lineend.x=range*CameraSpacePos.y;
lineend.y=range*CameraSpacePos.y;
lineend.z=range;
/*
Pasamos el vector lineend que esta con respecto a las coordenadas
de la cámara, a las del mundo.
*/
gd3d.pd3dDevice->GetTransform(D3DTRANSFORMSTATE_VIEW ,&matView);
D3DMath_MatrixInvert(matView,matView); // hallamos la inversa
// transformamos el vector al mundo 3d
D3DMath_VectorMatrixMultiply(lineend,lineend,matView);
// gvLine, variable global D3DVERTEX
gvLine[0].x = gCamera.vPosition.x;
gvLine[0].y = gCamera.vPosition.y;
gvLine[0].z = gCamera.vPosition.z;
gvLine[1].x = lineend.x;
gvLine[1].y = lineend.y;
gvLine[1].z = lineend.z;
return lineend;
}
Espero que esto te sirva o te de alguna pista, pero mejor que busques
este articulo:
"Object Picking ( Selecting 3D Objects with the Mouse)"
Escrito por Gary Simmons
Lo ha estado buscando por la red y no le encontrado, haber si tú tienes
más suerte.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas