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):
Da 2.220446E-15 eine so kleine Zahl ist, scheint es nur ein Rundungsproblem innerhalb des Systems zu sein. –
Nur ein Kommentar: Die cos und sin werden auf konstanten Werten berechnet. Holen Sie sie aus der Schleife. – toto2
In der Tat könnte ich den Code ein wenig optimieren. Vielen Dank! – MRM