Mal 'ne Mathefrage: Matitzen multiplizieren
Übersicht

YoguBetreff: Mal 'ne Mathefrage: Matitzen multiplizieren |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Wo ist auf Wikipedia bei Formeln Handschrift? Die haben dafür doch extra Grafiken, oder? | ||
![]() |
Xaron |
![]() Antworten mit Zitat ![]() |
---|---|---|
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! |
![]() |
kriDBetreff: 11? |
![]() Antworten mit Zitat ![]() |
---|---|---|
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...) |
||
DavidBetreff: Re: 11? |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() ![]() ![]() |
||
Farbfinsternis.tv |
Yogu |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ![]() ![]() ![]() Wenn du 'ne Engine schreiben willst, musst du dich halt mit sowas auseinandersetzen. |
||
www.yogularm.de/df/design/signature.png |
![]() |
Farbfinsternis |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() |
TheShadowModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
hier erklärt:
http://blitzbase.de/lexikon/matrix.htm |
||
AMD64 3500+ | GeForce6600GT 128MB | 1GB DDR | WinXPsp2 |
Yogu |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit 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. 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 |
![]() |
TheShadowModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group