3D-Grafik Probleme beim drehen von Objekten

Massta

Mitglied
Hallo,
ich habe ein Problem. Ich möchte einen dreidimensionalen Vektor (einfach einen Pfeil) drehen. Also ich will nicht den Vektor selbst drehen, sondern nur den angezeigten. Dabei kommen aber seltsame Werte raus.
Java:
    public void drawVektor(Graphics g, Vektor v){
        double x1, x2, x3, y1, y2, y3, z1, z2, z3;

        //Rotation um die z-Achse:
        x1 = v.x * Math.cos(Math.PI*dz/180) - v.y * Math.sin(Math.PI*dz/180);
        y1 = v.x * Math.sin(Math.PI*dz/180) + v.y * Math.cos(Math.PI*dz/180);
        z1 = v.z;

        //Rotation um die x-Achse:
        x2 = x1;
        y2 = y1 * Math.cos(Math.PI*dx/180) - z1 * Math.sin(Math.PI*dx/180);
        z2 = y1 * Math.sin(Math.PI*dx/180) + z1 * Math.cos(Math.PI*dx/180);

        //Rotation um die y-Achse:
        x3 = z2 * Math.sin(Math.PI*dy/180) + x2 * Math.cos(Math.PI*dy/180);
        y3 = y2;
        z3 = z2 * Math.cos(Math.PI*dy/180) - x2 * Math.sin(Math.PI*dy/180);

        double xt = 1 * x3 / (0.1 + z3);
        double yt = 1 * y3 / (0.1 + z3);
        drawArrow(g, xUrsprung,yUrsprung,
            xUrsprung+(int)xt,
            yUrsprung-(int)yt);

    }

Das ist meine Methode um die Werte von 3d auf 2d zu bringen.
Vektor ist eine Klasse, die (bis jetzt) genau 3 public double Werte enthält, nämlich x, y und z.
dx, dy und dz sind die jeweiligen Drehfaktoren in Grad.
xt und yt sind die Koordinaten, die später auf dem Bildschirm angezeigt werden sollen, und xUrsprung und yUrsprung sind die Werte des Ursprungs des Koordinatensystems auf dem Screen, da es beliebig verschoben werden kann.
Was ist mein Fehler?
 
Was ist mein Fehler?

Soll die Art der Fragestellung implizieren, dass du davon ausgehst, dass es nur EINEN Fehler gibt? :joke:

Anscheinend werden da drei Sachen vermischt:
1. Drehen
2. Projizieren
3. Zeichnen
Versuch' vielleicht mal, die einzeln zu machen.

Was ein "Drehfaktor" ist, ist mir auch nicht klar. Ein Winkel, vermutlich.

Wie wenig ... "Einfühlungsvermögen in die Arbeit eines Computers" ... notwendig ist, um zu erkennen, dass dort irgendwo auch Zeilen wie
Java:
double dxRad = Math.toRadians(dx);
...
double cx = Math.cos(dxRad);
double sx = Math.sin(dxRad);
...
usw vorkommen sollten, darüber will ich gerade nicht nachdenken.

Den Vektor in dieser Form zu drehen kann übrigens auch im "perfekt (und fehlerfrei) umgesetzten Fall" zumindest zu einem Gimbal Lock ? Wikipedia führen, aber OB das gepostete in dieser Form fehlerfrei ist, kann ich nicht nachvollziehen (speziell ob die nachfolgenden Drehungen richtig auf die "Zwischenergebnisse", d.h. die x1...z3, angewendet werden).

Schon mal über eine Klasse "Matrix" nachgedacht? Drehmatrix ? Wikipedia
 
Hallo Marco,
zu dem vermischen.. So gesehen mache ich sie doch einzeln. Zuerst hole ich mir die gedrehten Werte, dann berechne ich die Koordinaten fürs Programm und dann lass ich das ganze Zeichnen, was soll ich da noch trennen?

Mit Drehfaktor ist Winkel gemeint 😀

Ich hatte ehrlich gesagt gedacht, dass das mit
Java:
Math.PI*dy/180
erspart bleibt.
Hoffentlich kann ich hier eine Lösung finden, ich brauche nämlich die reinen Algorithmen für etwas anderes.

Die Rotationen um die Achsen basieren bereits auf Drehmatrizen, für die 3 Teile brauche ich keine extra Klasse. Klar - das würde das ganze etwas übersichtlicher gestalten, aber so muss es auch irgendwie gehen.
 
Ich habe jetzt übrigens die Lösung gefunden. Das Tutorial nach dem ich gearbeitet habe, hat leider andere Achsennamen verwendet, also statt x1, x2 und x3 dann z, y und x. Desweiteren ist es nicht
Java:
Math.PI/grad*180
sondern
Java:
grad/180*Math.PI
.
Wen das Thema interessiert, hier das (nicht sehr ausführliche) Tutorial:
TECH_REF
 
Weder noch, sondern [c]Math.toRadians(deg);[/c]...

Also es funktioniert auch so, aber ich probiere es mal aus wenn ich die toRadians Methode benutze!

Ich habe noch ein problem, zwar werden die dreidimensionalen Objekte jetzt richtig gezeichnet und man kann durch diesen cyberspace laufen und es funktioniert alles einigermaßen, aber sobald sich ein (oder mehrere) Objekte hinter die "Kamera" bewegen, werden zuerst Koordinaten berechnet die links oben in der Ecke sind (-21000000irgendwas, -21000000irgendwas), und wenn man noch mehr Schritte nach vorne macht werden diese Objekte ab der horizontalen Hälfte des Fensters gespiegelt und laufen rückwärts wieder in den Bildschirm rein! Woran liegt das? Eigentlich sollten diese hinter der Kamera ja weiter nach hinten verlaufen 😀

https://www.dropbox.com/s/a5v2t0tphqajcgp/fehler.JPG

In der unteren Hälfte sieht man eine Reihe von Rechtecken, die an der x1-Achse entlang laufen. Hat man genug Abstand ist alles gut, geht man aber über diesen "Weg", passiert das was oben zu sehen ist. Wenn man weiter nach vorne geht kommen die unteren Objekte einem entgegen und die oberen entfernen sich.
 
Es geht um die Lesbarkeit, und dass bei toRadians der Fehler, den du oben erwähnt hast, gar nicht erst aufgetreten wäre.

Und zum Rest... Wenn du dich mit Kameras, perspektivischen Projkektionen, Clipping, vielleicht gleich noch auf der Ebene von Cohen Sutherland (und beim Zeichnen von Linien vielleicht gleich noch mit dem Bresenham) auseinandersetzen willst, kann ich dir http://www.amazon.de/Computer-Graphics-Principles-Addison-Wesley-Programming/dp/0201848406 empfehlen. Und wenn du jetzt sagst: "Aber das ist doch in C und nicht in Java" ist klar, dass du etwas falsch einschätzt.

Mal was ganz anderes: Warum machst du das per Hand und nicht mit einer 3D-Engine?
 
Mal was ganz anderes: Warum machst du das per Hand und nicht mit einer 3D-Engine?

Ich hab gerade nicht so viel Zeit, deswegen antworte ich einfach mal auf deine letzte Frage. In der Schule haben wir dieses Jahr einen Projektkurs, der, zumindest für mich und meine Gruppe, auf den Fächern Informatik und Mathe basiert. Wir schreiben eine Android App zur Berechnung und Darstellung von Vektoren und Matrizen und allem was dazu gehört, dazu brauchen wir ein 2D- und 3D Koordinatensystem. Ich weiß, es gibt auch bereits eine 3D Engine für Android, aber aus Zeitgründen ist es einfach leichter, das eben selbst zu schreiben. Es ist schon schwer genug sich auf Android umzustellen, da muss nicht auch noch 3D dazu kommen. Und ich habe ja jetzt fast alles was ich brauche 🙂
 
Äh - nein 🙂 Aber die Schwierigkeiten werden vielleicht noch früh genug deutlich. (In der Hoffnung, dass nie z.B. eine Kugel oder auch nur ein gefülltes Rechteck dargestellt werden muss...)

Gott bewahre, nein! Punkte, Vektoren, Geraden und Ebenen (ich weiß, da haben wir das gefüllte Rechteck, aber dazu hab ich schon ne gute Idee 🙂 ). Die Schwierigkeiten sind schon in meinem Kopf, aber ich hab jetzt erstmal knapp eine Woche Zeit, darüber nachzudenken und rumzuprobieren. Danke auf jeden Fall für deine Hilfe!
 

Neue Themen


Zurück
Oben