2012-10-10 15 views
10

Potrzebujesz jakiegoś kierunku na wyświetlaniu chmury punktów 3D za pomocą openGl w C++ (vs2008). Próbuję zrobić 3d chmurkę punktów z teksturą. Mam 3 tablice 2D (każdy o tej samej wielkości 1024x512) reprezentujące x, y, z każdego punktu. Myślę, że jestem na dobrej drodze zopengl Chmura punktów 3D render z X, Y, Z Tablica 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(); 

Teraz ładuje wszystkie wierzchołki w buforze (myślę), ale stąd nie jestem pewien, jak postępować. Albo jestem całkowicie zła tutaj.

Następnie mam inną tablicę 2D (ten sam rozmiar), która zawiera dane kolorów (wartości od 0-255), które chcę użyć jako tekstury w chmurach i wyświetlaczach punktów 3D.

+0

Nie mam RGB dla każdego punktu, więc nie mogę używać glColor3 * (r, g, b). Próbuję użyć ostatniej tablicy (z wartościami 0-255) jako mojej tekstury dla chmury punktów 3D. Z glBegin (GL_POLYGON) Rozumiem, że sugerujesz tworzenie siatki ???? Ponownie pytanie brzmi: jak postępować z tego, co mam powyżej. LUB czy idę w całkowicie złym kierunku. – user1733628

+0

Cóż, powyższy kod w zasadzie narysuje chmurę punktów z 3 macierzy współrzędnych. Nie ma prawdziwego "bufora", który jest wypełniony, bezpośrednio rysujesz w trybie natychmiastowym. Kolory: Jak rozumiem, masz jedną niepodpisaną wartość bajtu na jeden wierzchołek? Dlatego powinieneś zdefiniować, w jaki sposób wartości te reprezentują niektóre kolory. Można ich użyć jako intensywności lub użyć palety lub czegoś zupełnie innego. – derhass

Odpowiedz

2

Kod rysowania punktowego jest bez zmian.

(Długoterminowo możesz napotkać problemy z wydajnością, jeśli musisz wielokrotnie narysować te punkty, na przykład w odpowiedzi na obracanie widoku przez użytkownika Zmiana układu danych z 3 tablic na 1 za pomocą wartości x, y, z obok nawzajem pozwoliłoby ci użyć szybszych tablic wierzchołków/VBO, ale na razie, jeśli nie jest zepsuty, nie naprawiaj tego.)

Aby pokolorować punkty, potrzebujesz glColor przed każdym glVertex. Musi to być przed, nie po, ponieważ w OpenGL glVertex luźno oznacza, że ​​jest to kompletny wierzchołek, narysuj go. Opisałeś dane jako chmurę punktów, więc nie zmieniaj glBegin na GL_POLYGON, zostaw to jako GL_POINTS.

OK, masz inną tablicę z jednobajtowymi wartościami indeksu kolorów. Możesz zacząć od użycia tego jako odcienia szarości z wartością

glColor3ub(color[i][j], color[i][j], color[i][j]); 
, która powinna pokazywać punkty zmieniające się od czarnego do białego.

Aby uzyskać prawdziwy kolor dla każdego punktu, potrzebny jest tabelę kolorów - zakładam, że jest albo jeden z danymi, albo ten, który tworzysz. Powinna ona zostać uznana za coś takiego

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

i stosować przed glVertex z

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

Użyłem zmiennoprzecinkowych kolory bo to co OpenGL używa wewnętrznie te dni. Jeśli wolisz wartości 0..255 dla kolorów, zmień tablicę na GLubyte i glColor3fv na glColor3ub.

Mam nadzieję, że to pomoże.

Powiązane problemy