Gå til innhold

egendefinerte matriser i openGL


Anbefalte innlegg

Hvordan kan eg laste inn mine egne matriser for objetene som eg vil rendre i opengl. For camera var det glMultMatrix(mymatrix). Men dersom eg vil bruke min egen matrise til objektene hvordan skal den sendes inn til openGL?

Lenke til kommentar
Videoannonse
Annonse

med glLoadMatrix eller glMultMatrix (avhengig om du vil multiplisere, eller endre matrisen)

Det er jo som kjent ingen "kamera" matrise i OpenGL (objekter må flyttes unna null punkt med modelview matrisen, kun perspektiv og slikt settes opp med projection matris, vanligvis)

glLoadMatrix og glMultMatrix vil alltid operere på den aktive matrisen, som endres med glMatrixMode, og kan være GL_MODELVIEW, GL_PROJECTION eller GL_TEXTURE

For å hente tilbake matrisen, bruker du glGet meg GL_MODELVIEW_MATRIX, GL_PROJECTION_MATRIX eller GL_TEXTURE_MATRIX.

 

Matrisen er column major, altså, de går fra top-ned, høyre-mot venstre (altså vanlig)

Lenke til kommentar
med glLoadMatrix eller glMultMatrix (avhengig om du vil multiplisere, eller endre matrisen)

Det er jo som kjent ingen "kamera" matrise i OpenGL (objekter må flyttes unna null punkt med modelview matrisen, kun perspektiv og slikt settes opp med projection matris, vanligvis)

glLoadMatrix og glMultMatrix vil alltid operere på den aktive matrisen, som endres med glMatrixMode, og kan være GL_MODELVIEW, GL_PROJECTION eller GL_TEXTURE

For å hente tilbake matrisen, bruker du glGet meg GL_MODELVIEW_MATRIX, GL_PROJECTION_MATRIX eller GL_TEXTURE_MATRIX.

 

Matrisen er column major, altså, de går fra top-ned, høyre-mot venstre (altså  vanlig)

9116677[/snapback]

 

Har fått til kamera...

Men dersom eg skal lage en roterende kube (bare for å ta noe) blir det da

glMatrixMode( GL_MODELVIEW );

glMultMatrix( rotasjonsmatrise_til_kuba );

 

Og i såfall hva skjer om eg vil ha flere kuber med forskjellige matriser?

Lenke til kommentar

Da burde du bruke glPushMatrix og glPopMatrix.

glPushMatrix vil lagre den aktive matrisen i stack, og glPopMatrix vil da hente den tilbake.

 

Matrisen vil fungere i modelview som om du flytter eller roterer verdens referansepunkt, beste måten å lære seg det på, er rett og slett bare å prøve seg fram. Det vil virke logisk hvis du leker deg litt med det.

Men vær obs på at hvis du flytter "kameraet" med GL_PROJECTION_MATRIX vil blant annet tåkeberegninger bli feil, eller ikke slik man som oftest ville ønsket dem.

 

Så et eksempel på hvordan man tegner flere objekter, og roterer dem litt

 

glMatrixMode(GL_PROJECTION);
glLoadMatrix(camera.ProjectionMatrix);
glMatrixMode(GL_MODELVIEW);
glLoadMatrix(camera.ModelMatrix);
glPushMatrix(); // Lagre den aktive matrisen på stack
 glMulMatrix(cube0.Matrix);
 cube0.Render();
glPopMatrix(); // Hent tilbake den aktive matrisen
glPushMatrix();
 glMulMatrix(cube1.Matrix);
 cube1.Render();
 glPushMatrix();
   glMulMatrix(cube2.Matrix);
   cube2.Render();
 glPopMatrix();
glPopMatrix();

 

Når vi først er inne på det, så foretrekker jeg å bruke matriser, framfor å lagre Position, rotation og scale etc, men vet noen om det er noen måte å hente tilbake roteringsverdiene tilbake fra en matrise? scale og position er jo grei nok.

Endret av GeirGrusom
Lenke til kommentar

Det viser seg at kamerat ikke er riktig.

 

draw metoden

glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
glMatrixMode(GL_MODELVIEW);
   	glLoadIdentity();

   camera->SetPrespective()

 

Camera::SetPrespective()

Quaternion q;
Matrix matrix;
pitch.CreateFromAxisAngle(1.0, 0.0, 0.0, pitchDegree);
heading.CreateFromAxisAngle(0.0, 1.0, 0.0, headingDegrees);
// combine pitch and heading
q = pitch * heading;
matrix = q.GetMatrix();
matrix.Translate(position.x, position.y, position.z);
//use the matrix in openGL
glMultMatrixf(matrix.mtx);

 

Lager en totasjonsmatrise og legger til translasjone.

 

Men når det kjører så blir modellen roert i stedet for verden. Det skal være et first-person kamera. Men når det skal bevege seg i x, z retning så blir ikke aksene rotert slik at z retning alltid blir "rett fram".

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...