Il picking OpenGL® nella programmazione del computer è il processo per determinare quale oggetto all’interno di una scena tridimensionale (3D) si trova in un determinato punto dello schermo una volta che la scena è stata renderizzata. Può anche riferirsi alla localizzazione di più oggetti in un punto o all’interno di una scatola. Molto spesso, la selezione OpenGL® viene utilizzata per determinare quale oggetto 3D sullo schermo un utente sta tentando di selezionare con il cursore del mouse. Sebbene questa operazione possa sembrare semplice, ci sono diverse sottigliezze nel modo in cui OpenGL® esegue il rendering di una scena che può renderla abbastanza complessa. Inoltre, ci sono problemi intrinseci in alcune schede grafiche e driver che possono causare il fallimento della funzione di selezione OpenGL® e restituire risultati falsi.
Quando un utente guarda una scena 3D sul monitor di un computer, l’immagine risultante è nota come rendering della scena. La scena è effettivamente archiviata in memoria come una raccolta di forme primitive o poligoni, che a loro volta sono solo raccolte di punti 3D all’interno dello spazio della scena. Il computer utilizza le coordinate del mondo, a volte chiamate coordinate assolute, per eseguire le funzioni più basilari che manipolano gli oggetti nella scena. Nella maggior parte delle applicazioni, l’utente è in grado di manovrare la vista della scena da diverse angolazioni in modo che gli oggetti possano essere visti in diverse prospettive. La posizione virtuale dell’utente all’interno della scena è chiamata angolo della telecamera o posizione della telecamera.
La complessità del picking OpenGL® deriva dalla determinazione della posizione del mouse sullo schermo bidimensionale (2D) da una posizione e da un angolo possibilmente arbitrari all’interno della scena, la posizione della telecamera. Inoltre, poiché il rendering dal punto di vista dell’osservatore umano è in realtà 2D, non c’è modo per l’utente di fornire la profondità del clic del mouse all’interno della scena. La funzione di prelievo OpenGL® risolve questo problema complesso in due modi.
La prima è che, invece di eseguire una serie di calcoli separati per tradurre dove si trova il visualizzatore in modo astratto e quindi trovare un oggetto nella finestra di rendering, la funzione rende effettivamente la scena come fa quando funziona normalmente, con l’eccezione che il rendering utilizzato per selezione non viene visualizzato, serve solo per calcolare le corrette posizioni degli oggetti. La differenza è che, invece di eseguire il rendering dell’intera area che sarebbe visibile all’utente, esegue il rendering solo dell’area in cui si trova il mouse. Ciò significa che tutti gli oggetti renderizzati si trovano tecnicamente nel punto in cui si trova il puntatore del mouse.
Il secondo problema, ovvero non avere modo di indicare la profondità di un’area selezionata, viene risolto restituendo nella scena tutti gli oggetti che si trovano sotto le coordinate del mouse. La funzione di selezione OpenGL® restituisce tutti gli oggetti in un array insieme alla loro distanza dalla posizione del visualizzatore. Ciò consente a un programma di trovare rapidamente l’oggetto più vicino, se lo si desidera.
Un modo per visualizzare la selezione OpenGL® consiste nell’immaginare una linea, a volte indicata come raggio nella programmazione 3D, che si sposta dalla posizione del puntatore del mouse nella scena e si allontana dalla posizione dello spettatore. Ogni oggetto che questo raggio tocca viene aggiunto a una serie di oggetti, insieme alla distanza dall’osservatore. Questa è una spiegazione molto semplice di come funziona una forma di prelievo OpenGL®.
Un altro metodo di selezione degli oggetti in OpenGL® prevede l’individuazione di un oggetto in base al colore e può essere notevolmente più veloce. Questo metodo esegue il rendering della scena ma, invece di applicare l’illuminazione e la trama agli oggetti, vengono invece renderizzati con un singolo colore semplice. Ogni oggetto o gruppo di oggetti ha il proprio colore distinto. La scena viene solo resa in memoria e non visualizzata, quindi ciò non influisce su ciò che vede l’utente. Invece di cercare collisioni 3D tra oggetti, viene restituito il colore nella posizione del cursore del mouse e quel colore sarà correlato a un oggetto specifico.