Hier habe ich nun den Effekt das sich die Kamera "Wegdreht":
1. Bild: Vor dem Tastendruck, Kamera hat Koordinaten: Posi=0:0:-2 Targ=0:0:-1 Up=0:1:-2 2. Bild: Nach dem Tastendruck, Kamera hat Koordinaten: Posi=1:0:-2 Targ=1:0:-1 Up=1:1:-2
Wenn ich mir die Koordinaten angucke sieht das eigentlich so aus wie ich mir das auch gedacht habe, nur gerendert passt es nicht
Registriert: Di Apr 29, 2008 18:56 Beiträge: 1213
Programmiersprache: Delphi/FPC
Hey,
du musst dir den Vektor berechnen, der nach rechts bzw. links zeigt. Dazu Bildest du einfach das VektorProdukt aus m_UpVector und m_TargetVector. Und dann addierst du zu deinem m_PositionVector den Berechneten (evtl noch mit einem Faktor skalieren, das es nich zu weit verrückt)
Ich glaube das Problem ist das m_UpVector bei dir ein Punkt und eben kein Vektor (Richtung) ist. Es ist ratsam entsprechende Namen für deine Variablen zu verwenden. Jedenfalls erwartet gluLookAt für die letzten drei Argumente einen Vektor, keinen Punkt.
du musst dir den Vektor berechnen, der nach rechts bzw. links zeigt. Dazu Bildest du einfach das VektorProdukt aus m_UpVector und m_TargetVector. Und dann addierst du zu deinem m_PositionVector den Berechneten (evtl noch mit einem Faktor skalieren, das es nich zu weit verrückt)
Das is im Prinzip das was ich mache, geht aber nicht.
Zitat:
Ich glaube das Problem ist das m_UpVector bei dir ein Punkt und eben kein Vektor (Richtung) ist. Es ist ratsam entsprechende Namen für deine Variablen zu verwenden. Jedenfalls erwartet gluLookAt für die letzten drei Argumente einen Vektor, keinen Punkt.
Nene, m_UpVector ist schon n Vector, wird auch verschoben, aber irgentwie wohl nicht richtig. So rufe ich gluLookAt() am beim Rendern auf:
Ok, nehmen wir an der Vektor (0,1,0) zeigt nach oben. Jetzt gehst du 2 Meter nach vorne, ein 3.5 Meter nach links und drehst dich dreimal im Kreis (auf der XZ-Ebene). Wo ist jetzt oben? => Immer noch (0,1,0) Also gar nichts machen solange du nicht außerhalb der XZ-Ebene rotierst.
Registriert: Di Apr 29, 2008 18:56 Beiträge: 1213
Programmiersprache: Delphi/FPC
Hey,
less dir nochmal genau schritt für schritt durch was ich geschrieben habe. Und dann mach es genau so wie ich es geschrieben habe: -VektorProdukt (SideVector) aufstelln: SideVector = m_TargetVector x m_UpVector -berechneten Vektor (SideVector) auf Punkt dazu addieren (evtl skalieren): m_PositionVector += SideVektor*Faktor -FERTSCH^^
Du ziehst bei dir von den Vektoren noch die Position ab, bevor du das VektorProdukt aufstellst, das is aber unsinnig. Was sollten das dann für Vektoren sein? Und dann addierst du den Vektor (SideVektor) nicht nur auf die Position, sondern auch auf die Vektoren, das ist auch nicht richtig, wie Coolcat dir ja schon erklärt hat
Registriert: Di Apr 29, 2008 18:56 Beiträge: 1213
Programmiersprache: Delphi/FPC
Hey,
nein das liegt daran, das du schon wieder den m_TargetVector änderst. Nochma zur Erklärung: die Vektoren (m_TargetVector und m_UpVector) geben nur an, in welche Richtung die Kamera guckt. m_TargetVector ist die Richtung in die die Kamera guckt, da das aber eine Achse ist, auf der man die Kamera noch 360° drehen kann muss man noch einen 2. Vektor angeben. Das is m_UpVector, der sagt der Kamera wo oben ist. Die haben rein gar nix mit der Position zu tun, nur mit der Ausrichtung. Du willst aber nur die Position ändern, also darfst du auch nur m_PositionVector ändern! Un die ganzen Zwischenschritte über die Variablen könnte man sich auch sparen:
Ok, wenn ich das so mache bewegt sich die Kamera parabellförmig auf der XZ-Ebene von dem Zylinder weg.
Also die 3 Punkte bzw. Vektoren die ich gluLookAt übergebe, liegen in welchen Koordinatensystem? Ich hab das jetzt so verstanden das Position und Target im Welt-System liegen, und was Coolcat gesagt hat habe ich so verstanden das der UpVector seinen Ursprung in der Kamera-Position hat. Am Anfang habe ich gedacht alle liegen im Welt-System. Oder ist es so das nur die Position in dem Welt-System liegt und Up und Target sind relativ zur Position? Irgentwie bin ich jetzt noch verwirrter wie vorher
Ich hab das jetzt so verstanden das Position und Target im Welt-System liegen, und was Coolcat gesagt hat habe ich so verstanden das der UpVector seinen Ursprung in der Kamera-Position hat.
Das ist auch richtig so. Allerdings ist ein Vektor eine Richtung und hat keinen Ursprung in dem Sinne, aber ich denke du meinst das richtige.
Vermutlich rufst du gluLookAt an der falschen Stelle auf. Es müsste eigentlich in etwa wie folgt richtig sein. (Ich nutze meine eigene Math-Lib...da ist das alles anders.)
// width=breite des glfensters, height = höhe des glfensters, fov nehme ich hier 45 grad double top = m_dPlanNear * tan(m_dFieldOfView * PI /360) * m_dZoomFactor; m_Frustum.Top = top; m_Frustum.Bottom = (-top); m_Frustum.Left = (-top * (double)width/(double)height); m_Frustum.Right = (top * (double)width/(double)height); glFrustum(m_Frustum.Left, m_Frustum.Right, m_Frustum.Bottom, m_Frustum.Top, m_dPlanNear, m_dPlanFar);
glMatrixMode(GL_MODELVIEW); glLoadIdentity();
// m_PositionVector, m_TargetVector und m_UpVector sind QVector3D. x,y,z sind double gluLookAt(m_PositionVector.x(), m_PositionVector.y(), m_PositionVector.z(), m_TargetVector.x(), m_TargetVector.y(), m_TargetVector.z(), m_UpVector.x(), m_UpVector.y(), m_UpVector.z()); glPushMatrix(); m_bRender(); // zeichnet den Zylinder in einem Würfel von -0.5/-0.5/-0.5 bis 0.5/0.5/0.5 glPopMatrix();
Registriert: Di Apr 29, 2008 18:56 Beiträge: 1213
Programmiersprache: Delphi/FPC
Hey,
ich glaub uns is da ein kleiner fehler unterlaufen... Das Target ist kein Vektor, sondern der Punkt auf den die Cam blickt (siehe hier) Da is das ganze n bisl anders. Da musst du dir als erstes den TargetVektor aufstellen, dann das Vektorprodukt berechnen und dann die Position und das Target verschieben. Also so ungefähr:
Code:
TargetVector = m_PositionVector - m_TargetVector; //Bitte änder TargetVector in deinem Code um (TargetPos), nich das es dich wieder verwirrt!!! VecProd = crossProduct(m_UpVector, TargetVector)*Faktor; m_PositionVector += VecProd; m_TargetVector += VecProd;
Hier das ganze nochma in Pascal, da ich mich mit C nicht so richtig auskenn. Das ist 1 zu 1 aus meinem Bsp-Prog. kopiert, mit dem es funktioniert:
Code:
if gluIsKeyDown(VK_LEFT) then begin TargetVec[0] := CamPos.Pos[0] - CamPos.Target[0]; TargetVec[1] := CamPos.Pos[1] - CamPos.Target[1]; TargetVec[2] := CamPos.Pos[2] - CamPos.Target[2];
Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.