2012-03-27 8 views
1

Ich habe diese Methode für Punkte in 3D rotierenden quaternions verwenden, aber es scheint nicht richtig zu funktionieren:Java 3D-Rotation mit Quaternionen

public static ArrayList<Float> rotation3D(ArrayList<Float> points, double angle, int xi, int yi, int zi) 
{ 
    ArrayList<Float> newPoints = new ArrayList<>(); 

    for (int i=0;i<points.size();i+=3) 
    { 
     float x_old = points.get(i); 
     float y_old = points.get(i+1); 
     float z_old = points.get(i+2); 

     double w = Math.cos(angle/2.0); 
     double x = xi*Math.sin(angle/2.0); 
     double y = yi*Math.sin(angle/2.0); 
     double z = zi*Math.sin(angle/2.0); 

     float x_new = (float) ((1 - 2*y*y -2*z*z)*x_old + (2*x*y + 2*w*z)*y_old + (2*x*z-2*w*y)*z_old); 
     float y_new = (float) ((2*x*y - 2*w*z)*x_old + (1 - 2*x*x - 2*z*z)*y_old + (2*y*z + 2*w*x)*z_old); 
     float z_new = (float) ((2*x*z + 2*w*y)*x_old + (2*y*z - 2*w*x)*y_old + (1 - 2*x*x - 2*y*y)*z_old); 

     newPoints.add(x_new); 
     newPoints.add(y_new); 
     newPoints.add(z_new); 
    } 

    return newPoints; 
} 

Wenn ich diesen Anruf rotation3D(list, Math.toRadians(90), 0, 1, 0); wo points(0,0,10) ist, ist der Ausgang (-10.0, 0.0, 2.220446E-15) , aber es sollte (-10,0,0) sein, richtig? Könnte jemand meinen Code ansehen und mir sagen, ob etwas falsch ist?

Hier 4 Bildschirme, die die anfängliche Position meines Objekts darstellen, und 3 Umdrehungen mit -90 Grad (das Objekt nicht richtig gemalt wird, das ist ein GL Problem, dass ich später arbeiten wird):

initial position first rotation second rotation third rotation

+1

Da 2.220446E-15 eine so kleine Zahl ist, scheint es nur ein Rundungsproblem innerhalb des Systems zu sein. –

+1

Nur ein Kommentar: Die cos und sin werden auf konstanten Werten berechnet. Holen Sie sie aus der Schleife. – toto2

+0

In der Tat könnte ich den Code ein wenig optimieren. Vielen Dank! – MRM

Antwort

1

ich habe den Code nicht studiert, aber was Sie von ihm bekommen, ist richtig: Unter der Annahme eines linkshändigen Koordinatensystem, wenn Sie drehen den Punkt (0,0,10) um 90 Grad um die y-Achse (dh (0,1,0)) endet mit (-10,0,0).

Wenn Ihr Koordinatensystem Rechtshänder ist, denke ich, dass Sie das Vorzeichen des Winkels umkehren müssen.

+0

meine schlechte, ich ment (-10,0,0), aber die Ausgabe ist (-10.0, 0.0, 2.220446E-15), so nicht wirklich genau ... – MRM

+4

Es ist nur durch 2 * 10^-15, eine ** sehr ** kleine Nummer. Ich würde das ziemlich genau nennen. – Joni

+0

Ich habe diese Methode verwendet, um die Punkte eines Würfels in 3D zu drehen, und es ist nicht so genau, wie es das Objekt auf der OZ-Achse mit 10 Einheiten bewegt. – MRM