Mal 'ne Mathefrage: Matitzen multiplizieren

Übersicht Sonstiges Smalltalk

Neue Antwort erstellen

 

Yogu

Betreff: Mal 'ne Mathefrage: Matitzen multiplizieren

BeitragDo, Jun 21, 2007 15:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,
Ich kapier das mit Matritzen mulitplizieren einfach nicht. Ich hab schon auf Wikipedia was gefunden, aber 1. kann ich die Handschrift in den Formeln nicht lesen und 2. sind keine Erklärungen dabei.

Ich hätte gerne, egal in welcher (Programmier)sprache, eine Mulitiplikation von zwei 4x4-Matritzen.

Das hab ich gebastelt:

Code: [AUSKLAPPEN]
    _11 := M1._11 * M2._11;
    _12 := M1._12 * M2._21;
    _13 := M1._13 * M2._31;
    _14 := M1._14 * M2._41;
    _21 := M1._21 * M2._12;
    _22 := M1._22 * M2._22;
    _23 := M1._23 * M2._32;
    _24 := M1._24 * M2._42;
    _31 := M1._31 * M2._13;
    _32 := M1._32 * M2._23;
    _33 := M1._33 * M2._33;
    _34 := M1._34 * M2._43;
    _41 := M1._41 * M2._14;
    _42 := M1._42 * M2._24;
    _43 := M1._43 * M2._34;
    _44 := M1._44 * M2._44;


Ist Delphi, aber ich denke, das macht nichts. Wenn doch, kann ichs auch umschreiben.
www.yogularm.de/df/design/signature.png
 

$tankY

BeitragDo, Jun 21, 2007 15:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Wo ist auf Wikipedia bei Formeln Handschrift? Die haben dafür doch extra Grafiken, oder?

Xaron

BeitragDo, Jun 21, 2007 15:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
      M[0] = m1[0]*m2[0] + m1[4]*m2[1] + m1[8]*m2[2] + m1[12]*m2[3];
      M[1] = m1[1]*m2[0] + m1[5]*m2[1] + m1[9]*m2[2] + m1[13]*m2[3];
      M[2] = m1[2]*m2[0] + m1[6]*m2[1] + m1[10]*m2[2] + m1[14]*m2[3];
      M[3] = m1[3]*m2[0] + m1[7]*m2[1] + m1[11]*m2[2] + m1[15]*m2[3];

      M[4] = m1[0]*m2[4] + m1[4]*m2[5] + m1[8]*m2[6] + m1[12]*m2[7];
      M[5] = m1[1]*m2[4] + m1[5]*m2[5] + m1[9]*m2[6] + m1[13]*m2[7];
      M[6] = m1[2]*m2[4] + m1[6]*m2[5] + m1[10]*m2[6] + m1[14]*m2[7];
      M[7] = m1[3]*m2[4] + m1[7]*m2[5] + m1[11]*m2[6] + m1[15]*m2[7];

      M[8] = m1[0]*m2[8] + m1[4]*m2[9] + m1[8]*m2[10] + m1[12]*m2[11];
      M[9] = m1[1]*m2[8] + m1[5]*m2[9] + m1[9]*m2[10] + m1[13]*m2[11];
      M[10] = m1[2]*m2[8] + m1[6]*m2[9] + m1[10]*m2[10] + m1[14]*m2[11];
      M[11] = m1[3]*m2[8] + m1[7]*m2[9] + m1[11]*m2[10] + m1[15]*m2[11];

      M[12] = m1[0]*m2[12] + m1[4]*m2[13] + m1[8]*m2[14] + m1[12]*m2[15];
      M[13] = m1[1]*m2[12] + m1[5]*m2[13] + m1[9]*m2[14] + m1[13]*m2[15];
      M[14] = m1[2]*m2[12] + m1[6]*m2[13] + m1[10]*m2[14] + m1[14]*m2[15];
      M[15] = m1[3]*m2[12] + m1[7]*m2[13] + m1[11]*m2[14] + m1[15]*m2[15];


Gruß - Xaron
Cerberus X - Monkey X Reloaded!

kriD

Betreff: 11?

BeitragDo, Jun 21, 2007 16:03
Antworten mit Zitat
Benutzer-Profile anzeigen
ich geh davon aus, dass z.B: M1._32 soviel heißt, wie M1 (3,2) in basic.
Eidentlich müsste es denn richtig sein... geht allerdings meines wissens nur mit gleichgroßen Matrizen... (immer Elemente mit gleichem Index multiplizieren...)
 

David

Betreff: Re: 11?

BeitragDo, Jun 21, 2007 16:18
Antworten mit Zitat
Benutzer-Profile anzeigen
kriD hat Folgendes geschrieben:
ich geh davon aus, dass z.B: M1._32 soviel heißt, wie M1 (3,2) in basic.
Eidentlich müsste es denn richtig sein... geht allerdings meines wissens nur mit gleichgroßen Matrizen... (immer Elemente mit gleichem Index multiplizieren...)


Zwei Matrizen können Multipliziert werden wenn die Anzahl der Spalten von Matrix A gleich der Anzahl der Zeilen von Matrix B ist. Also A_m,n * B_n,p ergibt eine Matrix R_m,p.

@Topic:
Multiplizieren ist dann ganz einfach. Die Produktsumme jeweils eines Zeilenvektors (von Matrix A) und eines Spaltenvektors (von Matrix B) ergeben einen "Eintrag".
http://bl4ckd0g.funpic.de

Xaron

BeitragDo, Jun 21, 2007 16:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Richtig. Und wie man 2 4x4-Matrizen multipliziert, hab ich ja oben geschrieben.

Desweiteren ergibt sich daraus natürlich, dass es nicht egal ist, in welcher Reihenfolge die Multiplikation erfolgt - das ist ja gerade wichtig für die Multiplikation von Transformationsmatrizen.

Gruß - Xaron
Cerberus X - Monkey X Reloaded!
 

Yogu

BeitragDo, Jun 21, 2007 17:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Also der Reihe nach:
1. Die Handschrift: War in nem anderen Wiki: DGL Wiki

2. @kriD: _32 bedeutet M[9], wie Xarom beschreibt, oder Mathematisch:

o o o o
o o o o
o x o o
o o o o

3. Das eigentliche:

Wenn ich Xaroms Code erfolgreich umformuliert habe, heißt das:

Code: [AUSKLAPPEN]
    _11 := M1._11 * M2._11 + M1._21 * M2._12 + M1._31 * M2._13 + M1._41 * M2._14;
    _12 := M1._12 * M2._11 + M1._22 * M2._12 + M1._32 * M2._13 + M1._42 * M2._14;
    _13 := M1._13 * M2._11 + M1._23 * M2._12 + M1._33 * M2._13 + M1._43 * M2._14;
    _13 := M1._14 * M2._11 + M1._24 * M2._12 + M1._34 * M2._13 + M1._43 * M2._14;

    _21 := M1._11 * M2._21 + M1._21 * M2._22 + M1._31 * M2._23 + M1._41 * M2._24;
    _22 := M1._12 * M2._21 + M1._22 * M2._22 + M1._32 * M2._23 + M1._42 * M2._24;
    _23 := M1._13 * M2._21 + M1._23 * M2._22 + M1._33 * M2._23 + M1._43 * M2._24;
    _23 := M1._14 * M2._21 + M1._24 * M2._22 + M1._34 * M2._23 + M1._43 * M2._24;

    _31 := M1._11 * M2._31 + M1._21 * M2._32 + M1._31 * M2._33 + M1._41 * M2._34;
    _32 := M1._12 * M2._31 + M1._22 * M2._32 + M1._32 * M2._33 + M1._42 * M2._34;
    _33 := M1._13 * M2._31 + M1._23 * M2._32 + M1._33 * M2._33 + M1._43 * M2._34;
    _33 := M1._14 * M2._31 + M1._24 * M2._32 + M1._34 * M2._33 + M1._43 * M2._34;

    _41 := M1._11 * M2._41 + M1._21 * M2._42 + M1._31 * M2._43 + M1._41 * M2._44;
    _42 := M1._12 * M2._41 + M1._22 * M2._42 + M1._32 * M2._43 + M1._42 * M2._44;
    _43 := M1._13 * M2._41 + M1._23 * M2._42 + M1._33 * M2._43 + M1._43 * M2._44;
    _43 := M1._14 * M2._41 + M1._24 * M2._42 + M1._34 * M2._43 + M1._43 * M2._44;


Es tut sich aber so ziemlich nichts. Ich hoffe, der Code ist einigermaßen verständlich.

Und dann noch: Was ist mit der Reihenfolge? Ich muliplizier erst Drehung-X mit Drehung-Y, dann das ganze mit Drehung-Z und dann nochmal alles mit Position.

Die Matritzen sehen folgendermaßen aus:

Code: [AUSKLAPPEN]
Rotation X:
  1    0    0    0
  0   cos  sin   0
  0  -sin  cos   0
  0    0    0    1

Rotation Y:

 cos   0  -sin   0
  0    1    0    0
 sin   0   cos   0
  0    0    0    1

Rotation Z:

 cos  sin   0    0
-sin  cos   0    0
  0    0    1    0
  0    0    0    1

Verschiebung:

  1    0    0    0
  0    1    0    0
  0    0    1    0
  x    y    z    1
www.yogularm.de/df/design/signature.png

Farbfinsternis

BeitragDo, Jun 21, 2007 18:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Super ist dass alle wissen worum ist geht, nur das zählt.


Ich habe keinen Plan was das alles bedeutet und wozu so ein mathematisches Gewese gut ist, nimm einfach B3D Very Happy Very Happy Very Happy
Farbfinsternis.tv
 

Yogu

BeitragDo, Jun 21, 2007 18:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Farbfinsternis hat Folgendes geschrieben:
Super ist dass alle wissen worum ist geht, nur das zählt.


Ich habe keinen Plan was das alles bedeutet und wozu so ein mathematisches Gewese gut ist, nimm einfach B3D Very Happy Very Happy Very Happy


Wenn du 'ne Engine schreiben willst, musst du dich halt mit sowas auseinandersetzen.
www.yogularm.de/df/design/signature.png

Farbfinsternis

BeitragDo, Jun 21, 2007 19:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Gott sei Dank würde ich nie auf die Idee kommen die großartige Arbeit anderer überbieten zu wollen. Da benutze ich lieber Matrizen-Fertig-Lösungen wie Ogre, Blitz3D, miniB3D, Irrlicht oder diese neue 3D Engine für PB, B3D und Max dessen Name mir gerade entfallen ist.

Da gibts aber auch noch Crystal, Nebula und wie sie alle heissen ... wozu also eine weitere entwickeln?
Farbfinsternis.tv
 

Yogu

BeitragDo, Jun 21, 2007 19:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Ganz einfach: Ich möchte auch dahinter kommen, wie so ein kompliziertes 3D-Spiel aufgebaut ist.
Und wer sagt, dass ich andere überbieten will? Ich werde es nie schaffen, etwas nur ansätzliches wie Stranded II (programmiert in B3D) zu erschaffen.
www.yogularm.de/df/design/signature.png

hectic

Sieger des IS Talentwettbewerb 2006

BeitragDo, Jun 21, 2007 20:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Es ist immer gut, wie etwas im Hintergrund funktioniert. Leute die sowas garnicht erst wissen wollen, sind die ersten die bei kleinigkeiten sofort wieder eine Frage in's Forum stellen. Nicht dass ein Forum auch für sowas da ist, aber sie selber kommen einfach nicht vorran an ihrer Arbeit.

Leute wiederrum die auch nur grob wissen, wie etwas im Hintergrund funktioniert, werden bei einem ungewolltem Effekt meist sofort eine Gegenmassnahme wissen. Dabei brauchen sie keine Fragen in's Forum stellen und können gleich weiter arbeiten.^^
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

TheShadow

Moderator

BeitragDo, Jun 21, 2007 21:51
Antworten mit Zitat
Benutzer-Profile anzeigen
hier erklärt:

http://blitzbase.de/lexikon/matrix.htm
AMD64 3500+ | GeForce6600GT 128MB | 1GB DDR | WinXPsp2
 

Yogu

BeitragSa, Jun 23, 2007 13:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Ganz großes Danke an den Schatten: Ganz unten bei Quelle steht ein Verweis zu genau dem, das ich brauche. Eine komplette Anleitung zum Programmieren mit Direct3D. Da steht auch, dass Direct3D eine Funktion zur Mulitiplikation von Matritzen zur Verfügung stellt, ich muss sie nur noch finden.

Frage beantwortet!
www.yogularm.de/df/design/signature.png
 

trooper

BeitragSa, Jun 23, 2007 17:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
Ich habe keinen Plan was das alles bedeutet und wozu so ein mathematisches Gewese gut ist, nimm einfach B3D


Mathematisches Gewese ist überhaupt nicht wichtig fürs Programmieren; die Mathematiker schreiben doch eh nur alles hin was ihnen grad so einfällt und das ist absolut unzusammenhängend.
Wenn du wirklich programmierst (inwieweit BB programmieren ist, lässt sich eh streiten) solltest du zumindest Grundkonzepte linearer Algebra beherrschen.

@Yogu
Als ich noch mit Direct3D gearbeitet habe, war die Matrix Multiplikation nicht direkt in d3d integriert, sondern in einer Helper Library (d3dx), damals hieß die funktion D3DXMatrixMultiply(...), kann sein, dass es inzwischen ganz in DirectX drin ist, aber sollte auf jeden Fall so ähnlich heißen. Normalerweis ist es immer schneller (außer du tuts dir sehr viel an) diese Funktionen zu benutzen als den Code selber zu schreiben, weil sie die CPU mit allen Erweiterung benützen (SSE, 3DNow, etc.) aber IMHO schadet es nicht sie selbst zu schreiben, ist eine gute Übung.

edit: Es könnte sein, dass du die Matrix noch transponieren muss, wenn du obige Funktion verwendest (D3DXTransposeMatrix(...)), weil DirectX die Translation in der 4. Spalte speichert und nicht in der 4. Zeile, oder war das OpenGL!? ... nur für den Fall, dass du komische Ergebnisse bekommst...

Lg Stefan
-- imtane.de.vu --
a cherring ping
 

David

BeitragSa, Jun 23, 2007 17:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Yogu hat Folgendes geschrieben:
Ganz großes Danke an den Schatten: Ganz unten bei Quelle steht ein Verweis zu genau dem, das ich brauche. Eine komplette Anleitung zum Programmieren mit Direct3D. Da steht auch, dass Direct3D eine Funktion zur Mulitiplikation von Matritzen zur Verfügung stellt, ich muss sie nur noch finden.

Frage beantwortet!


Code: [AUSKLAPPEN]

D3DXMATRIX * D3DXMatrixMultiply(
  D3DXMATRIX * pOut,
  CONST D3DXMATRIX * pM1,
  CONST D3DXMATRIX * pM2
);
http://bl4ckd0g.funpic.de
 

Yogu

BeitragSa, Jun 23, 2007 19:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Das einzige Problem, das ich nun habe, ist die Reihenfolge in der die einzelnen Matritzen multipliziert werden sollen.
Sonst müsste eigentlich alles klappen.
www.yogularm.de/df/design/signature.png
 

trooper

BeitragSa, Jun 23, 2007 21:34
Antworten mit Zitat
Benutzer-Profile anzeigen
x Rotation, y Rotation, z Rotation, Skalierung, Translation, wobei ich mir bei den Rotationsmatrizen nicht ganz sicher bis, im Prinzip sollte dort die Reihenfolge keine Rolle spielen. Mit der angegebenen Reihenfolge kannst du ein objekt um seine achse drehen. du kannst dir das ganze so vorstellen:

am anfang ist das objekt im ursprung, dort kann es nun gedreht und skaliert werden, und erst am ende wird es verschoben. verschiebst du am anfang drehst du das objekt nicht relativ zu seinem mittelpunkt, sondern zum nullpunkt des koordinatensystems. am besten spielst du einfach mal ein bisschen mit den reihenfolgen rum, dann merkst du schnell, wie du multiplizieren musst um den von dir gewünschten effekt zu haben.

lg
-- imtane.de.vu --
a cherring ping

TheShadow

Moderator

BeitragSo, Jun 24, 2007 17:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
x Rotation, y Rotation, z Rotation, Skalierung, Translation, wobei ich mir bei den Rotationsmatrizen nicht ganz sicher bis, im Prinzip sollte dort die Reihenfolge keine Rolle spielen


das ist so richtig... die Reihenfolge spielt soweit ich weiß doch eine Rolle
AMD64 3500+ | GeForce6600GT 128MB | 1GB DDR | WinXPsp2

Neue Antwort erstellen


Übersicht Sonstiges Smalltalk

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group