Drehung um 2 Achsen

eMmiE

Bekanntes Mitglied
Hi,
ich möchte ein 3D Modell um die x und um die z Achse rotieren
(Fürs Format: es handelt sich dabei um ein 3DArray)

Wie sieht die kürzest mögliche Lösung aus?
Hierbei sind die Gradzahlen der Drehung vorhanden
 

eMmiE

Bekanntes Mitglied
Danke für die Antwort.
Ich hatte allerdings etwas konkreteres gesucht.
Könntest du vllt. kurz ein Code-Beispiel für die Drehung um x und z Achse reinstellen?
 

eMmiE

Bekanntes Mitglied
Ich habe das jetzt nochmal mit Drehmatrizen probiert, aber da kommt nur Käse raus
Codebeispiel:
Code:
a1 = Math.atan2(k[i][j][1],k[i][j][0]);
        a2 = Math.atan2(k[i][j][2],k[i][j][1]);
        x = 0;
        y = Math.sqrt(k[i][j][0]*k[i][j][0]+k[i][j][1]*k[i][j][1]+k[i][j][2]*k[i][j][2]);
        z = 0;
        alpha = a1 - this.B;
        beta = a2 - this.R;
        
        rück[i][j][0] = x;
        rück[i][j][1] = y * Math.cos(beta) - z * Math.sin(beta);
        rück[i][j][2] = y * Math.sin(beta) + z * Math.cos(beta);
        
        x = rück[i][j][0];
        y = rück[i][j][1];
        z = rück[i][j][2];
        
        rück[i][j][0] = x * Math.cos(alpha) - y * Math.sin(alpha);
        rück[i][j][1] = x * Math.sin(alpha) + y * Math.cos(alpha);
        rück[i][j][2] = z;

hierbei rechnet der erst die Winkel aus, die schon bestehen.

Den Weg muss ich gehen, da ich onst nicht gescheit um die x- Achse, bzw. den Nullpunkt drehen kann.

Dann setzt er y auf den Abstand, den der Punkt vorher hatte.
B und R sind die ingame-Winkel.
B steht auf der Ebene, die z-Achse (nach oben) und y- Achse (nach vorne) aufspannen
R steht auf der Ebene, die x- und y- Achse aufspannen.

und dann ist das eigentlich pure Anwendung der Drehmatrizen, allerdings ist das Ergebnis falsch. :autsch:

Wo ist mein Fehler?

Gruß eMmiE
 

eMmiE

Bekanntes Mitglied
Nein
Da Math.sin() und cos() nur mit doubles arbeiten, die in Zusammenhang stehen mit pi, benutze ich natürlich solche Zahlen
(-> Winkel auf z/y-Ebene geht von -Math.PI bis Math.PI)
 

eMmiE

Bekanntes Mitglied
So,
bin wieder ein bisschen weiter gekommen
-> er dreht schon richtig, war nur ein kleines Vorzeichenproblem

CODE:
Code:
        a1 = Math.atan2(k[i][j][1],k[i][j][0]);
        a2 = Math.atan2(k[i][j][2],k[i][j][0]);
        x = 0;
        y = Math.sqrt(x*x+y*y+z*z);
        z = 0;
        alpha = this.B - a1;
        beta = this.R - a2;
        
        rück[i][j][0] = x;
        rück[i][j][1] = y * Math.cos(beta) + z * Math.sin(beta);
        rück[i][j][2] = -y * Math.sin(beta) + z * Math.cos(beta);
        
        x = rück[i][j][0];
        y = rück[i][j][1];
        z = rück[i][j][2];
        
        rück[i][j][0] = x * Math.cos(alpha) - y * Math.sin(alpha);
        rück[i][j][1] = x * Math.sin(alpha) + y * Math.cos(alpha);
        rück[i][j][2] = z;

@CODE:
k = Koordinate
this.B = Winkel auf z/y-Ebene
this.R = Winkel auf y/x-Ebene

Er dreht richtig und das Ergebnis ist:
(~8|~8|~12)

Rein mathematisch gesehen müsste ja (10|10|10) rauskommen,
da ich den y-Wert auf die Entfernung vom Origo zu (10|10|10) gesetzt habe und dann zweimal gedreht habe(-> Kugelkoordinaten)...

Oder muss ich nochmal (sinnloserweise) um die y-Achse drehen um den Winkel 0?

Gruß (confused) eMmiE
 
Zuletzt bearbeitet:

Ähnliche Java Themen

Neue Themen


Oben