3D: Um x- und y-Achse drehen



  • 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.png

    Drehung bei 90°:
    http://s1.directupload.net/images/120103/toaq24bd.png

    Drehung 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. 😃


Anmelden zum Antworten