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

Aktuelle Zeit: Mo Jul 07, 2025 19:54

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Aktuelle Position abfragen
BeitragVerfasst: Di Apr 19, 2011 15:58 
Offline
DGL Member

Registriert: Sa Apr 09, 2011 20:48
Beiträge: 43
Programmiersprache: Delphi
Wie kann ich die aktuelle Position in der Matrix rausfinden?
Sagen wir ich male 30 Objekte. Beim 16ten Objekt möchte ich die
aktuelle Position bezogen auf den Ursprung (0,0,0) festhalten und
Speichern.

Ich versuche gerade einfach mal glGetFloatv(GL_MODELVIEW_MATRIX, @M) aufzurufen und
dann auf das letzte Vektorarray von M zuzugreifen.

Aber ich erhalte Daten, die sich ändern wenn ich den Viewport ändere.
Muss ich andere Daten nehmen, oder gibt es die Positionsdaten bereits fertig für den Zugriff?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Aktuelle Position abfragen
BeitragVerfasst: Di Apr 19, 2011 16:59 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Wie schon im anderen Thread angedeutet, das @M könnte wirklich ein Problem sein. Versuch mal @M[0]. (Wenn das die Lösung ist gebe ich auf Anfrage gerne eine detailliertere Erklärung)

greetings

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Aktuelle Position abfragen
BeitragVerfasst: Mi Apr 20, 2011 18:48 
Offline
DGL Member

Registriert: Sa Apr 09, 2011 20:48
Beiträge: 43
Programmiersprache: Delphi
Mittlerweile muss ich feststellen, das diese Frage wohl keinesfalls eine "Einsteiger-Frage" ist.

Ok. Jetzt was ich rausgefunden habe:
Wenn ich meine Spielerfigur/3D-Ansicht in den Nullpunkt lege und auch den Sichtwinkel von
X und Y auf Null setze (horizontal geradeaus und rückwärts schaue), dann erhalte ich tatsächlich die genauen Koordinaten des sich bewegenden Objektes.

D.h. es gibt wohl 2 Möglichkeiten
1) Wenn ich mich nicht im Nullpunkt befinde, muss ich von dem erhaltenen Punkt den Vektor meiner aktuellen Position zum Nullpunkt abziehen. Inklusive der X und Y Rotation.
oder
2) Ich könnte den Ansichtspunkt auf den Nullpunkt legen, den aktuellen Punkt des Objektes abfragen und danach den Ansichtspunkt zurücksetzen.

Das werde ich heute mal ausprobieren, sofern das meine nicht vorhandenen Mathe-Kenntnisse zulassen. :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Aktuelle Position abfragen
BeitragVerfasst: Mi Apr 20, 2011 19:03 
Offline
DGL Member

Registriert: Sa Okt 18, 2008 11:59
Beiträge: 180
Mit selbigem Problem hab ich mich neulich auch rumgeschlagen (Position aus Matrix erhalten).

Und habe vor paar Stunden (dein Glück) die Lösung dafür gefunden.

http://wiki.delphigl.com/index.php/Tech ... xinversion

Im Grunde "rotierst" du einfach nur die Rotationsmatrix.
Code:
  1.     //invert rotation
  2.     GLfloat HV; //contains the value of one of the swapping values
  3.     HV = matrix._1D[1];
  4.     matrix._1D[1] = matrix._1D[4];
  5.     matrix._1D[4] = HV;
  6.     HV = matrix._1D[2];
  7.     matrix._1D[2] = matrix._1D[8];
  8.     matrix._1D[8] = HV;
  9.     HV = matrix._1D[6];
  10.     matrix._1D[6] = matrix._1D[9];
  11.     matrix._1D[9] = HV;

Ja, das ist C/C++ und selbst geschrieben.

Und dann noch die rotierte Matrix mal den letzten Vektor (matrix._1D[12] bis matrix._1D[15).
(Wie das geht kannst du hier nachlesen: http://wiki.delphigl.com/index.php/Matr ... f_Vektoren)

TATA... du hast deine Position.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Aktuelle Position abfragen
BeitragVerfasst: Mi Apr 20, 2011 21:13 
Offline
DGL Member

Registriert: Sa Apr 09, 2011 20:48
Beiträge: 43
Programmiersprache: Delphi
Zitat:
Im Grunde "rotierst" du einfach nur die Rotationsmatrix.
Code:
  1.    
  2. //invert rotation
  3.     GLfloat HV; //contains the value of one of the swapping values
  4.     HV = matrix._1D[1];
  5.     matrix._1D[1] = matrix._1D[4];
  6.  


 
Ich verstehe schon das hier die verschiedenen Werte der Vektorenmatrix einfach ausgetauscht werden.
Was ich nicht verstehe ist:
   Woher kommt HV?
   Woher kommt matrix._1D?
 
Eines davon ist sicher die Position meines Objektes die ich mit   glGetFloatv(GL_MODELVIEW_MATRIX, @M) hole.
Die andere Matrix ist nur dazu da, die Werte die in der matrix._1D ausgetauscht werden, temporär aufzubewahren?
 
Zitat:
Und dann noch die rotierte Matrix mal den letzten Vektor (matrix._1D[12] bis matrix._1D[15).

Ok. D.h. dann:
Code:
  1.  
  2.  (  HV[0]  HV[4]   HV[8]    HV[12]                  (   matrix._1D[12]
  3.    HV[1]   HV[5]   HV[9]   HV[13]          *            matrix._1D[13]
  4.    HV[2]   HV[6]   HV[10]   HV[14]                      matrix._1D[14]
  5.    HV[3]   HV[7]   HV[11]   HV[15] )                    matrix._1D[15] )
  6.  

...oder wäre in beiden Klammern die Matrix._1D?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Aktuelle Position abfragen
BeitragVerfasst: Mi Apr 20, 2011 23:11 
Offline
DGL Member

Registriert: Sa Okt 18, 2008 11:59
Beiträge: 180
Das ist nur ein invertier-Algorithmus der Rotationsmatrix.
Wenn du schon einen hast, dann kannst du ihn ignorieren.

Was HV (=Hilfsvariable, hab ich damals von der Schule so übernommen.) macht steht ja da. Es speichert einen Wert zwischen um 2 davon tauschen zu können.
(Andernfalls würdest du dem Arrayfeld X dem Wert X+1 zuweisen und anschließend X+1 dem Wert aus dem Feld X zuweisen. Da aber X dann den Wert von X+1 enthält, hätte das wenig Sinn und beides hätte dann den Wert von X+1.)

"matrix" ist die Matrix (mit Rotation und Translation). Damit ich auf das Array sowohl mit eindimensionalen Koordinaten als auch mit zweidimensionalen Koordinaten zugreifen kann ist das ein "union", aber der Compiler muss ja wissen ob ich jetzt die ein- oder zweidimensionale Variante will. Daher kommt das _1D (ich hätte es nur "1D" genannt, aber dann hätte mein Compiler rumgemotzt weil der Bezeichner mit einer Zahl beginnt).

KURZ:
"matrix._1D" wäre das, was bei dir "M" ist:
Code:
  1. glGetFloatv(GL_MODELVIEW_MATRIX, @M)

HV ist ein EINZELWERT (KEIN Array) vom Typ GLfloat oder TGLfloat oder Single, wenn du willst kannste auch Double verwenden.

Code:
  1.  
  2. ( M[0]  M[4]   M[ 8]   M[12]                  (   M[12]
  3.   M[1]  M[5]   M[ 9]   M[13]          *           M[13]
  4.   M[2]  M[6]   M[10]   M[14]                      M[14]
  5.   M[3]  M[7]   M[11]   M[15] )                       0  )
  6.  

Wichtig hierbei: der letzte Wert im Vektor mit dem du multiplizierst (das Teil da rechts^^) ist 0, nicht 1 oder M[15]!


Nachtrag:
Vergiss nicht zwischen glGetFloatv() und der Translation (Matrix mal Vektor) den Rotationsteil der Matrix zu drehen.
Sieht dann so aus:
Code:
  1.  
  2. ( M[0]  M[1]   M[ 2]   M[12]                  (   M[12]
  3.   M[4]  M[5]   M[ 6]   M[13]          *           M[13]
  4.   M[8]  M[9]   M[10]   M[14]                      M[14]
  5.   M[3]  M[7]   M[11]   M[15] )                       0  )
  6.  


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Aktuelle Position abfragen
BeitragVerfasst: Do Apr 21, 2011 19:10 
Offline
DGL Member

Registriert: Sa Apr 09, 2011 20:48
Beiträge: 43
Programmiersprache: Delphi
Ups... Sorry. Hab die Definition von HV total übersehen :oops:

Nur damit ich weiss das ich das jetzt richtig verstanden habe:

Bei der Multiplikation der gedrehten Matrix M mit dem Vektor (M[12],M[13],M[14],0) erhalte ich also wieder einen Vektor.

Diesen muss ich dann als glTranslate(V) anwenden?

Und nur damit mir das jetzt auch klar wird: Welchen Punkt habe ich damit berechnet?

Alles klar soweit? :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Aktuelle Position abfragen
BeitragVerfasst: Do Apr 21, 2011 21:36 
Offline
DGL Member

Registriert: Sa Okt 18, 2008 11:59
Beiträge: 180
Nicht ganz richtig.

Das "translate" ist nichts anderes als "Matrix mal Vektor".

Rechnest du also Matrix mal Vektor und translierst danach den Vektor mit der Matrix, dann machst du quasi 2 mal das gleiche. Das ist dann wieder verkehrt, du drehst dann nochmal die Rotationsmatrix und multiplizierst den Vektor erneut. Dann hättest du das richtige.

ODER:
Du translierst nur EINMAL und fertig.

Was du dann heraus bekommst sind die X-, Y- und Z-Koordinate an denen du dich befindest. Das wolltest du doch oder nicht?

"Bei der Multiplikation der gedrehten Matrix M mit dem Vektor (M[12],M[13],M[14],0) erhalte ich also wieder einen Vektor."
Und genau dieser Vektor ist die Position.


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 21 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.007s | 15 Queries | GZIP : On ]