Gå til innhold

[Løst] Sliter med transformering av kamera i C++ OpenGL


Anbefalte innlegg

Hei,

 

Jeg har laget en Viewer-klasse for min OpenGL applikasjon, men sliter litt med plassering av kamera. Kameraet har et fokuspunkt, en rotasjon, og en gitt avstand fra fokuspunktet. Det jeg sliter med å skjønne er hvordan jeg får kombinert de tre transformasjonene på riktig måte for å oppnå det jeg vil, som består av tre punkter:

 

1) Først skal kameraet flytte seg til fokuspunktet.

2) Så skal kameraet roteres.

3) Sist skal kameraet flyttes bakover en gitt avstand.

 

Mat4 Viewer::getCameraMatrix()
{
Mat4 mt1 = Mat4::translationMatrix(-m_camera_focus);
Mat4 mt2 = Mat4::translationMatrix(-Vec3(0.0f, 0.0f, m_camera_distance));
Mat4 mr = Mat4::rotationMatrix(-m_camera_orientation);
return (mt2 * mr) * mt1;
}

 

Så skal jeg kunne rotere kameraet med musen, som er implementert og funker, og bevege kameraet langs sitt eget koordinatsystem. Det siste har jeg gjort på følgende måte:

 

void Viewer::translateCamera(Vec3 camera_translation)
{
Vec3 world_translation;
Mat4 mat;

// Translate the camera in camera coord space.
mat = Mat4::rotationMatrix(m_camera_orientation).transpose();
world_translation = transform(camera_translation, mat);

// Add it to the current camera position.
m_camera_focus += world_translation;
}

 

camera_translation er kameraets bevegelse langs sitt eget koordinatsystem, og world_translation er den transformerte av nevnte og rotasjonsmatrisen for kameraets rotasjon.

 

Jeg har fått til rotasjon og zoom, men uansett hvor jeg setter inn fokuspunkttranslasjonen så beveger kameraet seg feil vei ved translateCamera. Jeg ser heller ikke hvordan jeg transformerer camera_position feil.

 

Håper noen smarte sjeler har et godt svar! ;)

 

Edit: Fant det ut. Transposerte rotasjonsmatrisen i translateCamera for å gjøre om fra camera space til world space. Ved en rotasjonsmatrise er jo transpose det samme som inverse. Oppdaerte kode til å reflektere endringen.

Endret av LostOblivion
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...