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

Aktuelle Zeit: Di Jul 15, 2025 19:01

Foren-Übersicht » Programmierung » OpenGL
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 6 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Vektor Richtung Blickrichtung
BeitragVerfasst: Di Mär 06, 2012 21:14 
Offline
DGL Member
Benutzeravatar

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

wie kann man den Vektor bestimmen, welcher in Blickrichtung der Kamera zeigt ? Mit Blickrichtung der Kamera meine ich den Bild-Mittelpunkt quasi. Finde dafür nicht so recht die Worte, daher mal an einem Beispiel:Im Firstpersonshooter hält der Spieler die Waffe genau so in der Hand, dass das Fadenkreuz in der Bildschirmmitte platziert ist und eine Kugel aus seiner Waffe in Richtung Fadenkreuz fliegt. Wie erhält man einen Vektor, welcher die Fluggerade der Kugel beschreibt ?

Das ist eine Frage die ich mir schon ewig stelle. Damit es anschaulich und klar bleibt, bleiben wir mal beim Ballerspielbeispiel.

Ohne große Überlegungen würde ich sagen, man muss nur einen Punkt auf der Flugbahn bestimmen, weil man zusammen mit der Position des Spielers dann den Vektor hätte. gluUnProject geht wohl in die Richtung wenn man die Bildschirmmitte als Koordinaten nimmt (siehe Code unten). Eine weitere Idee die ich hatte war die Modelview-Matrix auseinanderzunehmen, aber je mehr ich suche desto unklarer ist mir die Vorgehensweise. Ich dachte immer man könnte quasi den Vektor einer Blickgeraden aus der Modelview-Matrix entnehmen, aber wenn ich intern den Vektor für die Bewegung einer Kugel auf den dritten Vektor der Modelview-Matrix setze, funktioniert das nicht, er zischt immer in die gleiche Richtung ab.

Ist es überhaupt gut die Matrix zu analysieren ? glu ist jedenfalls nicht gerade mein Fall, zumal auch das getestet komische Ergebnisse liefert. Frage mich auch ob das überhaupt tragbar performant wäre am Ende. Gibt es irgendwelche gescheiten Möglichkeiten das umzusetzen ? Die Kamera selbst arbeitet mit einfachem glTranslate und glRotate, enthält auch keine Blickrichtung, macht wirklich nur das nötigste. Daher bringt mir die hier wohl nichts außer eben der Standpunktposition.

Gruß,
Nils

_________________
Meine Musik: spiker-music.net


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Vektor Richtung Blickrichtung
BeitragVerfasst: Di Mär 06, 2012 21:37 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Apr 13, 2011 22:05
Beiträge: 218
Programmiersprache: Lazarus/FPC
Ich habe mich in der Beziehung an einfache Winkelrechnungen gehalten! Sinus, Cosinus, Tangens :mrgreen:
Stell dir vor die Blickrichtung deines Spielers ist nichts anderes als die lange Seite eines rechtwinkligen Dreiecks. Die anderen Seiten des Dreiecks sind dann entweder die X oder Y Richtung vom Spieler aus gesehen.
Stell dir deinen Spieler von oben gesehen vor....er schaut ja in irgendeine Richtung...das ist dein Winkel.
Bei mir sieht das so aus:

Code:
  1.  
  2. //Wink ist die Rotation deines Objektes!! Dieser Winkel wird nun im Bereich 0-360 gehalten!
  3.  
  4. uses math;
  5.  
  6.  while wink < 0 do
  7.     wink := wink + 360;
  8.   while wink >= 360 do
  9.     wink := wink - 360;
  10.  
  11. //Richtungsvektor anhand des Winkels berechnen. Je nachdem in welchem Kreisviertel sich der Winkel befindet gelten andere Rechenregeln. Die Variablen c und a sind dann nichts weiteres als die fertigen x und y Koordinaten des Richtugnsvektors
  12.   if wink = 0 then
  13.   begin
  14.     c := 0;
  15.     a := 1;
  16.   end
  17.   else if wink < 90 then
  18.   begin
  19.     a := cos(degtorad(wink));
  20.     c := Sqrt(1 - (a * a));
  21.   end
  22.   else if wink = 90 then
  23.   begin
  24.     c := 1;
  25.     a := 0;
  26.   end
  27.   else if wink < 180 then
  28.   begin
  29.     c := cos(degtorad(wink - 90));
  30.     a := -Sqrt(1 - (c * c));
  31.   end
  32.   else if wink = 180 then
  33.   begin
  34.     c := 0;
  35.     a := -1;
  36.   end
  37.   else if wink < 270 then
  38.   begin
  39.     a := -cos(degtorad(wink - 180));
  40.     c := Sqrt(1 - (a * a));
  41.     c := -c;
  42.   end
  43.   else if wink = 270 then
  44.   begin
  45.     c := -1;
  46.     a := 0;
  47.   end
  48.   else
  49.   begin
  50.     c := cos(degtorad(wink - 270));
  51.     a := Sqrt(1 - (c * c));
  52.     c := -c;
  53.   end;
  54.  


Ich hoffe du kannst damit was anfangen =)

_________________
Ich teile manchmal heimlich durch Null. - Alber Einstein


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Vektor Richtung Blickrichtung
BeitragVerfasst: Di Mär 06, 2012 21:45 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Okt 03, 2007 14:22
Beiträge: 388
Aber wäre das nicht 2D ? Der gesuchte Vektor müsste drei Koordinaten haben in 3D. Oder ich bin gerade total verpeilt.

_________________
Meine Musik: spiker-music.net


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Vektor Richtung Blickrichtung
BeitragVerfasst: Di Mär 06, 2012 21:48 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Apr 13, 2011 22:05
Beiträge: 218
Programmiersprache: Lazarus/FPC
Naja...wenn du ihn mal in 2D hast, machst du dasselbe nochmal...nur eben von der Seite gesehen quasi....und rechnest damit noch die Höhenkoordinate aus!-Fertig! Hast ja auch einen Winkel der die Kamera nach oben/unten dreht, oder?

_________________
Ich teile manchmal heimlich durch Null. - Alber Einstein


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Vektor Richtung Blickrichtung
BeitragVerfasst: Mi Mär 07, 2012 00:30 
Offline
DGL Member

Registriert: Di Aug 09, 2011 07:33
Beiträge: 163
Programmiersprache: C/C++
Was du meinst ist der Forward-Vektor - den kannst du auch aus der Modelview-Matrix nehmen!
Mach dir einfach ein Array mit 16 Feldern wo die Modelview-Matrix reinkommt, wobei dort dann Wert 2, 6 und 10 der Forward-Vektor ist.

z.B.:
Code:
  1.  
  2. float ModelView[16];
  3. glGetFloatv(GL_MODELVIEW_MATRIX, ModelView);
  4. float x = ModelView[2];
  5. float y = ModelView[6];
  6. float z = ModelView[10];
  7.  

Dann hättest du den Forward-Vektor in den Variablen x, y, z.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Vektor Richtung Blickrichtung
BeitragVerfasst: Mi Mär 07, 2012 09:20 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Okt 03, 2007 14:22
Beiträge: 388
Dein Code-Beispiel entspricht fast meinen Experimenten, bloß dass ich immer eine 4er-Matrix statt einem 16er-Array genommen habe. Ich nehme an, dass es bei Dir also in Pascal ein Array von 0 bis 15 wäre - stimmt das ? Rein vom Ergebnis her fliegt die Kugel immer in die gleiche Richtung, daher ist irgendwas wohl falsch.
Code:
  1. var mModelView : Array[0..15] of Single;
  2. begin
  3.   glGetFloatv(GL_MODELVIEW_MATRIX, @mModelView);
  4.   Direction[0] := mModelView[2];
  5.   Direction[1] := mModelView[6];
  6.   Direction[2] := mModelView[10];


Auf Basis eines Codes welcher mir zwei Koordinaten korrekt berechnen konnte, entstand der folgende Code. Nach ausgiebigen Tests scheint es, als würde er genau das machen was ich will. Die Kugel fliegt immer in die richtige Richtung, egal welchen Winkel ich gerade habe.
Code:
  1. Direction := VectorNorm(VectorAdd(VectorSub(VectorMult(ToVector3f(0, 0, -1), cos(DegToRad(-Camera.Cam[1]))), VectorMult(ToVector3f(1, 0, 0), sin(DegToRad(-Camera.Cam[1])))), VectorMult(ToVector3f(0, 1, 0), tan(DegToRad(-Camera.Cam[0])))));
In Camera.Cam stehen die Winkel der Kamera für das Rotieren.
Die Idee den Code so auf drei Koordinaten zu erweitern kam mir durch die Idee von Ida oben.

Danke für Eure Hilfe!

_________________
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  [ 6 Beiträge ] 
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 10 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:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.009s | 16 Queries | GZIP : On ]