Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » OpenGL » Kameraklasse, rotation mit gluLookAt

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
20.08.2008, 21:04 Uhr
cmos



Hallo,
ich habe eine Kameraklasse die mit gluLookAt arbeitet. Ich kann mich durch die Szene bewegen und rotieren funktioniert auch.
Allerdings möchte ich nun noch einbauen das man um einen Punkt die Kamera rotieren kann.
Um den Urpsrung, also 0,0,0 , würde mir schon erstmal reichen.

Bisher sieht die rotations funktio wie folgt aus. Bietet aber noch keine Rotation um einen
Punkt.

C++:
void CCamera::RotateX(float fArg)
{
    m_mRotationMatrix.SetXRotationMatrix(fArgument);    
    m_vViewVector = (m_mRotationMatrix * m_vViewVector).Normalize();    
    m_vUpVector   = (m_mRotationMatrix * m_vUpVector).Normalize();
      //m_vUpVector =  Vector3f::CrossProduct(m_vViewVector,m_vRightVector);
}



Mein Problem dabei ist, das die Rotationen, wenn ich sie mische, also x rotieren, y rotieren usw. nicht ganz stimmen. Wenn ich nur in eine richtung rotiere funktioniert es, aber wenn z.b. auf eine x rotation eine y rotation folgt, dann wird die y rotation nicht korrekt ausgeführt. Sieht manchmal so aus, als würde dann das Objekt nicht um y rotieren sonder wie ein Uhrenpendel hin und herschwingen.

Als erstes kam mir die Idee, die Kameraposition in den Ursprung zu verlgen, da das der Punkt ist um den ich rotieren möchte. Ich speichere also den Vektor von Kamera zu Ursprung, da der Betrag mir ja auch die Distanz zwischen Kamera und Punkt gibt. Dann setz ich die Kameraposition auf 0,0,0, rotiere dort die Kamera. Dann bilde ich einen Vektor von der Kameraposition (jetzt 0,0,0) zum rotierten Viewvector der Kamera. dieser wird normalisiert und mit dem Betrag des gespeicherten Distanzvektors multipliziert. Dann verschiebe ich die Kamera entlang dieses Vektors wieder zurück, allerdings in eine neue Position die aber genauso weit entfernt ist, wie vor der rotation.
Der Aufruf von gluLookAt sieht dann bei mit so aus.


C++:
void CCamera::SetCameraPosition()
{
       //m_vTargetPos ist bei mir der URsprung also 0,0,0 um den ich rotieren möchte
    Vector3f vViewPoint = m_vTargetPos - m_vPosition;

    gluLookAt(m_vPosition.X(),m_vPosition.Y(),m_vPosition.Z(),
              vViewPoint.X(),vViewPoint.Y(),vViewPoint.Z(),
              m_vUpVector.X(),m_vUpVector.Y(),m_vUpVector.Z()
             );
}



Das hat nicht so richtig funktioniert, eigentlich gar nicht.
Als nächstes habe ich dann probiert, einfach die Kameraposition zu rotieren und dann,
bei gluLookAt einen Vektor von der Kamera zum Ursprung zu bilden. Also guckt die Kamera ja dann jedensmal nach dem rotieren auf 0,0,0. Der Up Vector und Right Vector der Kamera sind ja relativ zur Kameraposition, deswegen hab ich mir gedacht, das diese Variante funktionieren müsste.
gluLookAt sieht hier so aus wie oben schon erwähnt.

Manchmal kam es auch vor, das sich das Objekt ab einen bestimmten Winkel in die entgegengesetzte Richtung gedreht hat, dann wieder beim Rückrotieren ab einer stelle wieder in die Entgegengesetzte Richtung usw.

Kann mir jemand bitte weiterhelfen ? Ich möchte gluLookAt gern beibehalten, da ich mich mit glMultMatrix usw noch nicht so auskenne bzw. nicht weiß wie ich da um einen bestimmtn Punkt rotiere und 2. benötige ich spätere bearbeitung den Viewvektor der Kamera.


Hier noch der code für die 2 Versuche um den Punkt zu rotieren

C++:
void CCamera::RotateCameraX(float fArgument)
{    
    //Vector3f vDistance = m_vTargetPos - m_vPosition;
    //// rotate camera X
    //m_mRotationMatrix.SetXRotationMatrix(fArgument);    
    //m_vViewVector = (m_mRotationMatrix * m_vViewVector).Normalize();    
    //m_vUpVector   = (m_mRotationMatrix * m_vUpVector).Normalize();

        //1. Variante
    //// set camera to origin
    //m_vPosition.SetAll(0.0f, 0.0f, 0.0f);

    //// compute direction vector from Null position to view vector
    //Vector3f vDirection = m_vViewVector - m_vPosition;
    //
    //// translate cameraposition in direction-vector direction
    //m_vPosition = m_vPosition + (vDirection * -vDistance.Magnitude());



    // 2. Variante
    //m_mRotationMatrix.SetXRotationMatrix(fArgument);
    //m_vPosition = m_mRotationMatrix * m_vPosition;
    
}



Grüße,
und dank schon im Vorraus

cmos

Dieser Post wurde am 20.08.2008 um 21:06 Uhr von cmos editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
27.08.2008, 12:26 Uhr
~MisterX
Gast


www.codecolony.de/download/camera2/Camera2_SrcExeDoc.zip

www.codecolony.de/download/camera2/Camera2_SrcExe.zip
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
27.08.2008, 18:00 Uhr
cmos



Danke für die Links, kenne ich schon. Die Kamera läuft aber nur durchs Level. Das kann meine auch. Aber ich habs jetzt irgendwie gelöst.

Grüße & Danke,
cmos
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ OpenGL ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: