Rotationsmatrix
-
Folgender Code:
public Matrix getRotationsMatrix(double X, double Z) { Matrix rm = new Matrix(4,4); double cX = X * Math.PI/180; // In Radiant umwandeln double cZ = Z * Math.PI/180; double sinx = Math.sin(cX); double sinz = Math.sin(cZ); double cosx = Math.cos(cX); double cosz = Math.cos(cZ); // Rotation jedes Matrixpunktes // 1. Spalte rm.ma[0][0] = cosz; rm.ma[0][1] = -cosx*sinz; rm.ma[0][2] = sinx*sinz; rm.ma[0][3] = -75*((cosz-sinx*sinz)-1); // 2. Spalte rm.ma[1][0] = sinz; rm.ma[1][1] = cosx*cosz; rm.ma[1][2] = -sinx*cosz; rm.ma[1][3] = -75*(sinz+sinx*cosz); // 3. Spalte rm.ma[2][0] = 0; rm.ma[2][1] = sinx; rm.ma[2][2] = cosx; rm.ma[2][3] = 75*(cosx-1); // 4. Spalte rm.ma[3][0] = 0; rm.ma[3][1] = 0; rm.ma[3][2] = 0; rm.ma[3][3] = 1; return rm; }
Ok, für Rotationen braucht man 4x4 Matrizen.
Ich verstehe aber noch nicht, woher die Werte kommen -> z.B. -75*((cosz-sinx*sinz)-1);Kann mir jemand weiterhelfen?
-
Zickedi schrieb:
Ok, für Rotationen braucht man 4x4 Matrizen.
Ich verstehe aber noch nicht, woher die Werte kommen -> z.B. -75*((cosz-sinx*sinz)-1);1. Letztendlich reichen für eine Rotation auch 3x3 Matrizen aus. Dann hat man eben keine homogenen Koordinaten, macht in diesem Fall aber nichts.
2. Der Faktor 75 hat nichts direkt mit der Rotation zu tun. Möglicherweise handelt es sich hier um eine Verschiebung des Rotationsmittelpunkts. Aber vielleicht ist das auch nicht so. Du kannst ja mal ausrechnen, was für eine Matrix herauskommt, wenn du das Objekt vor der Rotation um einen Vektor a verschiebst und nach der Rotation um einen Vektor -a verschiebst. ...ist nur so ne Idee.
3. Da ist meine Variante, was die Erzeugung von Rotationsmatrizen betrifft, falls du noch ne Alternative haben möchtest:
public static Matrix createRotationMatrix(final double xAngle, final double yAngle, final double zAngle) { final double[][] xRot = new double[][]{{ 1, 0, 0}, { 0, Math.cos(xAngle), Math.sin(xAngle)}, { 0, -Math.sin(xAngle), Math.cos(xAngle)}}; final double[][] yRot = new double[][]{{ Math.cos(yAngle), 0, Math.sin(yAngle)}, { 0, 1, 0}, { -Math.sin(yAngle), 0, Math.cos(yAngle)}}; final double[][] zRot = new double[][]{{ Math.cos(zAngle), Math.sin(zAngle), 0}, { -Math.sin(zAngle), Math.cos(zAngle), 0}, { 0, 0, 1}}; return new Matrix(zRot).mulBack(new Matrix(yRot)).mulBack(new Matrix(xRot)); } }
-
Letztendlich reichen für eine Rotation auch 3x3 Matrizen aus
Begründung, homogene Koordinaten?
Wann homogene, wann inhomogene Koordinaten?
Dann seh ich etwas klarer.Zu 2) Werd ich testen. Denk ich auch, dass ne Verschiebung im Spiel ist.
Zu 3) Wie sehen denn die Matrizen für 4x4 aus?
Ich versuche noch auf die Gleichungen wie "rm.ma[0][3] = -75*((cosz-sinx*sinz)-1);" zu kommen?
-
Zickedi schrieb:
Letztendlich reichen für eine Rotation auch 3x3 Matrizen aus
Begründung, homogene Koordinaten?
Wann homogene, wann inhomogene Koordinaten?
Dann seh ich etwas klarer.Mit einer 3x3 Matrix kannst du nicht alle affinen Transformationen abbilden. So funktioniert z.B. die Rotation, aber die Translation ist mit einer 3x3 Matrix für Koordinaten des R³ nicht durchführbar. Da man aber beliebig viele Transformation mit EINER Matrix ausdrücken will, stellt man nun einfach ALLE Transformations-Matrizen als 4x4 Matrizen dar. Jetzt ist allerdings die Multiplikation mit den Koordinaten des R³ (meistens dargstellt als 1x3 Matrizen) nicht mehr definiert. Deshalb transformiert man nun die Koordinaten in homogene Koordinaten, in dem man ihnen einfach eine 4. Komponente hinzufügt (oft rhw genannt). Diese 4. Komponente wird meistens einfach auf 1 gesetzt.
-
Wann homogene, wann inhomogene Koordinaten?
homogen heißt einfach gleich - und homogen koordinaten werden eingeführt um mithilfe von matrizen translationen beschreiben zu können