Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Sa Jun 08, 2024 02:09

Foren-Übersicht » Programmierung » Mathematik-Forum
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 3 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Kamera nach Sprung anpassen
BeitragVerfasst: So Aug 15, 2010 10:40 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Okt 03, 2007 14:22
Beiträge: 388
Hi,

ich werde hier zur Veranschaulichung etwas OpenGL-Code zeigen, allerdings geht es um das Finden eines Vektors, daher auch im Mathematik-Forum. Es endet zwar im Endeffekt in OpenGL-Code, aber auch dieser setzt sich ja aus Mathematik zusammen. Habe hier außerdem einige mathematische Skizzen bei den ganzen Überlegungen gezeichnet, daher finde ich es hier im Mathematik-Forum deutlich besser aufgehoben.
Ich will mit der Kamera gezielte Sprünge machen. Das klappt gut, ich setze die Position der Kamera und das war's auch schon fast. Allerdings will ich die Kamera dann Richtung (0,0,0) blicken lassen (dort liegt in meinem Sonnensystem die Sonne), damit man nicht irgendwo in die Skysphere reinschaut und sich fragt "Wohin schaue ich gerade eigentlich ?". Und jetzt kommt das kleine Bisschen Code:
Code:
procedure TCamera.Apply;
begin
  glRotatef(Cam[0], 1.0, 0.0, 0.0);
  glRotatef(Cam[1], 0.0, 1.0, 0.0);
  glTranslatef(Pos[0], Pos[1], Pos[2]);
end;

Cam[0] gibt den Neigungswinkel der Kamera an (stellt Euch vor es geht eine Gerade aus der Sonne bei (0,0,0) raus und man addiert auf die Gerade nach "oben" einen Winkel drauf) und Cam[1] stellt die Blickrichtung dar (vergleichbar mit der horizontalen Bewegung des Auges). Nun muss ich Cam[1] so anpassen, dass der Betrachter Richtung Sonne schaut - keine Angst er ruiniert sich die Augen dabei auch nicht ;). Wir haben: Die Position des Betrachters VOR der Verschiebung der Kamera und NACH der Verschiebung der Kamera. Also stellt Euch vor Ihr wärt gerade zwischen Neptun und Pluto und teleportiert Euch jetzt zu Neptun rüber. Dann habt Ihr die alte Position mit den Starteinstellungen (siehe folgender Codeblock) und die neue Position.
Code:
procedure TCamera.Reset;
begin
  Cam[0] := 0;
  Cam[1] := 0;
  Cam[2] := 0;
  Pos[0] := 0;
  Pos[1] := 0;
  Pos[2] := -30;
end;

Die Punkte sind brauchbar, die Sonne liegt bei (0,0,0), was heißt dass das Negativ des Punktes gleich dem Vektor ist. (PosSonne-PosKamera = -PosKamera, da PosSonne = 0). Dann dachte ich mir man könne einfach die alte Position speichern, einen Vektor Richtung Sonne bauen und einen Vektor aus der neuen Position ebenso bauen. Dann noch Skalarprodukt drauf loslassen, also arccos((v1*v2)/(|v1|*|v2|)). Ich überlege schon sehr lange dran rum und habe auch einige Skizzen. Schaut man die Skizzen an, sieht man: Der Winkel den ich aus den beiden Vektoren berechnet habe liegt bei der Sonne an. Aber meine Kamera rotiert ja nicht wirklich um die Sonne rum, es ist eine Freelook-Kamera. Ich frage mich daher welchen Winkel ich überhaupt berechnen muss. Da ich erst rotiere und dann verschiebe sieht das so aus als wäre das falsch. Müsste ich nicht erst ein glTranslate in die Sonne rein machen und dann um den Winkel drumherum rotieren ? Die Gefahr ist halt ob man sich dann nicht die Kamera halbwegs zerschießt. Was bloß erstmal am wichtigsten ist: Stimmt die mathematische Überlegung von mir ? Denn wenn die falsch ist braucht man sich über sowas wie Rotationspunkt ja gar keine Gedanken machen, da die Zahlen welche ich mir berechne und dann in Cam[1] setze schon falsch sind. Hier ein Auszug aus der Log-Datei, welcher die Cam[1]-Werte abspeichert während ich hier noch dran rumwerkel:
Code:
STATUS [11:32:53] 0,732707964660196 @Cam[1]
STATUS [11:32:53] 0,973007532556552 @Cam[1]
STATUS [11:32:53] 1,17325203469661 @Cam[1]
STATUS [11:32:54] 1,31341984675606 @Cam[1]
STATUS [11:32:54] 1,49363095629698 @Cam[1]
STATUS [11:32:54] 1,69385858679666 @Cam[1]
STATUS [11:32:54] 1,87405643522708 @Cam[1]
STATUS [11:32:55] 2,0742675741041 @Cam[1]

Dabei teleportiere ich mich zu Pluto und das in sehr kurzen Abständen. Der ist sehr weit draußen schon, von den Zahlen her ist das okay. Doch hatte ich ähnliche Zahlen gestern schon und naja, hat offensichtlich nicht so ganz gestimmt. Wenn es stimmt dann wäre da halt noch die Frage wie ich das am geschicktesten anstelle. Denn die Winkel in dem Array Cam werden von der Maus auch beeinflusst, da Freelook.

Gruß,
Nils

_________________
Meine Musik: spiker-music.net


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Kamera nach Sprung anpassen
BeitragVerfasst: So Aug 15, 2010 12:12 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Dez 11, 2009 08:02
Beiträge: 532
Programmiersprache: pascal (Delphi 7)
Code:
arccos((v1*v2)/(|v1|*|v2|))

nicht so ganz. das ist der Winkel zwischen den beiden Vektoren. Du rotierst aber einzeln um x und y Achse.

Code:
v1y0:= v1;
v1y0.y:= 0;

v2y0:= v2;
v2y0.y:= 0;

cam[1] += arccos((v1y0*v2y0)/(length(v1y0)*length(v2y0))) * RadToDeg;
cam[0]:= arccos((v1y0*v1)/(length(v1y0)*length(v1))) * RadToDeg
unter der Vorraussetzung, dass v1 der neue Vektor ist. Bei cam[1]+= ... gehört abhängig davon, in welche Richtung gedreht wurde ein -=.

Einfacher dürfte es allerdings werden, wenn du als alten Vektor gleich die z-Achse wählst. Dann aber nicht +=, sondern :=. Dann ist das Vorzeichen einfach sign(v1.x) (oder vielleicht -sign(v1.x)?)
Code:
cam[1]:= sign(v1y0.x) * arccos((v1y0*ZVec)/(length(v1y0)*length(ZVec))) * RadToDeg;

oder vereinfacht:
Code:
cam[1]:= sign(v1y0.x) * arccos(v1y0.z/length(v1y0)) * RadToDeg;


das mit dem zuerst Rotation und dann Translation stimmt schon. Weiß aber auch nicht warum.

hoffe, das war einigermaßen verständlich

mfg

sharkman


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Kamera nach Sprung anpassen
BeitragVerfasst: So Aug 15, 2010 12:37 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Okt 03, 2007 14:22
Beiträge: 388
Dass ich um die Achsen einzeln rotiere habe ich irgendwie ganz vergessen, jetzt ist es klar, vielen Dank!

_________________
Meine Musik: spiker-music.net


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 3 Beiträge ] 
Foren-Übersicht » Programmierung » Mathematik-Forum


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 6 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.

Suche nach:
Gehe zu:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.009s | 14 Queries | GZIP : On ]