Vlákno názorů k článku Grafická knihovna OpenGL (3): základní geometrické prvky od Libor Chocholaty - Proc neni alespon jedna ukazka 3D objektu? Treba...

  • Článek je starý, nové názory již nelze přidávat.
  • 15. 7. 2003 11:53

    Libor Chocholaty (neregistrovaný)

    Proc neni alespon jedna ukazka 3D objektu? Treba dva trojuhelniky se spolecnou hranou nelezici v rovine? Zkousel jsem si do prikladu pridat jeden trojuhelnik zadany pomoci glVertex3i() a nevykreslilo se mi zhola nic.

  • 15. 7. 2003 13:41

    Pavel Tisnovsky (neregistrovaný)

    Přeji pěkný den,

    ukázka vykreslování 3D objektů bude uvedena až v dalších částech tohoto seriálu. K tomuto "nepopulárnímu" kroku jsem se rozhodl z více důvodů.

    Nejdříve si totiž musíme říct základní informace o tom, jak pracuje vykreslovací řetězec OpenGL. Na první pohled to vypadá jako zbytečnost, ale znalost toho, jak OpenGL vykresluje je dobrá pro řešení mnoha problémů.

    Potom je také dobré vědět něco o transformacích a nastavení kamery, protože spousta chyb při programování 3D vzniká z toho, že se kamera dívá někam do pryč a ne na renderovanou scénu.

    A zatřetí, si musíme něco říct o zpracování rastrových dat, protože se nám to bude náramně hodit při texturování.

    A teď k tomu 3D. Pokud jste vycházel například z prvního příkladu uvedeného v minulém dílu, tak tam po menších úpravách klidně můžete vykreslovat 3D objekty. Je však nastavena ortogonální kamera, takže neuvidíte scénu perspektivně, což je však pro první pokusy stejně lepší.

    Potom si všimněte příkazu glOrtho(0, w, 0, h, -1, 1). Tento příkaz určuje šest stěn osově orientovaného hranolu, kde všechny fragmenty ležící mimo tento hranol jsou ořezány. Rovnice stěn hranolu jsou v našem případě: x=0, x=w, y=0, y=h, z=-1, z=1.

    Po zadání příkazů:
    glBegin(GL_TRIANGLES);
    glVertex3i(200, 50,0);
    glVertex3i( 50, 250,10);
    glVertex3i(350, 250,0);
    glEnd();

    se NEvykreslí celý trojůhelník, ale pouze jeho část, protože jeden vrchol leží mimo oblast zadanou hranolem a proto jsou některé fragmenty odstraněny.

    Můžete však samozřejmě změnit rovnice hranolu, např. takto: glOrtho(0, w, 0, h, -1000, 1000); (ve funkci onResize())

    Doufám, že Vám některé z těchto informací pomůžou v dalších pokusech s OpenGL.

  • 15. 7. 2003 16:55

    Libor Chocholaty (neregistrovaný)

    Diky, nakonec jsem to rozchodil. Jen me prekvapilo, ze vykreslovani probiha smerem do zaporne casti osy z, takze staci dat glOrtho(0, w, 0, h, -100, 0);, pokud maji vsechny vrcholy 0<=z<100.

  • 16. 7. 2003 10:38

    Pavel Tišnovský (neregistrovaný)

    Ano, Z-ové souřadnice ořezávacích rovin "near" a "far" pro glOrtho() jsou v našem příkladu negovány. Je to proto, že když kromě funkce glOrtho() nepoužijete žádnou jinou transformaci, je pozice kamery v bodě (0, 0, 0) a kamera se dívá směrem -z.