вращение Java с кватернионами - PullRequest
1 голос
/ 27 марта 2012

У меня есть этот метод для вращения точек в 3D с использованием кватернионов, но, похоже, он не работает должным образом:

    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;
}

Если я сделаю этот вызов rotation3D(list, Math.toRadians(90), 0, 1, 0);, где points равно (0,0,10), вывод будет (-10.0, 0.0, 2.220446E-15), но он должен быть (-10,0,0), верно? Может ли кто-нибудь взглянуть на мой код и сказать, если что-то не так?

Вот 4 экрана, которые представляют начальную позицию моего объекта, и 3 поворота с -90 градусами (объект не нарисован должным образом, это проблема GL, над которой я буду работать позже):

initial position first rotation second rotation third rotation

1 Ответ

1 голос
/ 27 марта 2012

Я не изучал код, но то, что вы получаете от него, является правильным: Предполагая левостороннюю систему координат, когда вы поворачиваете точку (0,0,10) на 90 градусов вокруг оси Y (то есть (0 , 1,0)) вы получите (-10,0,0).

Если ваша система координат правша, я думаю, вам нужно поменять знак угла.

...