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

Aktuelle Zeit: Sa Jul 05, 2025 11:37

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



Ein neues Thema erstellen Auf das Thema antworten  [ 11 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Matritzen die 888te
BeitragVerfasst: Mi Sep 19, 2007 10:59 
Offline
DGL Member

Registriert: Do Apr 08, 2004 16:55
Beiträge: 516
Bei meinem Rechnen mit Matritzen scheint sich ein denkfehler eingeschlichen zu haben, b.z.w. ich bin nicht fit genug um den fehler zu sehen( Der zustand hält schon länger an( Und nächste woche ist auch noch oktoberfest :? ) ).

Ich habe 2 verschiedene Matritzen, eine 4x4(A) und eine 4x3(B) matrix ( Um Berechnungen zu sparen ).
Ich möchte ein Object projizieren welches Transformiert, Rotiert, Scaliert werden kann. Zudem ist der FOV dynamisch.

Hier mal die Berechnung die ich anstelle:
Vertex * Transformation(B) * View(A) * Projection(A)

Projektionsmatrix http://msdn2.microsoft.com/de-de/librar ... ovrh(VS.80).aspx
LookAt-Matrix http://msdn2.microsoft.com/de-de/librar ... atrh(VS.80).aspx

Ich habe zwar eine Projektion die irgendwie auch richtig scheint und kann rotation sowie skalierung anwenden, aber
bewegen (Egal in welche Achse) möchte sich nichts.
Das mag daran liegen das ich solche ViewProjection-Matritzen rausbekomme( 0 * 100 soll ja anscheinend 0 geben habe ich gehört ).
Code:
  1. 1 0 0 0
  2. 0 1 0 0
  3. 0 0 0 -1
  4. 0 0 0 0


Benutzen tue ich für die Translation M14, M24, M34.

Aus Performancegründen möchte ich bei meiner 4x3 Matrix bleiben.

mfg

Speedmaster

_________________
Shareholder und Leitender Entwickler bei Pipedream-Games.

Zitat: Siehst du diesen Park da unten? Jeden Tag lernen sich darin Menschen kennen und verlassen einander. Und du hast dein ganzes Leben Zeit darin zu gehen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Sep 19, 2007 13:54 
Offline
DGL Member

Registriert: Do Apr 08, 2004 16:55
Beiträge: 516
Eben merke ich das die Projektion auch nicht stimmt... irgendwas läuft dort gewaltig schief..

Deshalb lieber mal hier der code der projection matrix

Code:
  1. Double fndiff = _NearClippingPlane - _FarClippingPlane;
  2. Double M11 = 1 / Math.tan(FieldOfView);
  3. Matrix4x4 fst = new Matrix4x4(M11, 0, 0, 0,
  4.                 0, M11 / _AspectRatio,        0, 0,
  5.                 0, 0, _FarClippingPlane/fndiff, -1,
  6.                 0, 0, _NearClippingPlane * _FarClippingPlane / fndiff, 0);
  7.  
  8.  
  9. Vector3 zaxis = Direction.Clone();
  10. zaxis.Negate();
  11. zaxis.Normalize();
  12. Vector3 xaxis = CameraUpVector.Clone();
  13. xaxis.Cross(zaxis);
  14. xaxis.Normalize();
  15. Vector3 yaxis = zaxis.Clone();
  16. yaxis.Cross(xaxis);
  17. Double dx = -xaxis.Clone().Dot(Position);
  18. Double dy = -yaxis.Clone().Dot(Position);
  19. Double dz = -zaxis.Clone().Dot(Position);
  20.  
  21. fst.Mul(new Matrix4x4(xaxis.X, yaxis.X, zaxis.X, 0,
  22.           xaxis.Y, yaxis.Y, zaxis.Y, 0,
  23.           xaxis.Z, yaxis.Z, yaxis.Z, 0,
  24.           dx,            dy,      dz, 1));
  25.  
  26. return fst;

_________________
Shareholder und Leitender Entwickler bei Pipedream-Games.

Zitat: Siehst du diesen Park da unten? Jeden Tag lernen sich darin Menschen kennen und verlassen einander. Und du hast dein ganzes Leben Zeit darin zu gehen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Sep 20, 2007 21:10 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Apr 25, 2005 17:51
Beiträge: 464
Zitat:
Vertex * Transformation(B) * View(A) * Projection(A)


Wie sind die "Formeln" für deine Matrizen?

Also im Unterricht aus der mathematischen Sicht hab ich das ja so gelernt:


Projection(A) * View(A) *Transformation(B) * Vertex

Also genau andersrum. Und die OpenGL-Matrizen werden ja eigentlich immer in diesem mathematischem Sinn angegeben.
Wenn du dann genau andersrum multiplizieren willst, musst du die Matrizen vorher transponieren.
Da solltest du evtl. mal kontrollieren ob das bei dir alles hinhaut.

Oder übergibst du die Matrizen an OpenGL? Da müssen sie auch transponiert rein.

_________________
__________
"C++ is the best language for garbage collection principally because it creates less garbage." Bjarne Stroustrup


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Sep 21, 2007 08:49 
Offline
DGL Member

Registriert: Do Apr 08, 2004 16:55
Beiträge: 516
Pellaeon hat geschrieben:
Oder übergibst du die Matrizen an OpenGL? Da müssen sie auch transponiert rein.

Nein, ich schreibe einen Software-rasterizer.

Pellaeon hat geschrieben:
Zitat:
Vertex * Transformation(B) * View(A) * Projection(A)


Wie sind die "Formeln" für deine Matrizen?

Also im Unterricht aus der mathematischen Sicht hab ich das ja so gelernt:


Projection(A) * View(A) *Transformation(B) * Vertex

Also genau andersrum. Und die OpenGL-Matrizen werden ja eigentlich immer in diesem mathematischem Sinn angegeben.
Wenn du dann genau andersrum multiplizieren willst, musst du die Matrizen vorher transponieren.
Da solltest du evtl. mal kontrollieren ob das bei dir alles hinhaut.


Bin mir ehrlich gesagt nicht ganz sicher, hatte gestern einen fehler gefunden( View und Projektionmatrix wurden nicht richtig rum multiplitiert. ) Jetzt sehe ich bei 2 Angegebenen Vertices auch 2. Allerdings sind diese obwohl sie in der Z Achse auf unterschiedlichen Positionen sind in X und Y Achse in 2 verschiedene Richtungen verschoben ( Allerdings nur wenn ich einen X oder Y Wert angebe ). Der FOV scheint inzwischen zu stimmen, den wenn ich den Fov verändere zoome ich rein oder raus.

In DirectX werden matritzen im normalfall anderst rum multiplitiert daher bin ich davon ausgegangen das das hier auch so sei. :cry:


mfg

Felix

_________________
Shareholder und Leitender Entwickler bei Pipedream-Games.

Zitat: Siehst du diesen Park da unten? Jeden Tag lernen sich darin Menschen kennen und verlassen einander. Und du hast dein ganzes Leben Zeit darin zu gehen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Sep 21, 2007 09:46 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Apr 25, 2005 17:51
Beiträge: 464
Ja in DX ist das alles genau andersrum^^
Du müsstest mal deine Matrizen posten, also wie du sie besetzt für eine Rotation z.B.
Wenn du die Besetzung da aus dem DX-Sdk raushast, dann ist deine Reihenfolge da oben richtig! Das ist halt alles nur eine Frage der Ansicht

_________________
__________
"C++ is the best language for garbage collection principally because it creates less garbage." Bjarne Stroustrup


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Sep 21, 2007 10:31 
Offline
DGL Member

Registriert: Do Apr 08, 2004 16:55
Beiträge: 516
Pellaeon hat geschrieben:
Ja in DX ist das alles genau andersrum^^
Du müsstest mal deine Matrizen posten, also wie du sie besetzt für eine Rotation z.B.
Wenn du die Besetzung da aus dem DX-Sdk raushast, dann ist deine Reihenfolge da oben richtig! Das ist halt alles nur eine Frage der Ansicht


Projektionsmatrix:
Code:
  1. w       0       0                                              0
  2. 0       h       0                                              0
  3. 0       0       zfarPlane/(znearPlane-zfarPlane)              -1
  4. 0       0       znearPlane*zfarPlane/(znearPlane-zfarPlane)    0

Wobei
Code:
  1. h = cot(fieldOfViewY/2)
und
Code:
  1. h = w / aspectRatio
ist.

Viewmatrix:
Code:
  1. zaxis = normal(cameraPosition - cameraTarget)
  2. xaxis = normal(cross(cameraUpVector, zaxis))
  3. yaxis = cross(zaxis, xaxis)


Code:
  1.  xaxis.x           yaxis.x           zaxis.x          0
  2.  xaxis.y           yaxis.y           zaxis.y          0
  3.  xaxis.z           yaxis.z           zaxis.z          0
  4. -dot(xaxis, cameraPosition)  -dot(yaxis, cameraPosition)  -dot(zaxis, cameraPosition)  1



Die Translationmatrix wird wie folgt zusammengesetzt:
Code:
  1. 1 0 0 x
  2. 0 1 0 y
  3. 0 0 1 z


Als Beispiel für eine Rotationsmatrix ( X Achse ):
Code:
  1. 1, 0, 0, 0,
  2. 0, c,-s, 0,
  3. 0, s, c, 0

Wobei c der cos. von meinem Winkel ist und s der sin. von meinem Winkel ist.

mfg

Felix

_________________
Shareholder und Leitender Entwickler bei Pipedream-Games.

Zitat: Siehst du diesen Park da unten? Jeden Tag lernen sich darin Menschen kennen und verlassen einander. Und du hast dein ganzes Leben Zeit darin zu gehen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Sep 21, 2007 12:14 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Apr 25, 2005 17:51
Beiträge: 464
Deine Proj-Matrix sieht nach DX aus, View weis ich jetzt nicht, Rot und Trans-Matrix sind OpenGL-like, oder im "mathematischen" Sinn, wie ich es oben geschrieben habe.
Du musst dich also entscheiden, ob du die Matrizen von links oder von rechts an den Vertex multiplizieren willst und die Matrizen entsprechend anpassen.

_________________
__________
"C++ is the best language for garbage collection principally because it creates less garbage." Bjarne Stroustrup


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Sep 26, 2007 14:58 
Offline
DGL Member

Registriert: Do Apr 08, 2004 16:55
Beiträge: 516
Danke für die Antwort, sie hat zwar nicht zu einem sofortigem Ergebniss geführt, aber sie hat zu einem geführt.

Noch eine Frage die nicht direkt etwas mit matritzen zu tun haben. aber etwas mit dem Zeichnen von Triangles.

Hier mal ein Stück dreckigen Code( :lol: )
Code:
  1.  
  2. // Calculate the fov factor
  3. Double tanF = Math.tan(_Context._Camera.FieldOfView/2);
  4. // Calculate the yFactor
  5. Double zyFactor = tanF * vheight;
  6. // Calculate the xFactor
  7. Double zxFactor = tanF * vwidth;
  8.  
  9.  
  10. do
  11. {
  12.     Double  vx = tvert[i-2];
  13.     Double  vy = tvert[i-1];
  14.     Double  vz = tvert[i];
  15.    
  16.     // First Calculate
  17.     Double pz = vx * m31 + vy * m32 + vz * m33 + m34;  
  18.     vertices[i]   = pz;
  19.  
  20.     // Hack '0.1' sorgt dafür das die Perspektive nicht zu krass verzehrt ist
  21.     pz = (pz > 0) ? pz * 0.1 : 1;
  22.     vertices[i-2] = ((vx * m11 + vy * m12 + vz * m13 + m14) * zyFactor / pz);  
  23.     vertices[i-1] = ((vx * m21 + vy * m22 + vz * m23 + m24) * zyFactor / pz);
  24. } while ((i -= 3) > 0)
  25.  


Der Code Projeziert meine Vertices ( Jep, nicht mit einer Matrix ). Dies funktioniert soweit auch wenn mein FOV nicht verändert wird.
Wenn ich den FOV verändere ( 'Rauszoome' ) passiert es das die Vertices die am ausserhalb liegen ( b.z.w. über den Bildschirmrand gehen ),
nicht mehr richtig angezeigt werden( Das liegt daran das alles was hinter mit liegt eine division durch 1 erfährt und nicht durch 'pz' ).
Auf gut Deutsch, sämtliche vertices die hinter mir liegen gehen immer bis zum Rand.

Frage ist wie ich das abfange.

mfg

Felix

_________________
Shareholder und Leitender Entwickler bei Pipedream-Games.

Zitat: Siehst du diesen Park da unten? Jeden Tag lernen sich darin Menschen kennen und verlassen einander. Und du hast dein ganzes Leben Zeit darin zu gehen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Sep 26, 2007 15:27 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Apr 25, 2005 17:51
Beiträge: 464
Hm wird wohl auf ein eigenes Clipping am Bildraum hinauslaufen?

Zitat:
Der Code Projeziert meine Vertices ( Jep, nicht mit einer Matrix ).


Warum machst es nicht über Matrizen? Wo gibts denn noch Probleme? Wenn du das ganze in den kanonischen Bildraum überführst geht auch das Clipping einfacher.

Zitat:
Danke für die Antwort, sie hat zwar nicht zu einem sofortigem Ergebniss geführt, aber sie hat zu einem geführt.


Jo das ist irgendwie schwer per Forum zu erklären. Mit Zettel und Stift geht das irgendwie besser^^
Aber wenn du die Matrizen nicht benutzt, weil es noch ein, zwei Unklarheiten gibt: dann frag ruhig weiter!
Evtl. taucht dann auch irgendwann der Nico auf, das Forums-Mathe-Ass

_________________
__________
"C++ is the best language for garbage collection principally because it creates less garbage." Bjarne Stroustrup


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Sep 26, 2007 16:57 
Offline
DGL Member

Registriert: Do Apr 08, 2004 16:55
Beiträge: 516
Pellaeon hat geschrieben:
Jo das ist irgendwie schwer per Forum zu erklären. Mit Zettel und Stift geht das irgendwie besser^^
Aber wenn du die Matrizen nicht benutzt, weil es noch ein, zwei Unklarheiten gibt: dann frag ruhig weiter!
Evtl. taucht dann auch irgendwann der Nico auf, das Forums-Mathe-Ass


Es ist nicht so das ich sie garnicht benutze( für Rotation, Translation u.s.w. benutze ich sie immer noch ), allerdings komme ich irgendwie nicht drauf was ich falsch mache, und bräuchte dringend wieder mal einen 'Refresh' in mathe( Siehe meine Thread wegen Buch; Am Programieren happerts nicht ).

_________________
Shareholder und Leitender Entwickler bei Pipedream-Games.

Zitat: Siehst du diesen Park da unten? Jeden Tag lernen sich darin Menschen kennen und verlassen einander. Und du hast dein ganzes Leben Zeit darin zu gehen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Okt 12, 2007 10:51 
Offline
DGL Member

Registriert: Do Apr 08, 2004 16:55
Beiträge: 516
So nachdem alle Probleme mit Projektionen u.s.w. gelößt sind habe ich ein weiteres und vermutlich letztes Problem( Wobei ich gestehen muss das ich über dieses nicht lange nachgedacht habe, die nerven liegen etwas blank ).

Erstmal etwas Code( Erzeugt eine LookAtMatrix ):
Code:
  1. Vector3 zAxis = direction.Clone();
  2. zAxis.Negate();
  3. zAxis.Normalize();
  4.  
  5. //if( direction.Magnitude > 0.1 )
  6. //{
  7. Vector3 xAxis = zAxis.Clone();
  8. xAxis.Cross(up);
  9. xAxis.Normalize();
  10.  
  11. Vector3 yAxis = zAxis.Clone();
  12. yAxis.Cross(xAxis);
  13. yAxis.Normalize();
  14.  
  15. return new Matrix3x4(xAxis.X, -yAxis.X, zAxis.X, -xAxis.Dot(position),
  16.                   xAxis.Y, -yAxis.Y, zAxis.Y,  yAxis.Dot(position),
  17.                   xAxis.Z, -yAxis.Z, zAxis.Z, -zAxis.Dot(position));


Das Problem kurz beschrieben:
Wenn ich mich um die Y-Achse rotiere, rotiere ich um ein gekipptes Koordinatensystem, und nicht um die ursprüngliche Achse.
Zwar gibt es noch eine andere Möglichkeit eine LookAtMatrix zu machen, aber die ist hässlich.



P.s.: Bald gibts vielleicht auch mal ein paar Bilder von der Sache.

mfg

Felix

_________________
Shareholder und Leitender Entwickler bei Pipedream-Games.

Zitat: Siehst du diesen Park da unten? Jeden Tag lernen sich darin Menschen kennen und verlassen einander. Und du hast dein ganzes Leben Zeit darin zu gehen.


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


Wer ist online?

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.

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