Miten saan OpenGL:ää käyttäen 3d kappaleisiin perspektiiviä? Pitääkä minun itse laskea nuo muunnokset, vai osaako OpenGL hoitaa homman? Näytää niin kovin luonnottomalta.
Olen vähän aloittelija tässä..
gluPerspective (http://www.opengl.org/sdk/docs/man/xhtml/
asettaa (projektio)matriisin perspektiivi projektio muotoon.
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(JOTAIN);
glMatrixMode(GL_MODELVIEW);
Piirrä_mitä_haluat()
Toinen vaihtoehto, joka tekee saman asian on glFrustum.
Kiitos, gluPerspectiveä ei löytynyt (includessa vain SDL.h ja gl.h) mutta sain tuolla toisella funkkarilla toimimaan. Eteen tuli kuitenkin seuraava ongelma.
Näytöllä on 2 kappaletta, joista toista haluaisin pyörittää. Osaan pyörittää molemia (näyttää siis että kamera pyörisi ympärillä), mutta miten voisin kohdistaa pyörittämiset vain toiseen kappaleeseen?
msdos464 kirjoitti:
Kiitos, gluPerspectiveä ei löytynyt (includessa vain SDL.h ja gl.h) mutta sain tuolla toisella funkkarilla toimimaan.
gluPerspective on tiedostossa "glu.h". (Muista linkittää myös kirjaston glu kanssa kirjaston gl lisäksi.)
msdos464 kirjoitti:
Eteen tuli kuitenkin seuraava ongelma.
Näytöllä on 2 kappaletta, joista toista haluaisin pyörittää. Osaan pyörittää molemia (näyttää siis että kamera pyörisi ympärillä), mutta miten voisin kohdistaa pyörittämiset vain toiseen kappaleeseen?
Sinun pitää asettaa ensimmäisen kappaleen matriisi ja piirtää sitten kappale. Sitten asetat toisen kappeleen matriisin ja piirrät toisen kappaleen. Asioiden helpottamiseksi voit tallantaa nykyisen matriisin pinoon päällimmäiseksi kutsulla glPushMatrix() ja ladata päällimmäisen matriisin pinosta kutsulla glPopMatrix().
glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(jotain); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); Kutsu tässä kappaleille yhteiset glRotate ja glTranslate kutsut jos sellaisia on. Esimerkiksi kameran sijainnista johtuvat siirrot ja kierrot. glPushMatrix(); // tallenna yhteiset arvot sisältävä matriisi. glTranslate(kappale 1); glRotate(kappale 1); Piirrä_kappale_1(); glPopMatrix(); // palauta alkuperäinen matriisi. glPushMatrix(); // tallenna yhteiset arvot sisältävä matriisi. glTranslate(kappale 2); glRotate(kappale 2); Piirrä_kappale_2(); glPopMatrix(); // palauta alkuperäinen matriisi. jne...
Miten saisin jonkun omnivalon sceneen? Tutorialissa sanottiin ainakin se, että glColor3f funkkarilla ei saa laittaa värejä, koska silloin valot ei enää vaikuta niihin. glMaterialfv käytöstä löysinkin esimerkkejä.
Sanottiin myös, että pitää laskea normaalit käytetyille ööh.. tasoille? Varmaan niille kolmioille mistä kuviot koostuvat. Miten tämä onnistuu? Määrittelen kappaleen siten, että on lista kappaleen pisteistä, määritys millä tavalla piirretään (esim. GL_TRIANGLE_STRIP) ja lista missä järjestyksessä pisteissä pitää käydä.
Jostain tutoriaalista sain sellaisen käsityksen, että pitää määrittää jokaiseen pisteeseen tason kuviteltu normaali. Olenko oikeassa?
Jos on esim. kuutio, niin laskisin taulukkoon 8 kärkipisteen normaalit, jotka sojottaisivat siis kuution keskipisteestä poispäin?
edit: ilmeisesti täytyykin laskea polygonien normaalit eikä niiden päätepisteiden..
Lue artikkelini: http://www.suomipelit.com/index.php?c=naytaartikkeli&id=60&s=1
Huomaa, että artikkelin ensimmäinen sivu on aika sekavasti ellei jopa virheellisesti kirjoitettu, mutta en ole kerennyt (lue viitsinyt) korjata.
ps.
Normaalivektorit lasketaan ristitulon avulla.
Asensin aiemmin DevCpp:hen SDL devpakin ja tein uuden projektin "SDL & OpenGL", tuo includeaa ainoastaan <SDL/SDL.h> ja <gl/gl.h>.
Miten saan glut kirjaston asennettua? Latasin zipin missä oli glut32.dll ja glut.h, pistin ne samaan kansioon muiden projektin tiedostojen kanssa ja lisäsin includen glut.h tiedostoon. Linkkeri sanoo:
[Linker error] undefined reference to `__glutInitWithExit@12'
Ja pari muuta funkkaria mitä glut.h yrittää määritellä. Pitääkö tuo dll tiedosto kopioida vielä johonkin toiseen kansioon? Kokeilin laittaa sen "C:\Dev-Cpp\bin" missä sdl.dll oli myös, mutta se ei auttanut.
msdos464 kirjoitti:
Asensin aiemmin DevCpp:hen SDL devpakin ja tein uuden projektin "SDL & OpenGL", tuo includeaa ainoastaan <SDL/SDL.h> ja <gl/gl.h>.
Miten saan glut kirjaston asennettua? Latasin zipin missä oli glut32.dll ja glut.h, pistin ne samaan kansioon muiden projektin tiedostojen kanssa ja lisäsin includen glut.h tiedostoon. Linkkeri sanoo:
[Linker error] undefined reference to `__glutInitWithExit@12'
Ja pari muuta funkkaria mitä glut.h yrittää määritellä. Pitääkö tuo dll tiedosto kopioida vielä johonkin toiseen kansioon? Kokeilin laittaa sen "C:\Dev-Cpp\bin" missä sdl.dll oli myös, mutta se ei auttanut.
Ethän sotke sanoja "glu" ja "glut" keskenään.
glu = GL-utilities: opengl:n mukana tuleva pieni apukirjasto, joka sisältää muutamia elämää helpottavia funktioita kuten tuon gluPerspective(), joka on glFustum() funktion helpompikäyttöinen versio. glu tulee OpenGL:n mukana. Sen kuin vain kirjoitat "#include <glu.h>" rivin "#include <gl.h>" alapuolelle.
glut = GL utility toolkit: erillinen kolmannen osapuolen tekemä kirjasto, joka sisältää funktiot ikkunan luomiseen ja syötteen lukemiseen. Tarkoitettu aloittelijoille alkuun pääsemisen helpottamiseksi, jotta ei tarvitse opetella kuinka ikkuna luodaan jne... SDL ajaa saman asian, eli jos käytät SDL:ää ei ole mitään syytä käyttää glut:ia.
edit.
Tuo virhe "undefined reference to `__glutInitWithExit@12'" tulee siitä, että glut:ista on olemassa kaksi versiota: alkuperäinen ja hieman laajennettu versio, jossa on pari ylimääräistä funktiota, kuten tuo "glutInitWithExit". Jotkin paketit valitettavasti sisältävät otsikkotiedoston ja kirjastotiedoston eri versioista, jolloin tulee kyseinen konflikti. En muista tarkkaan ulkoa, mutta tiedoston glut.h alkuun piti lisätä rivi "#define GLUT_DISABLE_ATEXIT_HACK", jolloin se muuttuu alkuperäiseksi tiedostoksi ja toimii tuon alkuperäisen kirjastotiedoston kanssa. Mutta jos käytät SDL:ää et tarvitse glut:ia ja tämä ei kosketa sinua.
Aiheeseen `__glutInitWithExit@12':
Tässä on ohje, jolla itse sain homman toimimaan. Toivottavasti on vielä ajan tasalla.
EDIT: Ja itse en tarvinnut noin ahkerasti noita Windows-aiheisia linkityksiä, vaan vähempikin riitti. Mutta ei kai niihin kuole. Kituu vähän.
Ahaa... joo eiköhän tekstuuri hommat toimi kun includaa myös tuon glu.h:n. Näytti ainakin kääntyvän ilman virheitä. Kiitoksia taas.
edit: seuraava ongelma. Olen includannut <gl/glu.h> tiedoston, mutta linkkeri valittaa 'gluBuild2DMipmaps@28'... jos sen rivin kommentoi pois, ohjelma kääntyy. Ilmeisesti tuo on ainut glu kirjaston kutsu mitä yritän käyttää. Mitenköhän sen saisi toimimaan? Pitääkö linkkerille lisätä joku parametri "-lsdl" lisäksi?
msdos464 kirjoitti:
edit: seuraava ongelma. Olen includannut <gl/glu.h> tiedoston, mutta linkkeri valittaa 'gluBuild2DMipmaps@28'... jos sen rivin kommentoi pois, ohjelma kääntyy. Ilmeisesti tuo on ainut glu kirjaston kutsu mitä yritän käyttää. Mitenköhän sen saisi toimimaan? Pitääkö linkkerille lisätä joku parametri "-lsdl" lisäksi?
Windowsilla "-lglu32" muilla alustoilla "-lGLU".
Aihe on jo aika vanha, joten et voi enää vastata siihen.