3D: Um x- und y-Achse drehen
-
Hi,
ich habe mir letztens ein Buch über 3D-Spiele Programmierung gekauft. Es klappt auch alles so weit, bis auf eine Sache: Ein Objekt lässt sich zwar um die z-Achse drehen, aber nicht um die x- und y-Achse! Den Informationen aus dem Buch heraus, hab ich mir eine Formel zusammen gestellt, um dies zu bewerkstelligen, leider klappt die Formel nur zum Teil:
//Formel zur Drehung um die x-Achse double y2 = y; double z2 = z; y = - sina * z2 + cosa * y2; z = sina * y2 + cosa * z2;
An sich klappt die Formel, wenn ich das Objekt um 360° drehen lasse ist es auch wieder an der selben Stelle wie zuvor, aber wenn jetzt z.B. z 1.5 und y -100 ist, ich das Objekt um 90° drehen lasse, dann ist das neue z -100, was damit natürlich auf keinen Fall sein kann. Hoffe jemand kann mir sagen, was ich falsch mache!
-
aber nicht um die x- und y-Achse
Was meinst du damit? Man kann normalerweise kann nur um eine Achse gedreht werden. Ansonsten arbeitet man mit hierarchischen Koordinatensystemen.
-
Laut meines Buches soll das aber gehen:
x' = (x * cosa) + (y *(-sina))
y' = (x * sina) + (y * cosa)[...]
Die gezeigte Gleichung kann als Rotation um die z-Achse angesehen werden. Möchte man sie zur Rotation um die x- oder y-Achse umfunktionieren, so erfordert das nur einfache Vertauschung der Variablennamen. Dementsprechend sehen die drei Rotationsmatrizen so aus:
[...]
-
x- oder y-Achse vs. x- und y-Achse!
z 1.5 und y -100 ist, ich das Objekt um 90° drehen lasse, dann ist das neue z -100, was damit natürlich auf keinen Fall sein kann
Ach, und warum kann das auf keinen Fall sein? Was erwartest du denn? Ich wuerde entweder +100 oder -100 erwarten, je nachdem wie rum man nun dreht.
-
Hey
Rotation ist bei mir schon eine Weile her, dafür keine Garantie für korrekte Informationen an dieser Stelle, aaber wenn Dein neues y = -1.5 ist nach der Drehung um 90° ist, dann könnte alles passen - die Formel sieht nämlich gut aus. Aber ist nur ne Vermutung nach kurzer Begutachtung meines drei-Finger-Koordinatensystems.. :xmas2:
Vielleicht stellst Du Dir auch etwas anderes vor, als das was wirklich rauskommt. Am Anfang passiert das durchaus öfter. Ich habe mir damals dann immer ein simples, buntes Koordinatensystem mit ausgegeben lassen, danach war dann immer klar, was passiert...Viel Glück noch!
-
knivil schrieb:
Ach, und warum kann das auf keinen Fall sein? Was erwartest du denn? Ich wuerde entweder +100 oder -100 erwarten, je nachdem wie rum man nun dreht.
Naja, wenn ich y auch noch ausrechne kommt für y -1,5 raus. Da die beiden ja wegen Projektion geteilt werden, also -1,5 / -100 kommt dann als zweidimensionale y-Koordinate 0,015 raus, kann das denn stimmen?
Wenn ich jetzt einen zweiten Punkt dazu nehme der die Wert y = -200 und z = 1,5 hat, kommt als zweidimensionale y-Koordinate 0,0075 raus. Das Objekt wäre wahrscheinlich nicht mal ein Pixel groß
. Das Problem ist eben, dass x und y durch z geteilt werden, und somit 1 Einheit auf der z-Achse nicht genauso viel ist, (anders als bei der Drehung um die z-Achse, bei der 1 Einheit auf der x-Achse genauso viel ist wie 1 Einheit auf der y-Achse) wie 1 Einheit auf der x- oder y-Achse. Das Resultat auf dem Bildschirm stimmt eben auch nicht. Bei einer 90° Drehung sieht man das Objekt gar nicht mehr. Bei einer 180° Dreheung ist der halbe Bildschirm ausgefüllt. Bei einer 270° Drehung dann wieder nichts, und bei einer Drehung um 360°, ändern sich die Koordinaten des Objekt nicht.
-
Kann es sein, dass man bei der Translation der z-Achse nur die z-Koordinate miteinbeziehen darf?
-
Irgendwie solltest du etwas mehr liefern als nur eine grobe Beschreibung, z.B. Code. Ich habe keine Ahnung, wie deine "Projektionsmatrix" ausschaut, keine Ahnung wie dein Koordinatensystem liegt, keine Ahnung welche 3D-Schnittstelle du verwendest, keine Ahnung was fuer ein Objekt, ...
Bei einer 90° Drehung sieht man das Objekt gar nicht mehr
Was fuer ein Objekt? Ist es eine Ebene und deine z-Achse zeigt nach oben und sie befindet sich in der Mitte, dann schaust du direkt drauf. Wie ein Blatt Papier von der "Seite".
Kann es sein, dass man bei der Translation der z-Achse nur die z-Koordinate miteinbeziehen darf?
Rotation, Translation, was denn nun?
Formuliere dein Problem ordentlich! Also: gegeben, gesucht, Ansatz, Erwartung, Beobachtung, Widerspruch. Also: Welches Objekt liegt wo in welchem Koordinatensystem. Eine Drehung/Verschiebung(?) des Objektes. Dabei werden die Punkte an dieser Stelle erwartet. Sie liegen aber an jener Stelle.
-
Also, zuerst mal mit "Objekt" meinte ich mehrere miteinander verbundene Punkte.
Und mit Translation meinte ich Transformation, also eine Veränderung des Punktes.
Nochmal von vorn: Wenn ich 3 Punkte gegeben hab: p1(-100, -100, 1.5), p2(100, -100, 1.5), p3(100, 100, 1.5), bringe ich diese ja mittels Division durch die z-Achse auf den zweidimensionalen Bildschirm. Also für das kartesische Koordinatensystem habe ich dann folgende Koordinaten: p1(-100 / 1.5, -100 / 1.5), p2(100 / 1.5, -100 / 1.5), p3(100 / 1.5, 100 / 1.5) also p1(-66.66, -66.66), p2(66.66, -66.66), p3(66.66, 66.66). Ich will die drei Punkte jetzt um 90° auf der z-Achse rotieren lassen. Laut meines Buches dürfte diese Formel korrekt sein:
//Formel zur Drehung um die x-Achse double y2 = y; double z2 = z; y = - sina * z2 + cosa * y2; z = sina * y2 + cosa * z2;
Wenn ich jetzt alle Punkte mit dieser Formel transformiere dann erhalte ich für die Punkte die folgenden Werte: p1(-100, -1.5, -100), p2(100, -1.5, -100), p3(100, -1.5, 100). Wenn ich diese jetzt wieder durch die z-Achse teile, erhalte ich folgende Punkte für das kartesische Koordinatensystem: p1(1, 0.015), p2(-1, 0.015), p3(1, -0.15). Wenn man nun diese 3Punkte miteinander verbindet, ist die nachher entstehende Figur nicht einmal 2Pixel groß. Ich kann mir aber nicht vorstellen, dass die Höhe und Breite der Figur der 3 verbundenen Punkte von 132px wegen einer Drehung auf nicht einmal 1Pixel herabgesetzt wird!
Wenn ich nun in der Realität ein "Objekt" um 90° um die "x-Achse" drehe, verkleinert sich dies auch nicht dermaßen. Ich vermute deshalb, dass diese Koordinaten nicht stimmen können, da auch bei einer Drehung mit den 1000-fachen Werten die Punkte sich ebenfalls derartig verkleinern. Eher werden die Punkte nach der Transformation kleiner je größer sie vorher waren
-
natürlich verkleinert sich ein Objekt in der echten Welt auch so stark. Nimm ein Blatt Papier. Schaue es Frontal an. Dann drehe es um *exakt* 90° in irgendeine Richtung. Was passiert? du schaust auf den Rand des Blattes. Wie breit ist der Rand? verdammt dünn.
nun bedenke dass deine Punkte eine exakte mathematische Ebene definieren. eine mathematische Ebene hat aber dicke 0. Wenn du die Ebene also um 90° drehst, schaust du ziemlich exakt aus der Richtung drauf, aus der du nur den Rand sehen kannst - also siehst du nichts.
-
otze schrieb:
natürlich verkleinert sich ein Objekt in der echten Welt auch so stark. Nimm ein Blatt Papier. Schaue es Frontal an. Dann drehe es um *exakt* 90° in irgendeine Richtung. Was passiert? du schaust auf den Rand des Blattes. Wie breit ist der Rand? verdammt dünn.
nun bedenke dass deine Punkte eine exakte mathematische Ebene definieren. eine mathematische Ebene hat aber dicke 0. Wenn du die Ebene also um 90° drehst, schaust du ziemlich exakt aus der Richtung drauf, aus der du nur den Rand sehen kannst - also siehst du nichts.
Ja, das ist richtig, aber in der Realität ändert sich die Breite des Blatt Papiers nicht. Wie ich oben schon erläutert habe, ist die Figur der verbundenen Punkte 2px breit, obwohl sie vorher ca 132px breit war. In der Realität wäre die Breite des Papiers gleich geblieben
. Wie ich schon sagte scheint mir der z-Wert bei allen drei Punkten einfach zu hoch!
Die Drehung ist deshalb (wie auf folgenden Screenshots zu sehen) nur bei 180 und 360° korrekt.Drehung bei 0°:
http://s14.directupload.net/images/120103/wvsx4sd5.pngDrehung bei 90°:
http://s1.directupload.net/images/120103/toaq24bd.pngDrehung bei 180°:
http://s1.directupload.net/images/120103/b4hk57xv.png
-
Wenn ich diese jetzt wieder durch die z-Achse teile
Dein Modell fuer die perspektivische Projektion ist schlecht. Natuerlich ist bspw. eine 100m lange Strecke in 100m Entfernung nur noch 1 lang.
Wie ich schon sagte scheint mir der z-Wert bei allen drei Punkten einfach zu hoch!
Nein, ist er nicht. Streng einfach mal dein raeumliches Vorstellungsvermoegen an. Wenn eine 100m hohe Latte umkippt (90 Grad), dann ist das obere Ende 100m entfernt.
-
Nein, ist er nicht. Streng einfach mal dein raeumliches Vorstellungsvermoegen an. Wenn eine 100m hohe Latte umkippt (90 Grad), dann ist das obere Ende 100m entfernt.
Darum geht es doch gar nicht! Worauf ich hinaus will ist, dass wenn eine 100m lange Latte, die 50cm Durchmesser hat, und dann umkippt nicht plötzlich einen Durchmesser von 5cm zu scheinen hat! Und wenn ein Dreieck mit der Basis 5m umfällt, scheint die Basis auch nicht auf einmal 66 mal kleiner zu sein!
-
Darum geht es doch gar nicht!
Doch, weil:
z-Wert bei allen drei Punkten einfach zu hoch!
Die z-Werte sind nicht zu hoch. Sie sind korrekt. p1, p2, p3 haben die erwarteten 3D-Koordinaten. Deine Transformation auf 2D entspricht nicht der menschlichen Wahrnehmung.
Dreieck mit der Basis 5m umfällt
Es kippt aber nicht an der Basis um. Die Drehachse (x-Achse) aus Sicht des Dreiecks liegt in der "Mitte" quasi auf halber Hoehe.
-
Taeli schrieb:
Und wenn ein Dreieck mit der Basis 5m umfällt, scheint die Basis auch nicht auf einmal 66 mal kleiner zu sein!
Ich muss knivil zustimmen. Deine Projektion reagiert viel zu sensibel auf die Veränderung. Dies entspricht einem Sichtfeld das wesentlich breiter ist als das Menschliche. Zeichne dir einfach mal 2 Sichtfelder mit unterschiedlichen Winkeln auf. Wenn du nun ein gleich großes Objekt in beide Sichtfelder in gleicher Distanz einzeichnest wirst du feststellen, dass das Objekt relativ zur Breite des Sichtfeldes unterschiedlich viel Platz einnimmt.
Wenn du nun das Objekt auf dem Bildschirm zeichnest, muss dieses Verhältnis von Objektgröße und Platz im Sichtfeld eingehalten werden -> größeres Sichtfeld=kleineres Objekt.
Ich versuchs mal zu zeichnen:
B=Beobachter O=Objekt /| / | / OO B - - - -OO \ OO \ | \|<--Distanz zum Sichtfeld rand
Das Sichtfeld auf Höhe des Objektes hat Breite 7. Das Objekt Breite 3. macht ein Verhältnis von 3/7. Jetzt kannst du entweder das Objekt weiter entfernen -> kleineres Verhältnis. Oder du verbreiterst das Sichtfeld:
B=Beobachter O=Objekt /| / | / | / | / | / | / OO B - - - -OO \ OO \ | \ |<--Distanz zum Sichtfeld rand \ | \ | \ | \|
und schon ist das Verhältnis 3/15. Obwohl das Objekt gleich nah ist, wirkt es viel weiter entfernt.
-
Also muss man die Breite des Objekts und die des Sichtfeldes bei der Projektion ins Verhältnis nehmen und auf das transformierte Objekt bei der Projektion übertragen? Oder wie kann man das Problem lösen?
-
in der praxis musst du die Z-koordinate noch mit einem Wert <1 multiplizieren. Die typischen projektionsmatrizen die du bei OpenGL doer DirectX verwendest haben das auch mit drin. Um die zu erstellen brauchst du normalerweise noch einen Parameter für das Sichtfeld. Ließ dir einfach mal Literatur zum Thema durch
-
Ok, dann vielen Dank.