3D Würfel

Hallo,
ich versuche gerade einen Würfel in der Windows Konsole zu basteln, den ich um alle 3 Achsen drehen lassen will. Eine Achse hab ich schon, aber ich hab mit der Berechnung der anderen Achsen Schwierigkeiten. Mein aktueller Stand ist dieser:
http://root.c-tutorials.de/cube2.exe (F1/F2/Pfei hoch/Pfeil runter Tasten)

Die Punkte berechne ich so:
P[0] = offsety+(sin((drehung+45)/180*M_PI)*radius);
P[1] = offsetx+(cos((drehung+45)/180*M_PI))*radius*1.5;
P[2] = (cos((drehung2+45)/180*M_PI)*radius)/2;
P[0] = P[0] + P[2];
P[1] = P[1] - P[2];

Der Grundgedanke ist der, dass sich alle Punkte auf einer Kreisbahn bewegen. Ich berechne also mit sin und cos den Punkt außen auf dem Kreisrand.
/180*M_PI hat damit zu tun, dass sin und cos ihren Wert im Bogenmaß ausgeben und der Wert ins Gradmaß umgerechnet werden muss
*1.5 bei P[1] hat damit zu tun, dass die „Pixel“ in der Windows Console nicht rechteckig sind.
Die Berechnung bei P[2] berechnet den Wert „nach hinten“.

Ich komme nicht darauf wie ich die Berechnung erweitern muss, damit der Würfel auch um die anderen Achsen drehbar ist. Vielleicht hat ja hier jemand eine Idee. Danke schonmal.

mfg Sascha

Hallo,

ich versuche gerade einen Würfel in der Windows Konsole zu
basteln, den ich um alle 3 Achsen drehen lassen will. Eine
Achse hab ich schon, aber ich hab mit der Berechnung der
anderen Achsen Schwierigkeiten.

Grundsätzlich berechnet man 3D-Rotationen am besten mit Hilfe von Matrixprodukten.

Wenn Du eine Rotationsmatrix _ R _ hast und einen Vektor v, dann ist der rotierte Vektor v’ = _ R v_.

Die Rotationsmatizen für die drei Achsen kannst Du leicht „ergoogeln“. Ebenso, wie man mit Matrizen multipliziert (Ich würde sie auch hier posten, aber für Matrizen reicht mir die Darstellung hier nicht aus).

http://www14.informatik.tu-muenchen.de/lehre/1998WS/…

Jetzt musst Du Dir noch einen Algorithmus überlegen, wie Du die Transformation möglichst „elegant“ umsetzt.

Wenn Du OpenGL verwendest, gibt es extra dafür die „glRotate“ Funktion. Das macht die Sache dann erheblich einfacher. Für Direct3D wird es sicher eine ähnliche Funktion geben.

Gruß

Fritze

http://root.c-tutorials.de/cube2.exe (F1/F2/Pfei hoch/Pfeil
runter Tasten)

…und schon hat der Eigentümer von root.c-tutorials.de bei denen,
die es ausprobieren, eine root-shell. Ich glaube, es wäre besser, den Code statt eines intransparenten Executables ins Netz zu stellen. Oder doppelklickst du etwa ausführbare Mailanhänge :smile:? Das ist ziemlich äquivalent dazu, etwas auszuführen, was man in irgendeinem Forum gepostet findet.

Grüße,
Sebastian

Hallo,

ich versuche gerade einen Würfel in der Windows Konsole zu
basteln, den ich um alle 3 Achsen drehen lassen will. Eine
Achse hab ich schon, aber ich hab mit der Berechnung der
anderen Achsen Schwierigkeiten.

Die Punkte berechne ich so:
P[0] = offsety+(sin((drehung+45)/180*M_PI)*radius);
P[1] = offsetx+(cos((drehung+45)/180*M_PI))*radius*1.5;
P[2] = (cos((drehung2+45)/180*M_PI)*radius)/2;
P[0] = P[0] + P[2];
P[1] = P[1] - P[2];

Immer bei so etwas im Auge behalten:

Trigonometrie schlecht
Matrizenrechnung gut.

Der Grundgedanke ist der, dass sich alle Punkte auf einer
Kreisbahn bewegen. Ich berechne also mit sin und cos den Punkt
außen auf dem Kreisrand.
/180*M_PI hat damit zu tun, dass sin und cos ihren Wert im
Bogenmaß ausgeben und der Wert ins Gradmaß umgerechnet werden
muss
*1.5 bei P[1] hat damit zu tun, dass die „Pixel“ in der
Windows Console nicht rechteckig sind.
Die Berechnung bei P[2] berechnet den Wert „nach hinten“.
Ich komme nicht darauf wie ich die Berechnung erweitern muss,
damit der Würfel auch um die anderen Achsen drehbar ist.
Vielleicht hat ja hier jemand eine Idee. Danke schonmal.

Im Grunde möchtest Du ja was anders. Du möchtest, so
wie ich das verstanden habe, die Repräsentation Deines
„Würfels“ irgendwie „drehen“ und eine 2D-Projektion
des „Gedrehten“ Dingens auf dem Bildschirm anzeigen!?

Dabei möchtest Du um *verschiedene* Achsen bzw. um eine
*beliebig definierbare* 3D-Achse drehen? Das Einfachste
wäre dann, einfach

  • eine 3D-Achse V[x,y,z] (die x, y oder z-Achse oder eine Kombination),
  • einen Drehwinkel [alpha] in Grad ,

vorzugeben und daraus

  • eine Rotationsmatrix [3x3] die diese Drehung repräsentiert

zu berechnen. Jetzt mußt du einfach nur noch die
Objektkoordinaten mit der Matrix multiplizieren

[3]-Vektor * [3x3]-Matrix ==> [3]-Vektor

und die „gedrehten“ Koordinaten kommen direkt
heraus = http://de.wikipedia.org/wiki/Drehmatrix

Grüße

CMБ

Hallo,

[3]-Vektor * [3x3]-Matrix ==> [3]-Vektor

Das ist so nicht richtig. Die Multiplikation des Vektors erfolgt von rechts. Also Matrix * Vektor --> Vektor. Die Multiplikation mit Matrizen ist in der Regel leider nicht kommutativ.

Trigonometrie braucht man übrigens auch bei Verwendung einer Drehmatrix. Da stehen Sinüsse und so drin :smile:

Gruß

Fritze

Hallo,

[3]-Vektor * [3x3]-Matrix ==> [3]-Vektor

Das ist so nicht richtig. Die Multiplikation des Vektors
erfolgt von rechts. Also Matrix * Vektor --> Vektor. Die
Multiplikation mit Matrizen ist in der Regel leider nicht
kommutativ.

Ja ok., dann lies es halt rückwärts.

Trigonometrie braucht man übrigens auch bei Verwendung einer
Drehmatrix. Da stehen Sinüsse und so drin :smile:

Das ist aber dann nicht die Rotation sondern schlicht die
Repräsentation des Drehwinkels zum Aufbau der Rotationsmatrix.
Die Rotation selber ist ‚clean‘, die Rotationsmatrix kann
man beliebig aufbauen (sofern man das kann).

Grüße

CMБ

Hallo,

[3]-Vektor * [3x3]-Matrix ==> [3]-Vektor

Das ist so nicht richtig. Die Multiplikation des Vektors
erfolgt von rechts. Also Matrix * Vektor --> Vektor. Die
Multiplikation mit Matrizen ist in der Regel leider nicht
kommutativ.

Ja ok., dann lies es halt rückwärts.

Trigonometrie braucht man übrigens auch bei Verwendung einer
Drehmatrix. Da stehen Sinüsse und so drin :smile:

Das ist aber dann nicht die Rotation sondern schlicht die
Repräsentation des Drehwinkels zum Aufbau der Rotationsmatrix.

Was ist da für dich der Unterschied zur „Rotation“? Natürlich stehen in der Drehmatrix so ziemlich die gleichen Sinus-/Cosinusterme, die man von Hand herausbekäme. Nur dass man sich nicht jedesmal von Neuem diese Arbeit machen muss…

Die Rotation selber ist ‚clean‘, die Rotationsmatrix kann
man beliebig aufbauen (sofern man das kann).

Was bedeutet „clean“? Und kann man das nun oder nicht? Und wieso beliebig? Nicht jede Matrix ist eine Drehmatrix. Ihr Inhalt ist bei gegebenem Winkel und Achse relativ fix.

Grüße,
Sebastian

Hallo,

Trigonometrie braucht man übrigens auch bei Verwendung einer
Drehmatrix. Da stehen Sinüsse und so drin :smile:

Das ist aber dann nicht die Rotation sondern schlicht die
Repräsentation des Drehwinkels zum Aufbau der Rotationsmatrix.

Was ist da für dich der Unterschied zur „Rotation“? Natürlich
stehen in der Drehmatrix so ziemlich die gleichen
Sinus-/Cosinusterme, die man von Hand herausbekäme. Nur dass
man sich nicht jedesmal von Neuem diese Arbeit machen muss…

Cos/Sin ist nur eine Möglichkeit, Skalarprodukt von Vektoren
eine andere. Die Drehung um *eine* (beliebige) Achse direkt
in cos(alpha) anzugeben ist immer problemlos und auch bequem,
daher macht man das auch.

Die Rotation selber ist ‚clean‘, die Rotationsmatrix kann
man beliebig aufbauen (sofern man das kann).

Was bedeutet „clean“? Und kann man das nun oder nicht? Und
wieso beliebig? Nicht jede Matrix ist eine Drehmatrix. Ihr
Inhalt ist bei gegebenem Winkel und Achse relativ fix.

‚Clean‘ bedeutet hier, daß keine Trigonometrie während der
Berechnung der konkreten Objektrotation vorkommt und
daher auch die Probleme bei der „kombinierten Eulerwinkel-
rotation“ nicht auftreten können.
(==> http://de.wikipedia.org/wiki/Gimbal_Lock)

Und man kann eine Rotationsmatrix auch „mit ohne“
expliziten sin/cos-Wert aufbauen, diese sind ja
direkt aus dem Skalarprodukt herleitbar.

Grüße,

CMБ

Cos/Sin ist nur eine Möglichkeit, Skalarprodukt von Vektoren
eine andere. Die Drehung um *eine* (beliebige) Achse direkt
in cos(alpha) anzugeben ist immer problemlos und auch bequem,
daher macht man das auch.

Ich denke doch, es war ein Drehwinkel vorgegeben und nicht ein Paar von Richtungsvektoren.

‚Clean‘ bedeutet hier, daß keine Trigonometrie während der
Berechnung der konkreten Objektrotation vorkommt und
daher auch die Probleme bei der „kombinierten Eulerwinkel-
rotation“ nicht auftreten können.
(==> http://de.wikipedia.org/wiki/Gimbal_Lock)

In der Matrix steht meine Trigonometrie für eine bestimmte Achse und einen bestimmten Winkel vorausberechnet. Möchtest du gerade sagen, dass das besonders gut ist, wenn man viele Vektoren durch die Matrix schickst? Wenn ja – naja, logisch, aber die Zwischenergebnisse kann man sich immer aufheben, auch wenn man kreuz und quer rechnet. Wenn nein, weiß ich nicht, was du meinst.

Potentielle Probleme mit dem Gimbal-Lock hast du dann, wenn du deine Rotation durch mehrere aufeinanderfolgende Rotationen um unterschiedliche Achsen beschreibst. Aber davon war ja bisher nicht die Rede…?

Und man kann eine Rotationsmatrix auch „mit ohne“
expliziten sin/cos-Wert aufbauen, diese sind ja
direkt aus dem Skalarprodukt herleitbar.

Bei einem in Grad oder Bogenmaß angegebenen Winkel stelle ich es mir einigermaßen schwierig vor, ohne sin/cos auszukommen.

Grüße,
Sebastian