¿Qué es OpenGL Picking?

La selección de OpenGL® en la programación de computadoras es el proceso de determinar qué objeto dentro de una escena tridimensional (3D) se encuentra en un punto dado de la pantalla una vez que se renderiza la escena. También puede referirse a la ubicación de varios objetos en un punto o dentro de una caja. La mayoría de las veces, la selección de OpenGL® se usa para determinar qué objeto 3D en la pantalla está intentando seleccionar un usuario con el cursor del mouse. Si bien esta operación puede parecer simple, hay varias sutilezas en la forma en que OpenGL® renderiza una escena que pueden hacerla bastante compleja. Además, existen fallas intrínsecas en ciertas tarjetas gráficas y controladores que pueden hacer que la función de selección de OpenGL® falle y devuelva resultados falsos.

Cuando un usuario está mirando una escena 3D en un monitor de computadora, la imagen resultante se conoce como una representación de la escena. En realidad, la escena se almacena en la memoria como una colección de formas primitivas o polígonos, que en sí mismos son solo colecciones de puntos 3D dentro del espacio de la escena. La computadora usa coordenadas mundiales, que a veces se denominan coordenadas absolutas, para realizar la mayoría de las funciones básicas que manipulan objetos en la escena. En la mayoría de las aplicaciones, el usuario puede maniobrar la vista de la escena en diferentes ángulos para que los objetos se puedan ver en diferentes perspectivas. La ubicación virtual del usuario dentro de la escena se denomina ángulo de la cámara o posición de la cámara.

La complejidad de la selección de OpenGL® proviene de determinar la ubicación del mouse en la pantalla bidimensional (2D) desde una posición y ángulo posiblemente arbitrarios dentro de la escena, la posición de la cámara. Además, debido a que la representación desde la perspectiva del espectador humano es realmente 2D, el usuario no tiene forma de proporcionar la profundidad del clic del mouse dentro de la escena. La función de selección de OpenGL® resuelve este complejo problema de dos formas.

La primera es que, en lugar de realizar una serie de cálculos separados para traducir dónde se encuentra el espectador de forma abstracta y luego encontrar un objeto en la ventana de renderizado, la función en realidad renderiza la escena como lo hace cuando trabaja normalmente, con la excepción de que el renderizado utilizado para la selección no se muestra, solo se usa para calcular las posiciones correctas de los objetos. La diferencia es que, en lugar de representar toda el área que sería visible para el usuario, solo representa el área donde se encuentra el mouse. Esto significa que cualquier objeto renderizado está técnicamente en el punto donde se encuentra el puntero del mouse.

El segundo problema, es decir, no tener forma de indicar la profundidad de un área seleccionada, se resuelve devolviendo todos los objetos que están debajo de las coordenadas del mouse en la escena. La función de selección de OpenGL® devuelve todos los objetos en una matriz junto con qué tan lejos están de la ubicación del espectador. Esto permite que un programa encuentre rápidamente el objeto más cercano si lo desea.

Una forma de visualizar la selección de OpenGL® es imaginar una línea, a veces denominada rayo en la programación 3D, moviéndose desde la ubicación del puntero del mouse hacia la escena y alejándose de la ubicación del espectador. Cada objeto que toca este rayo se agrega a una matriz de objetos, junto con la distancia a la que se encuentra el espectador. Esta es una explicación muy simple de cómo funciona una forma de selección de OpenGL®.
Otro método de selección de objetos en OpenGL® implica localizar un objeto por color, y puede ser considerablemente más rápido. Este método renderiza la escena pero, en lugar de aplicar iluminación y textura a los objetos, estos se renderizan con un solo color simple. Cada objeto o grupo de objetos tiene su propio color distintivo. La escena solo se procesa en la memoria y no se muestra, por lo que esto no afecta lo que ve el usuario. En lugar de buscar colisiones 3D entre objetos, se devuelve el color en la posición del cursor del mouse y ese color se correlacionará con un objeto específico.