2011-06-18 13 views
5

Estoy tratando de hacer una aplicación en Qt-openGL. Aquí, tengo que conocer el objeto cliqueado, basado en el clic del mouse. Mi idea es almacenar los puntos (el área del objeto en QWidget) y hacer coincidir el clic del mouse con estos puntos. ¿Alguien puede decir cómo hacer esto ?, o ¿Puede un cuerpo mostrar de otra manera?Qt OpenGL- Cómo obtener el objeto basado en el clic del mouse

Respuesta

14

Este problema se conoce generalmente como "picking". OpenGL solo dibuja cosas, no hay administración de objetos geométricos para hablar (OpenGL tiene objetos, pero son, lo que normalmente llamarías recursos).

La forma habitual de implementar OpenGL picking en estos días es recuperar el valor de profundidad en la posición de clic (glReadPixels(x, y, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &depth)) y desprogramarlo en el espacio mundial (gluUnProject(...)). Esto le da el (x,y,z) del punto cliqueado.

Dado que generalmente administrará su geometría en alguna estructura de subdivisión espacial (BSP, Kd, ​​etc.) atravesando la estructura de subdivisión hasta las coordenadas de clic, podrá recuperar el objeto de esa manera.

Otro método consiste en proyectar un rayo que sigue al clic en la escena y realizar pruebas de intersección de volúmenes de ray/bounding.

Desaconsejo encarecidamente el uso del viejo mecanismo de selección OpenGL: es lento y engorroso de usar.

+0

Ahora que los sombreadores prevalecen, ¿no es fácil establecer una identificación de objeto para cada objeto y usar el sombreador de fragmentos para escribir eso en un plano oculto sin mezclar? La elección se convierte en lectura desde ese plano en las coordenadas del mouse. No hay necesidad de una proyección o una búsqueda de geometría. –

+1

@Ben Voigt: Siempre que solo le interese un objeto debajo del puntero del mouse (por supuesto, esto coincide con el método de no proyección), entonces sí. Sin embargo, si le interesan todos los objetos debajo del puntero, tendrá que usar el método de selección de rayos o usar un poco de peeling en profundidad. Sin embargo, en las aplicaciones tridimensionales más serias, los objetos se administran usando alguna estructura espacial de todos modos, y tener una prueba en contra de esto suele ser más fácil. – datenwolf

+0

hago picking usando gluUnProject y glReadPixels, pero el resultado es siempre el objeto más frágil en lugar del más cercano, ¿por qué? – jondinham

Cuestiones relacionadas