Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
Master
Založen: 28. 08. 2007 Příspěvky: 35
|
Zaslal: 2. leden 2008, 16:26:12 Předmět: Natoceni objektu podle smeroveho vektroru? |
|
|
Zdravim,mam ted takovy problem.Resim problem se zobrazovanim normal na modelu.Zobrazovani neni problem.Jenze pro identifikaci potrebuju ke kazde normale zobrazit jeji cislo v poradi.Zobrazeni textu neni problem,ale problem je jeho natoceni.Zobrazuje se totiz primo smerem ke me.Takze kdyz objekt otocim o 180 stupnu,tak ten text je zrcadlove obraceny.
Tudiz potrebuju,aby kazde cislo bylo zobrazeno ve smeru normaly vektoru.
Vi nekdo jak natocit text ve smeru vektoru?
Na zobrazeni pouzivam z nehe tutorialu upraveny kod:
kód: |
glBindTexture(GL_TEXTURE_2D, fontTexture[0]);
glEnable(GL_BLEND);
glPushMatrix();
glTranslated(x,y,z);
glScalef(0.03f,0.03f,0.03f);
glListBase(base-32+(128*set));
glColor3f(1.0f,1.0f,1.0f);
glCallLists(strlen(string),GL_BYTE,string);
glPopMatrix();
glDisable(GL_BLEND);
|
|
|
Návrat nahoru |
|
|
(CZ)genius
Založen: 28. 07. 2007 Příspěvky: 85 Bydliště: Neratovice
|
Zaslal: 2. leden 2008, 17:14:00 Předmět: |
|
|
nejsem si jistej, jestli jsem uplne pochopil tvuj problem, ale nestacilo by rotovat podle jiny osy? |
|
Návrat nahoru |
|
|
nou
Založen: 28. 07. 2007 Příspěvky: 1047
|
Zaslal: 2. leden 2008, 18:06:31 Předmět: |
|
|
ak chces zobrazovat popisky ako je to napriklad s menami v MMORPG tak su dve cesty. bilboarding alebo zistit si poziciu kde sa premieta dana normala v 2D a potom ho vypisat klasicky pomocou 2D koordinatov. _________________ Najjednoduchšie chyby sa najtažšie hľadajú. |
|
Návrat nahoru |
|
|
(CZ)genius
Založen: 28. 07. 2007 Příspěvky: 85 Bydliště: Neratovice
|
Zaslal: 2. leden 2008, 18:39:04 Předmět: |
|
|
presne tak.. akorat ze ja jsem uz predpokladal ten 2D ortho vypis.. a tam si je pak muzes v ty "promitaci rovine" (vim ze to neni presny) narotovat obycejnou glRotate.. |
|
Návrat nahoru |
|
|
Master
Založen: 28. 08. 2007 Příspěvky: 35
|
Zaslal: 2. leden 2008, 19:42:50 Předmět: |
|
|
Billboarding se mi ted zrovna nehodi a to promitani do 2D.To taky moc nechci.I kdyz muzete napsat,jak se prepocitavaji souradnice z 3d do ortho a prinejhorsim to tak zkusim.
Jde mi spise o tohle jak je na obrazku nakreslene.
Carkovana je priblizny smer normaly.
Proste natocit to pismo ve smeru te normaly.Akorat netusim,jak slozity tam budou vypocty.Ty smery tech normal mam,jen to musim natocit.
Naposledy upravil Master dne 2. leden 2008, 20:23:17, celkově upraveno 1 krát |
|
Návrat nahoru |
|
|
(CZ)genius
Založen: 28. 07. 2007 Příspěvky: 85 Bydliště: Neratovice
|
Zaslal: 2. leden 2008, 20:15:32 Předmět: |
|
|
obrazek se nepoved.. teda aspon mne se nezobrazi...
jinak prepocitani 3D bodu do 2D roviny je docela dobre popsano na wikipedii (http://en.wikipedia.org/wiki/3D_projection).. a myslim ze v glu/glut je na to primo naka funkce.. |
|
Návrat nahoru |
|
|
Master
Založen: 28. 08. 2007 Příspěvky: 35
|
Zaslal: 2. leden 2008, 20:23:58 Předmět: |
|
|
Obrázek sem hodil na jinej hosting,tak snad uz to bude viditelne. |
|
Návrat nahoru |
|
|
(CZ)genius
Založen: 28. 07. 2007 Příspěvky: 85 Bydliště: Neratovice
|
Zaslal: 2. leden 2008, 20:32:45 Předmět: |
|
|
no ja bych spocital dva body ty normaly (nejspis stred polygonu a pak konec vektoru), a vemes jak moc ta 2D primka stoupa, a z toho mas uhel..
no proste prevyst ten 3D vektor na 2D a z toho uhel.. |
|
Návrat nahoru |
|
|
Master
Založen: 28. 08. 2007 Příspěvky: 35
|
Zaslal: 2. leden 2008, 20:57:53 Předmět: |
|
|
1, Prevod na ortho uz mam,jen se mi ted vykresluji vsechny cisla vcetne tech,ktere jsou za objektem.Je nejaky enum pro glDisable,ktery prestane vykreslovat ty texty za objektem?Ale mam spis pocit,ze to budu muset rucne kontrolovat jeste pred vykreslenim.
2, Stred plochy a konec normaly mam spocitany jak vidis,jinak bych nevykreslis ty normaly.
Jak rikas,spocitat stoupani.Mas to na mysli:
a - uhel alfa
Y - konecny bod normaly
No z tohodle vidim,ze musim vzit Y,a presunout ho na stejne rovinu s puvodnim bodem ve stredu trojuhelnik a mezi temito vektory spocitat uhel.
Pochopil sem to spravne?Nebo klasickym sinem zjistit rozdil y - x/prepona? |
|
Návrat nahoru |
|
|
(CZ)genius
Založen: 28. 07. 2007 Příspěvky: 85 Bydliště: Neratovice
|
Zaslal: 2. leden 2008, 21:11:16 Předmět: |
|
|
ty potrebujes ziskat ten uhel v rovine, takze akorat vyresis ten trojuhlenik (znas obe odvesny a potrebujes uhel..) a mas pozadovanou hodnotu.. akorat musis dopsat aby se nezobrazovaly texty za objektem (neslo by to obejit tak ,ze by si nechal zaplej depth buffer?) a aby text nad 180° nebyl vzhuru nohama.. (teda pokud to tak nechces ) |
|
Návrat nahoru |
|
|
Master
Založen: 28. 08. 2007 Příspěvky: 35
|
Zaslal: 2. leden 2008, 21:15:17 Předmět: |
|
|
S tim Z-bufferem to zkusim.S tim natocenim si jeste pohraju
Dik za rady |
|
Návrat nahoru |
|
|
posila
Založen: 29. 07. 2007 Příspěvky: 201
|
Zaslal: 2. leden 2008, 22:03:48 Předmět: |
|
|
Imho se to spocita uplne stejne jako billboardy, kdy vlasne trojuhelnik billboardu je vzdy kolmy k LookAt vektoru kamery... takze misto LookAt vektoru pouzijes tu normalu, ktere cislo prislusi... |
|
Návrat nahoru |
|
|
Master
Založen: 28. 08. 2007 Příspěvky: 35
|
Zaslal: 2. leden 2008, 22:55:22 Předmět: |
|
|
Tak delam to pres ten prevod do ortho soustavy.Ale ani za boha se nemuzu dopracovat k tomu,aby ty cisla,ktere jsou vzadu nebyly videt.Porad se tam zobrazuji a neda se v tom vyznat.Jak mam upravit kod na to vykreslovani textu,aby se to tam konecne nezobrazovalo?
kód: |
glEnable(GL_BLEND);
glEnable(GL_DEPTH_TEST);
glMatrixMode(GL_PROJECTION); // Select The Projection Matrix
glPushMatrix(); // Store The Projection Matrix
glLoadIdentity(); // Reset The Projection Matrix
glOrtho(0,windowSize[0],0,windowSize[1],-1,1); // Set Up An Ortho Screen
glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
glPushMatrix(); // Store The Modelview Matrix
glDisable(GL_LIGHTING);
glLoadIdentity(); // Reset The Modelview Matrix
glTranslated(x,y,0); // Position The Text (0,0 - Bottom Left)
glListBase(base-32+(128*set)); // Choose The Font Set (0 or 1)
glColor3f(1.0f,1.0f,1.0f);
glCallLists(strlen(string),GL_BYTE,string); // Write The Text To The Screen
glMatrixMode(GL_PROJECTION); // Select The Projection Matrix
glEnable(GL_LIGHTING);
glPopMatrix(); // Restore The Old Projection Matrix
glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
glPopMatrix(); // Restore The Old Projection Matrix
//glDisable(GL_DEPTH_TEST);
glDisable(GL_BLEND);
|
Musi se jeste neco specialniho nastavovat u toho depth testu? |
|
Návrat nahoru |
|
|
MePHyst0
Založen: 28. 07. 2007 Příspěvky: 85 Bydliště: SVK/CZK
|
Zaslal: 3. leden 2008, 09:37:56 Předmět: |
|
|
no samozrejme ze ked budes tym textom v ortho davat ako Z nulu tak sa ti to nebude prekryvat, vsetky budu uplne vpredu pred vsetkym. ak chces aby ti tie texty spravne fungovali s depth bufferom tak ich musis kreslit normalne 3D v perspektivnej projekcii. ak chces ist cez ortho projekciu, musis si to prekryvanie vypocitat sam, teda si stiahnes depth buffer a vyberes z neho hodnotu na mieste kde chces kreslit text, pozres sa ci tato hodnota je mensia ako "depth hodnota" toho textu(tu si tiez vytiahni z depth bufferu bude v strede trojuholniku trebars) a iba ak tento rucny depth test presiel tak vykresli font. good luck |
|
Návrat nahoru |
|
|
Marek
Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 3. leden 2008, 10:16:01 Předmět: |
|
|
Jak řekl MePHyst0, depth test ti moc nepomůže, protože bys musel nastavovat pro každý vertex souřadnici Z a za druhé je to stejně k ničemu, protože rozložení hodnot u kolmé projekce je v zbufferu lineární, zatímco v perspektivní projekci je logaritmické (tzn. u bližších objektů je mnohem přesnější). Ono by to samozřejmě šlo udělat i bez stahování zbufferu do RAM.
Máš 2 způsoby, jak to řešit:
1) Řešíš ve 3D. Z úsečky normály zkonstruuješ čtyřúhelník, úsečka bude zároveň osou toho čtyřúhelníku a bude jím procházet. Musíš ho natočit ke kameře, ale ne tak jako billboard, budeš ho rotovat pouze kolem normály - normála tady bude rotační osa. Nakonec to vykrelíš ve 3D se zapnutým depth testem. Tip: Abys věděl, jak to máš přesně natočit, využij normálu toho billboardu.
2) Když musíš mít výstup ve 3D kvůli zbufferu, tak to ještě neznamená, že nemůžeš většinu výpočtů dělat ve 2D. Využiješ tzv. matice přechodu, tzn. máš matici M = (ortho matice^-1)*(perspektivní matice). Libovolný bod (zadaný relativně k pozici kamery) ve 3D převedeš do 2D tak, že ho tou maticí vynásobíš. Pro opačný převod ho vynásobíš maticí M^-1, ale to asi ani nebude potřeba. Výhoda tohoto přístupu je, že si ti zachová správná souřadnice Z pro zbuffer a můžeš konstrukci čtyřúhelníku řešit ve 2D a taky ho ve 2D zobrazit, aniž bys měl problém se zbufferem (ovšem nějaké malé nepřesnosti tam kvůli linearitě zbufferu přesto budou, nicméně nic ti nebrání to převést zpět do 3D, pokud to bude nezbytně nutné). _________________ AMD Open Source Graphics Driver Developer
Naposledy upravil Marek dne 3. leden 2008, 11:07:22, celkově upraveno 1 krát |
|
Návrat nahoru |
|
|
|