Skocz do zawartości

[OpenGL][C++] Texturowanie modelu


Heathcliff

Polecane posty

Witam Wszystkich,

 

Robimy z kolegą skaner 2.5D jako naszą pracę magisterską. Z OpenGL'em nie miałem styczności na studiach stąd ten post. Chciałbym pokryć teksturą (zdjęciem z aparatu) wygenerowany wcześniej model (patrz link do zdjęcia). Pomijając to, że zdjęcie trzeba będzie dopasować rozmiarem, pozycją itd chciałbym wiedzieć jak "nałożyć" te zdjęcie na mój model. W sieci czytałem troche tutoriali, ale wszystkie oparte były na prostej sześciokątnej bryle typu:

 

 glBindTexture (GL_TEXTURE_2D, 13);
glBegin (GL_QUADS);
glTexCoord2f (0.0, 0.0);
glVertex3f (0.0, 0.0, 0.0);
glTexCoord2f (1.0, 0.0);
glVertex3f (10.0, 0.0, 0.0);
glTexCoord2f (1.0, 1.0);
glVertex3f (10.0, 10.0, 0.0);
glTexCoord2f (0.0, 1.0);
glVertex3f (0.0, 10.0, 0.0);
glEnd ();

 

Moj model składa się z kilku tysięcy GL_QUADS. Chciałbym wiedzieć w jaki sposób mam zmodyfikować funkcje glTexCoord2f (x, y) tak, aby całe zdjęcie znalazło się na modelu (na wszystkich quadach). Do tej pory potrafie umieścić całe zdjęcie na jednym quadzie, co przy tak ogromnej ich ilości nie wygląda za dobrze.

 

Z góry dziękuje za pomoc,

Łukasz

 

PS: Link do zdjęcia: Zdjęcie

Link do komentarza
Udostępnij na innych stronach

Ogolnie nie jestem od tego specjalista ale teztura jest skalowana do wielkosci 1,1 czyli jak wsp. textury ustawisz jako:

(0,0) - (1,0)

(0,1) - (1,1)

 

to na qadzie rozepniesz cala teksture. Czyli musisz zrobic tak: jesli w poziomie liczba qadow to M a w pionie to M to znaczy ze masz mode o wielkosci MxN quadow. teraz kolejne qady w poziomie beda mialy wspolrzedne textury takie:

 

(a, B) - (a+a', B)

(a, b+b') - (a+a', b+b')

 

gdzie

a' = 1/M

b' = 1/N

a = 0, b=0

w kolejnym przejsciu zwiekszamy:

a = a + a' do konca lini

b = b + b' nowa linia

 

i calosc powtarzamy MxN razy dla wszystkich qadow

przy rozpoczynaniu kolejnej lini (b = b+b') a=0

 

Jak cos sie myle prosze o korekte

Always Dark<br />u1_tt_logo.png banner-1.pngexFabula-banner.pngson_banner_ubersmall.jpg

Link do komentarza
Udostępnij na innych stronach

Witam ponownie,

 

Co do glTexGen to wypróbowałem i faktycznie bardzo szybko można nałożyć teksturę, ale wydaje mi się, że nadaje się to bardziej do prostszych modeli i wydaje mi się, że prędzej czy później musiałbym wrócić do glTexCoord2f(x,y).

 

Toster, dzięki za pomoc, metoda sprawdziła się świetnie, praktycznie copy/paste tego co napisałeś :) Nie wiem tylko dlaczego tekstura nałożyła się do góry nogami. Czy to normalne ? Jak obrócić obrazek/teksturę o np 90' ?

 

Pozdrawiam,

Łukasz

Link do komentarza
Udostępnij na innych stronach

Ogolnie to uklad wspolrzednych jest narzucony przez dany system. Z tego co pamietam to DX mial prawo skretny a GL lewoskretny (albo na odwrot).

W efekcie albo w GL albo w DX tekstury byly obrocone punk (0,0) byl w lewym dolnym rogu a nie w lewym gornym.

 

Obrot o wielokrotnosc 90 lub flipH albo flipV jest dosyc prosty, poprostu zamieniasz ze soba wspolrzedna A,B (wg moich wzorow). jak np chcesz zrobic obrot o 90st to zamien A->B, B->A. Poeksperymentuj bo jest to proste a duzo trzeba by sie rozpisywac.

Jesli chodzi o obrot o dowolny kat to jest to ciut bardziej zlozone i od reki ci tego nie napisze musialbym wziasc kartke i sobie rozrysowac a nie wiem co dokladnie chcesz uzyskac wiec nie bede wybiegal z bębenkiem przed szereg :)

 

Normalne to zupelnie cos innego, uzywane sa do cieniowania i jako takie nie maja nic wspolnego z tekstura.

Always Dark<br />u1_tt_logo.png banner-1.pngexFabula-banner.pngson_banner_ubersmall.jpg

Link do komentarza
Udostępnij na innych stronach

CYTAT(Blind @ śro, 06 sie 2008 - 20:55)

Tak dla scislosci w Dx mozna zmienic uklad wspolzedny na lewo lub prawo skretny.

 

Nie chce nic mówić ale to trochę jak wtrącenie Jasona nt. Linuksa ^_^

 

 

Pozdrawiam serdecznie,

Łukasz H.

Też się tak nazywam ^_^

Link do komentarza
Udostępnij na innych stronach

Zarchiwizowany

Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.

×
×
  • Utwórz nowe...