Eigenes "3D rotate"

int !? :eek: Da sollte schleunigst double oder zumindest float rein, sonst wirst du bei den meisten Rotationsmatrizen mit den Einträgen „sin(alpha)“ ein Problem bekommen :wink:

ähh jaja klar :wink:
das wollte ich also noch ändern ^^

und ansonsten ist es ok, oder?

Hmja, was heißt „OK“. Man kann unterschiedlichste Prioritäten setzen. Aus rein Objektorientierter Sicht ist nicht so schön, dass jemand
matrix.getMatrixData()[0] = null; // Ätsch
schreiben könnte - wozu muss der Array so exponiert sein? Ob das ein 1D- oder 2D-Array ist, oder ob die 16 floats einzeln gespeichert werden, geht eigentlich keinen was an.

Ansonsten hängt das stark von den Zielen ab. Im Moment ist das eine allgemeine Matrix-Klasse. Da könnte zumindest noch ein
setToIdentity()
rein. Aber speziell für 4x4-Matrizen (also solche für 3D-Berechnungen) wären halt Methoden praktisch wie
setToRotationAboutX(float angleRad);
setToTranslation(float dx, float dy, float dz);
usw. Wie würdest du jetzt eine Rotationsmatrix erstellen? Wenn du schreiben müßtest

matrix.setCellData(0,0,whatever);
matrix.setCellData(0,1,whateverMitSinusUndSo);
matrix.setCellData(0,2,whateverMitCosinusUndSo);
...
matrix.setCellData(3,3,whatever);

wäre das ja eher unpraktisch :wink:

ja ich dachte da an ein:

//x  = sin cos dingsbums
int rotationMatrixData[][] = {
    {1, 0, 0, 0},
    {0, x, x, 0},
    {0, x, x, 0},
    {0, 0, 0, 1}
}
Matrix R = new Matrix(rotationMatrixData);

aber naja, werde vielleicht dann diese methoden noch mit einbauen.
SObald ich sie brauche, wahrscheinlich, danke. :wink:

aber noch eine frage:

wenn ich jetzt meine (4x1) Punktmatrix mit der (4x4) Rotationsmatrix multipliziere - dann kommt doch eine (4x4) matrix raus - wie hol ich mir daraus denn dann die neue Punkt-Matrix ?
(sry, ich hab mir jetzt angewöhnt sie so zu nennen :stuck_out_tongue: )

Respekt das du dir das alles iin zwei Tagen reingezogen, verstanden und beigebracht hast!
Ein paar Links zufaellig? :DD

öh… ja erstmal diesen thread 5mal durchlesen… dann das hier, ein bissl wikipedia…
und dann hat man (so wie ich jetzt) ungefähr 0.00015% der materie verstanden :slight_smile:

^^ danke

[QUOTE=mymaksimus]
wenn ich jetzt meine (4x1) Punktmatrix mit der (4x4) Rotationsmatrix multipliziere - dann kommt doch eine (4x4) matrix raus - wie hol ich mir daraus denn dann die neue Punkt-Matrix ?[/QUOTE]

Man multipliziert ja 4x4 mit 4x1. Und da kommt 4x1 raus. Allgemein AxB * BxC = AxC.

Stimmt, danke.

*** Edit ***

Die naechste sache: ok ich hab meine punkt matrix und meine transformationsmatri x / zen; und kann nach belieben neue koordinaten berechnen, -
Aber ich kann do h nur x und y koordinaten zum zeichnen angeben… das heisst ich brauch noch eine andere matrix die das dann in x, y umrechnet, oder? Wie nennt man das, damit ich googeln kann?

[QUOTE=mymaksimus]Die naechste sache: ok ich hab meine punkt matrix und meine transformationsmatri x / zen; und kann nach belieben neue koordinaten berechnen, -
Aber ich kann do h nur x und y koordinaten zum zeichnen angeben… das heisst ich brauch noch eine andere matrix die das dann in x, y umrechnet, oder? Wie nennt man das, damit ich googeln kann?[/QUOTE]Projektionsamatrix heisst das Teil. Kannst dich noch an deinen Thread erinnern, wo du ein Bild in den Raum drehen wolltest?
http://forum.byte-welt.net/threads/10514-Java-Image-durch-Verzerrung-räumlich-erscheinen-lassen?
Kannst dir ja meine Beispiele dort mal genauer ansehen, der Quellcode ist (normalerweise) in den Archiven. Entpacken… Quellen in ein neues Eclipse-Projekt einfügen, im Debugmodus starten, Breakpoint setzen und in Einzelschritten nachvollziehen. Vllt. gelingt es dir ja, in die Beispiele noch Projektionsmatritzen zu implementieren.

gut… werde ich mal gucken. danke erstmal!

Projektionsmatrix. Wobei da ggf. noch die Perspektivische Verzerrung dazu kommen kann, dann kann die etwas unübersichtlicher werden. Um das ganze nur auf die xy-Ebene zu klatschen, tut’s die 4x4-Matrix
1 0 0 0
0 1 0 0
0 0 0 0
0 0 0 1
:smiley:

EDIT: Hoppala, hätte mal reloaden sollen :o

moment mal: dieses ding muss ich mit der Punkt Matrix multiplizieren? o.O
Dann kommt kommt doch fast immer null raus, oder spinn ich grade?
Moment ich probiers mal aus.

Damit werden alle z-Werte 0. Sonst ändert sich nichts.

hä, aber wenn z irgendwie anders ist - dann wird doch eventuell auch x und y verändert…?

naja, also wenn ich annehme, ich hätte das Drahtgitter eines Würfels, also Linien, deren Endpunkte ich kenne und ich drehe die Punkte,
dann genügt es doch noch immer für die Darstellung der Gitterlinien einfach die X und Y Koordinaten zu verwenden, sofern es keine perspektivische Verzerrung zu berücksichtigen gibt.
Da muss ich dann doch nicht noch ne Matrix benutzen, die am Ende eh nichts anderes tut, als die Z-Koordinate auf 0 zu setzen.

[QUOTE=mymaksimus]moment mal: dieses ding muss ich mit der Punkt Matrix multiplizieren? o.O
Dann kommt kommt doch fast immer null raus, oder spinn ich grade?
Moment ich probiers mal aus.[/QUOTE]Die genullten Z-Achsen bedeuten nur, dass die Z-Werte ignoriert werden können. Nan kann diese Z-Werte aber auch nutzen… z.B. wenn man den Vordergrund mit kräftigen Farben füllt und dann in Richtung Hintergrund die Sättigung verringert. Das WireFrame-Demo des JDKs z.B. macht das so.

*** Edit ***

[QUOTE=pappawinni;71271]naja, also wenn ich annehme, ich hätte das Drahtgitter eines Würfels, also Linien, deren Endpunkte ich kenne und ich drehe die Punkte,
dann genügt es doch noch immer für die Darstellung der Gitterlinien einfach die X und Y Koordinaten zu verwenden, sofern es keine perspektivische Verzerrung zu berücksichtigen gibt.
Da muss ich dann doch nicht noch ne Matrix benutzen, die am Ende eh nichts anderes tut, als die Z-Koordinate auf 0 zu setzen.[/QUOTE]Das ist korrekt… Marcos Prokektionsmatrix ist ja auch “nur” eine orthogonale Projektionsmatrix, welche man ignorieren kann. Also fehlen dort die räumlichen Verzerrungen.

Nein. Alle Elemente der Matrix, die mit dem z-Wert des Vektors multipliziert werden oder zum z-Wert des Ergebnisvektors beitragen sind 0.

Sicher, in diesem Fall ist das nicht notwendig. Aber wie Spacerat schon sagte kann man in so eine Matrix auch die Perspektive mit reinmultiplizieren (im Prinzip das Produkt der letzten beiden von Homogene Koordinaten – Wikipedia). Und es gibt AFAIK zumindest auf der untersten Ebene der Graphischen Datenverarbeitung Gründe, „alles“ in einer Matrix zusammenfallen zu lassen, und am Ende die Punkte da durchzunudeln um die fertig in 2D projizierten Punkte zu bekommen. Die zeichnet man ja üblicherweise dann nicht 1:1 auf den Bildschirm, sondern bildet sie nochmal von der „virtuellen Sichtebene“ auf die Tatsächliche Bildschirmfläche ab. Aber das wirklich nur AFAIK - die Details dazu hab’ ich nicht mehr so präsent. Hab’ zwar gerade nochmal kurz in der Bibel geblättert (DA steht das alles wirklich in Detail drin…), aber … erstens ist es schon spät, und zweitens ist es schon arg lange her, dass das auch nur Ansatzweise für mich relevant war (und „relevant“ heißt selbst da nur, dass man irgendwelche Klassiker wie Cohen Sutherland, Bresenham oder irgendwelche Viewtransformationen halt mal händisch durchexerziert haben wollte, … „aus Prinzip“ :wink: )

Also für mich ist das noch nicht so lange her (naja, meine Halbwertzeiten für manches Wissen sind eh’ ungewöhnlich lang). In OpenGL muss man stets eine Projektions- und eine Viewmatrix definieren (GL_PROJECTION & GL_MODELVIEW) und ich nehme mal stark an, dass diese beiden in der GPU noch miteinander multipliziert werden, bevors ans Rendern geht. Die einzige Lücke bei mir: Wie berechnet man eine solche Projektionsmatrix aus Angle, Ratio, Near und Far bzw. aus Right, Left, Top, Bottom, Near und Far?

Man scrollt auf sowas wie OpenGL Projection Matrix über die Formeln weg und tippt die Matrix ab, die ganz unten steht :smiley: (Naja, sie steht auch im RedBook…)