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

Aktuelle Zeit: Fr Jul 18, 2025 00:26

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



Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Rechengenauigkeit und Matrizen
BeitragVerfasst: Mo Okt 04, 2004 21:13 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jun 19, 2003 10:44
Beiträge: 991
Wohnort: Karlsfeld (nahe München)
Eines vorne weg das wird zimlich mathematisch.

Ich wollte eine soche Matrix2 passend zu Matrix1 finden das gilt:
Zitat:
VektorA--Matrix1-->VertorA--Matrix2-->VektorA

Damit das ganze lösbar ist bin ich davon ausgegangen das die Matrix1 nur eine Inditäts- Matrix ist, welche mit OpenGL Befehlen wie glRotate,glTranslate und glScale manipuliert wurde.

Als Teilschritt auf eine solche Matrix hin habe ich mir überlegt wie man die Rotation mit Hilfe einer Matrix umkehren kann.
Folgenden Code habe ich dafür entworfen:
Code:
  1.  
  2. type
  3.   Einheit = Double;
  4.   TVektor = record X,Y,Z,W:Einheit end;
  5.   TMatrix = array [0..3] of TVektor;
  6.  
  7.  
  8.   function AntiRotMatrix(const Matrix:TMatrix):TMatrix;
  9.   function MatrixaufVektoranwenden(Matrix:TMatrix;Vektor:TVektor):TVektor;
  10. implementation
  11. const
  12.   X=0;
  13.   Y=1;
  14.   Z=2;
  15.   W=3;
  16.  
  17. function Vektor(X,Y,Z,W:Einheit):TVektor;
  18. begin
  19.   Result.X := X;
  20.   Result.Y := Y;
  21.   Result.Z := Z;
  22.   Result.W := W;
  23. end;
  24.  
  25. function MatrixaufVektoranwenden(Matrix:TMatrix;Vektor:TVektor):TVektor;
  26. begin
  27.   Result.X := Vektor.X*Matrix[X].X + Vektor.Y*Matrix[Y].X + Vektor.Z*Matrix[Z].X + Vektor.W*Matrix[W].X;
  28.   Result.Y := Vektor.X*Matrix[X].Y + Vektor.Y*Matrix[Y].Y + Vektor.Z*Matrix[Z].Y + Vektor.W*Matrix[W].Y;
  29.   Result.Z := Vektor.X*Matrix[X].Z + Vektor.Y*Matrix[Y].Z + Vektor.Z*Matrix[Z].Z + Vektor.W*Matrix[W].Z;
  30.   Result.W := Vektor.X*Matrix[X].W + Vektor.Y*Matrix[Y].W + Vektor.Z*Matrix[Z].W + Vektor.W*Matrix[W].W;
  31. end;
  32.  
  33. function AntiRotMatrix(const Matrix:TMatrix):TMatrix;
  34. var
  35.   RMatrix:TMatrix;
  36.   MatrixYZRot:TMatrix;
  37.   MatrixXZRot:TMatrix;
  38.   MatrixXYRot:TMatrix;
  39.  
  40.   ZAchse:TVektor;
  41.   XAchse:TVektor absolute ZAchse;
  42.   L:Einheit;
  43. begin
  44.  
  45.   // ZAchse holen
  46.   ZAchse := Matrix[Z];
  47.   // Nur Y-Z Betrachten
  48.   ZAchse.X := 0;
  49.   //Zum Einheitsvektor machen:
  50.   L := Sqrt(Sqr(ZAchse.Y)+Sqr(ZAchse.Z));
  51.   ZAchse.Y := ZAchse.Y / L;
  52.   ZAchse.Z := ZAchse.Z / L;
  53.   RMatrix := Matrix;
  54.  
  55.   MatrixYZRot[X] := Vektor(1,0,0,0);
  56.   MatrixYZRot[Y] := Vektor(0, ZAchse.Z, ZAchse.Y, 0);
  57.   MatrixYZRot[Z] := Vektor(0, -ZAchse.Y, ZAchse.Z, 0);
  58.   MatrixYZRot[W] := Vektor(0, 0, 0, 1);
  59.  
  60.   //Ausgangsmatrix mit Rotationsmatrix rotieren.
  61.   RMatrix[0] := MatrixaufVektoranwenden(MatrixYZRot,Matrix[0]);
  62.   RMatrix[1] := MatrixaufVektoranwenden(MatrixYZRot,Matrix[1]);
  63.   RMatrix[2] := MatrixaufVektoranwenden(MatrixYZRot,Matrix[2]);
  64.   RMatrix[3] := MatrixaufVektoranwenden(MatrixYZRot,Matrix[3]);
  65.  
  66.   // Nach dieser Rotation ist von der wirklichen ZAchse die Y Koordinate gleich 0
  67.   // Es kann nun in XZ Richtung gedreht werden.
  68.  
  69.   // Die (neue) ZAchse holen
  70.   ZAchse := RMatrix[Z];
  71.   //Zum Einheitsvektor machen:
  72.   L := Sqrt(Sqr(ZAchse.X)+Sqr(ZAchse.Z));
  73.   ZAchse.X := ZAchse.X / L;
  74.   ZAchse.Z := ZAchse.Z / L;
  75.  
  76.   MatrixXZRot[X] := Vektor(ZAchse.Z,0 ,ZAchse.X , 0);
  77.   MatrixXZRot[Y] := Vektor(0,1,0,0);
  78.   MatrixXZRot[Z] := Vektor(-ZAchse.X, 0, ZAchse.Z, 0);
  79.   MatrixXZRot[W] := Vektor(0, 0, 0, 1);
  80.  
  81.   //Ausgangsmatrix mit Rotationsmatrix rotieren.
  82.   RMatrix[0] := MatrixaufVektoranwenden(MatrixXZRot,RMatrix[0]);
  83.   RMatrix[1] := MatrixaufVektoranwenden(MatrixXZRot,RMatrix[1]);
  84.   RMatrix[2] := MatrixaufVektoranwenden(MatrixXZRot,RMatrix[2]);
  85.   RMatrix[3] := MatrixaufVektoranwenden(MatrixXZRot,RMatrix[3]);
  86.  
  87.   //Nun ist die Z Achse in der richigen Position und es kann um sie rotiert werden
  88.  
  89.   XAchse := RMatrix[X];
  90.   L := Sqrt(Sqr(XAchse.X)+Sqr(XAchse.Y));
  91.   //XAchse.X := XAchse.X / L;
  92.   //XAchse.Z := XAchse.Z / L;
  93.  
  94.   MatrixXYRot[X] := Vektor( XAchse.X,-XAchse.Y ,0 , 0);
  95.   MatrixXYRot[Y] := Vektor( XAchse.Y, XAchse.X ,0 , 0);
  96.   MatrixXYRot[Z] := Vektor(0, 0, 1, 0);
  97.   MatrixXYRot[W] := Vektor(0, 0, 0, 1);
  98.  
  99.   {$IFDEF DEBUG}
  100.   RMatrix[0] := MatrixaufVektoranwenden(MatrixXYRot,RMatrix[0]);
  101.   RMatrix[1] := MatrixaufVektoranwenden(MatrixXYRot,RMatrix[1]);
  102.   RMatrix[2] := MatrixaufVektoranwenden(MatrixXYRot,RMatrix[2]);
  103.   RMatrix[3] := MatrixaufVektoranwenden(MatrixXYRot,RMatrix[3]);
  104.   {$ENDIF DEBUG}
  105.  
  106.   Result := MatrixYZRot;
  107.  
  108.  
  109.   Result[0] := MatrixaufVektoranwenden(MatrixXZRot,Result[0]);
  110.   Result[1] := MatrixaufVektoranwenden(MatrixXZRot,Result[1]);
  111.   Result[2] := MatrixaufVektoranwenden(MatrixXZRot,Result[2]);
  112.   Result[3] := MatrixaufVektoranwenden(MatrixXZRot,Result[3]);
  113.  
  114.   Result[0] := MatrixaufVektoranwenden(MatrixXYRot,Result[0]);
  115.   Result[1] := MatrixaufVektoranwenden(MatrixXYRot,Result[1]);
  116.   Result[2] := MatrixaufVektoranwenden(MatrixXYRot,Result[2]);
  117.   Result[3] := MatrixaufVektoranwenden(MatrixXYRot,Result[3]);
  118.  
  119. end;
  120.  


Das ganze funktioniert zwar allerdings mit einer mißerrablen Genauikeit. Selbst die 3 Stelle nach dem Kommar stimmt manchmal nicht.

Darum meine Frage an euch:
Hat schon jemand so eine Art AntiMatrix Routine programmiert und wie soll ich da weiter vorgehen. Im Prinzip muss ich ja noch eine Scallierung und eine Verschiebung rückgängig machen und dann hätte ich es ja. Allerdings ist müßte ich davor erstmal die Genauikeit verbessern...

Wäre vielleicht doch Cos und Sin Funktionen besser dafür geeignet?
Hat einer von euch schonmal so etwas gemacht?

MfG
IFlo

_________________
Danke an alle, die mir (und anderen) geholfen haben.
So weit... ...so gut


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Okt 05, 2004 10:04 
Offline
DGL Member

Registriert: Do Mai 30, 2002 18:48
Beiträge: 1617
Das was du suchst heist Matrizeninversion - das erklär ich jetzt aber nicht, das ist nämlich nicht so ganz trivial. Kannst dich dann ja im Internet mal schlau machen, wies funktioniert und dann einen Blick in die geometry.pas von GlScene werfen, dort haben die das recht schnell gelöst.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Okt 05, 2004 10:54 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Hier steht drin wie man die inverse Matrix berechnet, und auch vieles mehr. Dieses Matrix-FAQ sollte sich jeder Interessierte auf der Platte ablegen, da werden nämlich so gut wie alle Fragen abgeklärt.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Okt 05, 2004 13:46 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jun 19, 2003 10:44
Beiträge: 991
Wohnort: Karlsfeld (nahe München)
Danke für den Link.
Warum der alldings alles so monoton gehalten hat ist mir ein Rätzel
MfG
IFlo

_________________
Danke an alle, die mir (und anderen) geholfen haben.
So weit... ...so gut


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Okt 05, 2004 13:54 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Is bestimmt ein Mathematiker. Bei denen is das normal. :wink:

_________________
Blog: kevin-fleischer.de und fbaingermany.com


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 7 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 | 14 Queries | GZIP : On ]