[OpenGL/LWJGL/JAVA] glTranslatef werkt niet

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • windwarrior
  • Registratie: Januari 2009
  • Laatst online: 12-07-2024

windwarrior

ʍıupʍɐɹɹıoɹ

Topicstarter
Hallo Allen,

Ik ben een paar dagen geleden begonnen met OpenGL, gewoon voor de lol, maar ik kom er niet uit. Het probleem is dat iets wat volgens een tutorial zou moeten werken, niet werkt...

Allereerst een stukje code wat wel werkt (ik heb org.lwjgl.opengl.GL11. statisch geimporteerd, voor het gemak):

Java:
1
2
3
4
5
6
7
8
9
10
11
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glBegin(GL_TRIANGLES);
// Java byte is -128 tot 127 in tegenstelling tot die van C
        glColor3b((byte)127, (byte)0, (byte)0);
        glVertex3f(0.0f,1.0f,0.0f);
        glColor3b((byte)0, (byte)127, (byte)0);
        glVertex3f(-1.0f,-1.0f,0.0f);
        glColor3b((byte)0, (byte)0, (byte)127);
        glVertex3f(1.0f,-1.0f,0.0f);
glEnd();


maakt heel netjes:

Afbeeldingslocatie: http://i54.tinypic.com/207sys5.png


Maar nu wil ik meerdere vormen op hetzelfde canvas tekenen, volgens een tutorial van NeHe (dat is een C tutorial, maar het gaat over OpenGL en er is een geporte versie naar LWJGL)

Helaas, als ik de regel
Java:
1
glTranslatef(-1.5f,0.0f,-6.0f);

onder glLoadIdentity toevoeg, krijg ik zwarte output, terwijl volgens de tutorial er een kleinere driehoek zou moeten verschijnen.

Ik heb me al suf gegoogled, maar ik kan niet vinden wat ik nou fout doe.

Alvast bedankt!

[ Voor 5% gewijzigd door windwarrior op 15-04-2011 19:44 . Reden: een kleinigheidje met de image ]


Acties:
  • 0 Henk 'm!

  • MacWolf
  • Registratie: Januari 2004
  • Laatst online: 06-09-2024
Waarschijnlijk heb je de "diepte" van de camera niet goed ingesteld. Je moet dus 6 eenheden ver kunnen kijken om de driehoek te zien. Kan je de code laten zien waarmee je de scene (bijv. via glOrthof) opzet?

[ Voor 5% gewijzigd door MacWolf op 15-04-2011 19:46 ]

Microsoft Windows: A thirty-two bit extension and graphical shell to a sixteen-bit patch to an eight-bit operating system originally coded for a four-bit microprocessor which was written by a two-bit company that can't stand one bit of competition.


Acties:
  • 0 Henk 'm!

  • windwarrior
  • Registratie: Januari 2009
  • Laatst online: 12-07-2024

windwarrior

ʍıupʍɐɹɹıoɹ

Topicstarter
Volgens de tutorial was dat niet noodzakelijk, ook in de LWJGL versie niet, dit is alles wat related is aan OpenGL

NeHe tutorial (onderaan de LWJGL versie)

[ Voor 6% gewijzigd door windwarrior op 15-04-2011 19:47 ]


Acties:
  • 0 Henk 'm!

  • MacWolf
  • Registratie: Januari 2004
  • Laatst online: 06-09-2024
windwarrior schreef op vrijdag 15 april 2011 @ 19:47:
Volgens de tutorial was dat niet noodzakelijk, ook in de LWJGL versie niet, dit is alles wat related is aan OpenGL

NeHe tutorial (onderaan de LWJGL versie)
Toch denk ik dat dit het probleem is. Ik vermoed dat je de driehoek nog kan zien zolang de z-waardes tussen de 0 en 1 zitten, maar iedere z-waarde groter als 1 wordt waarschijnlijk niet getoond. Wat is bijvoorbeeld het resultaat met de volgende mogelijkheden?

1:
Java:
1
glTranslatef(-1.5f,0.0f,-0.9.0f);


2:
Java:
1
glTranslatef(-1.5f,0.0f,-1.0.0f);


3:
Java:
1
glTranslatef(-1.5f,0.0f,-1.1.0f);

Microsoft Windows: A thirty-two bit extension and graphical shell to a sixteen-bit patch to an eight-bit operating system originally coded for a four-bit microprocessor which was written by a two-bit company that can't stand one bit of competition.


Acties:
  • 0 Henk 'm!

  • NC83
  • Registratie: Juni 2007
  • Laatst online: 04-06 02:18
Gebruik je ook dit wat ook in de tutorial staat:
C++:
1
2
3
4
5
6
7
8
glMatrixMode(GL_PROJECTION); // Select The Projection Matrix
glLoadIdentity(); // Reset The Projection Matrix

// Calculate The Aspect Ratio Of The Window
gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f);

glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
glLoadIdentity();                               


GL_PROJECTION is de projectie stack die GL gebruikt om objecten van camera space naar screen space te transformeren.
GL_MODELVIEW is de stack die GL gebruikt om van model space naar camera space te transformeren. Deze combineert de camera matrix en wereld matrix van een object in een stack.

glMatrixMode is een functie die gebruikt wordt om te bepalen op welke stack de volgende matrix transformaties van toepassing zijn.

gluPerspective is een functie die een matrix creeert die een perpectief projectie voorstelt.
-De eerste parameter is de FOV(Field of View) van de camera in x graden of radialen hangt van de functie af.
-De tweede parameter is de aspect ratio van je viewport, breedte en hoogte van je window vaak, maar kan ook anders zijn als je naar een texture rendert.
-De derde parameter is hoever de near plane van je camera punt is
-De vierde parameter is hoever je far plane van je camera is.

Dingen die zich in de afgeknote piramide bevinden zijn zichtbaar, de near plane is de bovenkant van deze piramide en de far de onderkant.

[ Voor 65% gewijzigd door NC83 op 15-04-2011 20:03 ]

ex-FE Programmer: CMR:DiRT2,DiRT 3, DiRT Showdown, GRID 2, Mad Max


Acties:
  • 0 Henk 'm!

  • MacWolf
  • Registratie: Januari 2004
  • Laatst online: 06-09-2024
@NC83: ja, dat is ook een goed punt, de bewerkingen inderdaad wel uitgevoerd worden op de modelview matrix, dus dit is wel aan te raden:

Java:
1
2
3
4
5
6
7
8
9
10
11
12
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
glMatrixMode(GL_MODELVIEW);
glLoadIdentity(); 
glBegin(GL_TRIANGLES); 
// Java byte is -128 tot 127 in tegenstelling tot die van C 
        glColor3b((byte)127, (byte)0, (byte)0); 
        glVertex3f(0.0f,1.0f,0.0f); 
        glColor3b((byte)0, (byte)127, (byte)0); 
        glVertex3f(-1.0f,-1.0f,0.0f); 
        glColor3b((byte)0, (byte)0, (byte)127); 
        glVertex3f(1.0f,-1.0f,0.0f); 
glEnd();

Microsoft Windows: A thirty-two bit extension and graphical shell to a sixteen-bit patch to an eight-bit operating system originally coded for a four-bit microprocessor which was written by a two-bit company that can't stand one bit of competition.


Acties:
  • 0 Henk 'm!

  • windwarrior
  • Registratie: Januari 2009
  • Laatst online: 12-07-2024

windwarrior

ʍıupʍɐɹɹıoɹ

Topicstarter
de opmerking van NC83 heeft me geholpen, nu rest me alleen de vraag waarom het zonder dat wel in C werkt en niet in JAVA.

Uiteindelijk moest ik inderdaad de volgende regels toevoegen:

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
private void initGL() {

        glMatrixMode(GL_PROJECTION); // Select The Projection Matrix
        glLoadIdentity(); // Reset The Projection Matrix

        // Calculate The Aspect Ratio Of The Window
        GLU.gluPerspective(
                45.0f,
                (float)(800/600),
                0.1f,
                100.0f);
        glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix

        // Really Nice Perspective Calculations
        glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
    }


Ik wil jullie bedanken voor de hulp, en het spijt me dat ik niet verder gekeken heb dan mijn neus lang is ;(

Acties:
  • 0 Henk 'm!

  • NC83
  • Registratie: Juni 2007
  • Laatst online: 04-06 02:18
glTranslatef vermenigvuldigde de translatie matrix die je creeert met de huidige matrix die in de huidige geselecteerde stack staat.

Wat dit wil zeggen is dat als GL_PROJECTION de huidige matrix stack is je met een translatef niet meer enkel projecteerd maar dat je projectie ook verschoven is.

ex-FE Programmer: CMR:DiRT2,DiRT 3, DiRT Showdown, GRID 2, Mad Max


Acties:
  • 0 Henk 'm!

  • The Flying Dutchman
  • Registratie: Mei 2000
  • Laatst online: 22-05 20:15
De NeHe tutorials zijn nogal oud en gebruiken daarnaast functionaliteit die in de nieuwste OpenGL versies deprecated is. Op zich prima om zo te beginnen (ben zelf ook ooit met de NeHe tutorials begonnen en er zullen vele anderen zijn) en de glBegin, glColor, glVertex, glEnd functionaliteit maakt het wel heel makkelijk om snel wat neer te zetten. Maar hou er rekening mee dat het op deze manier OpenGL doen heel traag is (omdat voor iedere vertex de processor een commando naar de videokaart moet sturen, dat levert veel vertraging op) en deprecated.

Je zou ook eens kunnen kijken naar een nieuw online boek dat OpenGL vanaf stap 1 uitlegd, maar dan wel de moderne variant van OpenGL:

http://openglbook.com/

Er komen steeds nieuwe hoofdstukken bij (ik geloof iedere paar weken weer een hoofdstuk ofzo).
Andere mogelijkheden zijn om bijvoorbeeld de OpenGL superbible (5th edition) aan te schaffen (heb zelf de 4th edition, dat was een heel goed boek, overweeg om ook de 5th edition te kopen omdat deze op OpenGL 3 en hoger gericht is).

The Flying Dutchman


Acties:
  • 0 Henk 'm!

  • windwarrior
  • Registratie: Januari 2009
  • Laatst online: 12-07-2024

windwarrior

ʍıupʍɐɹɹıoɹ

Topicstarter
Bedankt voor de tip! ik ga dan maar kijken naar die andere Tutorial, her is natuurlijk niet zo handig om het verkeerde aan te leren.

Overigens, dit is voor OpenGL 4.0 (of 3.0), maar verliest men niet wat compatibiliteit door alleen 3.0 en 4.0 te ondersteunen?

[ Voor 64% gewijzigd door windwarrior op 17-04-2011 21:55 ]


Acties:
  • 0 Henk 'm!

  • The Flying Dutchman
  • Registratie: Mei 2000
  • Laatst online: 22-05 20:15
windwarrior schreef op zondag 17 april 2011 @ 21:50:
Bedankt voor de tip! ik ga dan maar kijken naar die andere Tutorial, her is natuurlijk niet zo handig om het verkeerde aan te leren.

Overigens, dit is voor OpenGL 4.0 (of 3.0), maar verliest men niet wat compatibiliteit door alleen 3.0 en 4.0 te ondersteunen?
Ja, dat is natuurlijk wel een goeie opmerking waar ik wellicht iets te snel aan voorbij ben gegaan ;). OpenGL 3.0 (en hoger) vereist DirectX 10 hardware. OpenGL 4.0 vereist DirectX 11 hardware. Onder Mac OSX is momenteel alleen nog maar ondersteuning voor OpenGL 2.1, hoewel deze zomer Mac OSX 10.7 (Lion) uitkomt die OpenGL 3.2 heeft.

The Flying Dutchman

Pagina: 1