opengl - glutmousefunc - glut mouse motion
Coordenadas Glut Mouse (1)
Estoy tratando de obtener las coordenadas cartesianas de un punto porque estoy usando una función simple. Devuelve una ventana de coordenadas, algo así como (100,200). Quiero convertir esto a coordenadas cartesianas, el problema es que el tamaño de la ventana es variable, así que realmente no sé cómo implementar esto.
Editar:
Op:
Traté de usar el guUnPorject haciendo algo como esto
GLdouble modelMatrix[16];
glGetDoublev(GL_MODELVIEW_MATRIX,modelMatrix);
GLdouble projMatrix[16];
glGetDoublev(GL_PROJECTION_MATRIX,projMatrix);
double position[3];
gluUnProject(
x,
y,
1,
modelMatrix,
projMatrix,
viewport,
&position[0], //-> pointer to your own position (optional)
&position[1], // id
&position[2] //
);
cout<<position[0];
Sin embargo, la posición que tengo parece completamente aleatoria
Las coordenadas del mouse ya están en coordenadas cartesianas, es decir, las coordenadas del espacio de la ventana. Creo que lo que estás buscando es una transformación en el espacio mundial de tu escena OpenGL. Las coordenadas del mouse 2D en la ventana carecen de información: La profundidad.
Entonces, lo que puedes hacer es en realidad un rayo desde la "cámara" hacia la escena. Para esto, necesita realizar la proyección posterior desde el espacio de la pantalla al espacio mundial. Para esto se toma la matriz de proyección, P y la matriz de vista V (lo que se genera con gluLookAt o similar), se forma el producto P * V y se invierte, es decir (P * V) ^ - 1 = V ^ -1 * P ^ - 1. Tenga en cuenta que la inversión no es transposición. Invertir una matriz se hace por eliminación de Gauss-Jordan, preferiblemente con algunos pivotes. Cualquier libro de texto matemático sobre álgebra lineal lo explica.
Entonces necesitas dos vectores para formar un rayo. Para esto toma dos posiciones de espacio de pantalla con las mismas coordenadas XY pero diferente profundidad (por ejemplo, 0 y 1) y realiza la retroproyección:
(P*V)^-1 * (x, y, {0, 1})
La diferencia de los vectores resultantes le da una dirección de rayos.
Todo el proceso de retroproyección se ha incluido en gluUnProject. Sin embargo, recomiendo no usarlo en su formulario GLU, pero mire el código fuente para aprender de él, o use un sustituto moderno como lo ofrece GLM.