wojownik266 Temat założony przez niniejszego użytkownika |
[OpenGL] Automatyczne tworzenie prymitywu » 2010-12-10 16:14:09 Standardowo w OGL trójkąt tworzy się tak jak poniżej:
glBegin( GL_TRIANGLES ); glVertex3f( 0.0, 0.0, 0.0; glVertex3f( - 1.0, 0.0, 0.0 ); glVertex3f( 1.0, 0.0, 0.0 ); glEnd();
Moje pytanie brzmi: czy można ten proces jakoś "zautymatyzować" tak aby dało się tworzyć taki trójkąt przy użyciu pętli for? Jeżeli tak to czy mogę prosić o wytłumaczenie tego jak to zrobić, lub gdzie mógłbym o tym poczytać? Kawałek kodu bardzo ilustrujący to zagadnienie, mile widziany…
|
|
szyx_yankez |
» 2010-12-10 16:21:58 Możesz sobie to w funkcje opakować, dodać jakieś argumenty lub nie i masz automatyzacje.
Lub przy użyciu pętli for, możesz sobie tworzyć wiele trójkątów np. w celach testów wydajnościowych.
for( int i = 0; i < 100; ++i ) { glBegin( GL_TRIANGLES ); glVertex3f( i, 0.0, 0.0; glVertex3f( - 1.0, 0.0, 0.0 ); glVertex3f( 1.0, 0.0, 0.0 ); } glEnd();
|
|
F90M |
» 2010-12-10 16:32:55 A nie lepiej do 2D użyć glVertex2f() |
|
Dragonit |
» 2010-12-10 16:57:03 F90M a gdzie on piszę że chce trójkąt 2D?
A tak apropo 'szyx_yankez' czemu pętlisz 100 razy "glBegin( GL_TRIANGLES );" Wystarczy wrzucić ją przed pętle.
|
|
VND |
» 2010-12-10 17:09:35 Warto też zainteresować się GL_TRIANGLE_STRIP i GL_TRIANGLE_FAN W pierwszym przypadku każdy kolejny punkt wyznacza nowy trójkąt (od czwartego w górę). Zaletą jest brak rysowania przylegających boków trójkątów wielokrotnie. Nowy trójkąt tworzą dwa ostatnie punkty poprzedniego i właśnie jeden nowy punkt itd. Idealne do rysowania terenu, obiektów itp. W drugim przypadku wszystkie trójkąty mają wspólny pierwszy wierzchołek. |
|
Elaine |
» 2010-12-10 17:13:31 | F90M a gdzie on piszę że chce trójkąt 2D? |
Trójkąt jest z definicji dwuwymiarowy... |
|
dmx81 |
» 2010-12-10 17:19:42 a jeszcze dla uściślenia pytania, które zadałeś, chcesz tworzyć trójkąt czy trójkąty ? bo to też znacząca różnica, zapytałes o zautomatyzowanie tworzenia trojkata a dostales odpowiedz, jak stworzyc trojkaty :) byc moze o to ci chodzilo, dlatego wiec pytam, czy odp ci pasuje. (bo np zautomatyzowanie rysowania jednego trojkata, to w petli for 3 razy narysowac linie :) ) oczywiscie w miejsce wspolrzednych podasz jakies tablice - bo tu wiadomo, otrzymasz serie stu trojkatow o zmieniajacym sie jednym wierzcholku, ale pewnie to widac :) najlepiej zrobic sobie funkcje np void draw_triangles( const CPoint * a, const CPoint * b, const CPoint * c ) { glBegin( GL_TRIANGLES ); glVertex3f( a->x, a->y, a->z ); glVertex3f( b->x, b->y, b->z ); glVertex3f( c->x, c->y, c->z ); glEnd(); }
for( int i = 0; i < ile; i++ ) draw_triangles( a, b, c );
mozna funkcje przeciazyc i zamiast wskaznikow na obiekt klasy podawac konkretne wspolrzedne, a pozniej w petli podac tablice z tymi wspolrzednymi... oczywiscie mozna tez na wiele innych sposobow wyswietlac (tablice wierzcholkow, listy wiswietlania itd) ale wiadomo, dla bardziej skomplikowanego projektu... chociaz tez najlepiej sie uczyc uzywac bardziej zaawansowanych technik na prostych przykladach, aby latwiej przyswoic mozna uzyc tez paskow trojkatow lub wachlarza trojkatow - trzeba poczytac, czy takie rozwiazanie pasuje ps-> pisalem z glowy i w pospiechu, wiec mam nadzieje, ze nie walnalem gdzies jakiejs gafy, ewentualnie czegos nie doczytalem, a po drugie - to sam jestem wlasnie w trakcie nauki wiec dla mnie sa to swieze problemy:) ps2-> ups, w miedzy czasie dopisano pare postow, wiec nie wiem, czy moj nadal aktualny;) - trojkat jest 2d zgadza sie - ale mozna go umiescic w przestrzeni 3d (po to jest mozliwosc rysowania glvertex3f ;) bo trojkaty nie koniecznie musza "lezec" na tej samej plaszczyznie) |
|
wojownik266 Temat założony przez niniejszego użytkownika |
» 2010-12-10 19:13:08 Podobno dobry przykład znaczy więcej niż 1000 słów. Bardzo dziękuję za odpowiedzi oraz zamieszczone programiki. Miłego wieczoru... |
|
| « 1 » |