2012-10-10 13 views
10

Serve qualche direzione sulla visualizzazione della nuvola di punti 3d usando openGl in C++ (vs2008). Sto cercando di creare una visualizzazione a nuvola di punti 3d con una texture. Ho 3 matrici 2D (ciascuna delle stesse dimensioni 1024x512) che rappresentano x, y, z di ogni punto. Penso di essere sulla strada giusta conopengl nuvola di punti 3d rendering da x, y, z array 2d

glBegin(GL_POINTS); 
for(int i=0; i<1024; i++) 
{ 
    for(int j=0; j<512; j++) 
    { 
     glVertex3f(x[i][j], y[i][j], z[i][j]); 
    } 
}  
}  
glEnd(); 

Ora questo carica tutti i vertici nel buffer (credo) ma da qui io non sono sicuro di come procedere. O sono completamente sbagliato qui.

Quindi ho un altro array 2D (stessa dimensione) che contiene dati di colore (valori da 0-255) che voglio utilizzare come texture sulla nuvola di punti 3D e sul display.

+0

Non ho RGB per ogni punto, quindi non posso usare glColor3 * (r, g, b). Sto cercando di usare l'ultimo array (con valori 0-255) come texture per la nuvola di punti 3D. Da GlBegin (GL_POLYGON) lo prendo suggerendo di creare una mesh ???? Di nuovo la domanda è come progredire da ciò che ho sopra. O sto andando nella direzione completamente sbagliata. – user1733628

+0

Bene, il codice precedente disegnerà fondamentalmente una nuvola di punti dai tuoi 3 array di coord. Non esiste un vero "buffer" che viene riempito, si disegna direttamente in modalità immediata. Per i colori: come ho capito, hai un valore di byte senza segno per vertice? Quindi dovresti definire come questi valori rappresentano alcuni colori. Potresti usarli come intensità, oppure puoi usare una tavolozza o qualcosa di completamente diverso. – derhass

risposta

2

Il codice di disegno del punto è valido così com'è.

(A lungo termine, potresti incorrere in problemi di prestazioni se devi disegnare ripetutamente questi punti, ad esempio in risposta all'utente che ruota la vista. Riorganizzare i dati da 3 array in 1 con valori x, y, z accanto a l'un l'altro ti permetterebbe di usare più velocemente array di vertici/VBO. Ma per ora, se non è rotto, non aggiustarlo.)

Per colorare i punti, hai bisogno di glColor prima di ogni glVertex. Deve essere prima, non dopo, perché in OpenGL glVertex vuol dire vagamente che è un vertice completo, disegnalo. Hai descritto i dati come nuvola di punti, quindi non cambiare glBegin in GL_POLYGON, lascialo come GL_POINTS.

OK, si dispone di un altro array con valori di indice del colore di un byte. Potresti iniziare usando il livello in scala di grigi con

glColor3ub(color[i][j], color[i][j], color[i][j]); 

che dovrebbe mostrare i punti che variano dal nero al bianco.

Per ottenere il colore vero per ogni punto, è necessaria una tabella di ricerca colore - presumo che sia presente uno dei dati o uno che si sta creando. Dovrebbe essere dichiarato qualcosa come

static GLfloat ctab[256][3] = { 
    1.0, 0.75, 0.33, /* Color for index #0 */ 
    ... 
}; 

e utilizzato prima della glVertex con

glColor3fv(ctab[color[i][j]]); 

Ho usato i colori in virgola mobile perché è quello che OpenGL utilizza internamente in questi giorni. Se si preferiscono valori di 0,255 per i colori, modificare l'array in GLubyte e glColor3fv in glColor3ub.

Spero che questo aiuti.