# Drehung um 2 Achsen



## eMmiE (28. Sep 2013)

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


----------



## Hestalon (28. Sep 2013)

Rotation um Achsen => Drehmatrix (egal wie hoch Dimensional dein Raum ist)

Google hätte dabei schon geholfen bzw. Wikipedia

Drehmatrix


----------



## eMmiE (29. Sep 2013)

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 (29. Sep 2013)

Ich habe das jetzt nochmal mit Drehmatrizen probiert, aber da kommt nur Käse raus
Codebeispiel:

```
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


----------



## Hestalon (30. Sep 2013)

Mit Sicherheit ein Radiant/Grad Problem


----------



## eMmiE (1. Okt 2013)

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 (1. Okt 2013)

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

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


----------

