java quaternion 3D rotation implementation

Posted by MRM on Stack Overflow See other posts from Stack Overflow or by MRM
Published on 2012-03-23T16:57:19Z Indexed on 2012/03/23 17:30 UTC
Read the original article Hit count: 296

Filed under:
|
|

I made a method to rotate a list of points using quaternions, but all i get back as output is the same list i gave to rotate on. Maybe i did not understood corectly the math for 3d rotations or my code is not implemented the right way, could you give me a hand?

This is the method i use:

public static ArrayList<Float> rotation3D(ArrayList<Float> points, double angle, int x, int y, int z)
{
    ArrayList<Float> newpoints = points;

    for (int i=0;i<points.size();i+=3)
    {
        float x_old = points.get(i).floatValue();
        float y_old = points.get(i+1).floatValue();
        float z_old = points.get(i+2).floatValue();
        double[] initial = {1,0,0,0};
        double[] total = new double[4];
        double[] local = new double[4];

        //components for local quaternion
        //w
        local[0] = Math.cos(0.5 * angle);
        //x
        local[1] = x * Math.sin(0.5 * angle);
        //y
        local[2] = y * Math.sin(0.5 * angle);
        //z
        local[3] = z * Math.sin(0.5 * angle);

        //components for final quaternion Q1*Q2
        //w = w1w2 - x1x2 - y1y2 - z1z2
        total[0] = local[0] * initial[0] - local[1] * initial[1] - local[2] * initial[2] - local[3] * initial[3];
        //x = w1x2 + x1w2 + y1z2 - z1y2
        total[1] = local[0] * initial[1] + local[1] * initial[0] + local[2] * initial[3] - local[3] * initial[2];
        //y = w1y2 - x1z2 + y1w2 + z1x2
        total[2] = local[0] * initial[2] - local[1] * initial[3] + local[2] * initial[0] + local[3] * initial[1];
        //z = w1z2 + x1y2 - y1x2 + z1w2
        total[3] = local[0] * initial[3] + local[1] * initial[2] - local[2] * initial[1] + local[3] * initial[0];

        //new x,y,z of the 3d point using rotation matrix made from the final quaternion
        float x_new = (float)((1 - 2 * total[2] * total[2] - 2 * total[3] * total[3]) * x_old
                         + (2 * total[1] * total[2] - 2 * total[0] * total[3]) * y_old
                         + (2 * total[1] * total[3] + 2 * total[0] * total[2]) * z_old);
        float y_new = (float) ((2 * total[1] * total[2] + 2 * total[0] * total[3]) * x_old
                         + (1 - 2 * total[1] * total[1] - 2 * total[3] * total[3]) * y_old
                         + (2 * total[2] * total[3] + 2 * total[0] * total[1]) * z_old);
        float z_new = (float) ((2 * total[1] * total[3] - 2 * total[0] * total[2]) * x_old
                         + (2 * total[2] * total[3] - 2 * total[0] * total[1]) * y_old
                         + (1 - 2 * total[1] * total[1] - 2 * total[2] * total[2]) * z_old);
        newpoints.set(i, x_new);
        newpoints.set(i+1, y_new);
        newpoints.set(i+2, z_new);

    }

    return newpoints;
}

For rotation3D(points, 50, 0, 1, 0) where points is:

0.0, 0.0, -9.0;

0.0, 0.0, -11.0;

20.0, 0.0, -11.0;

20.0, 0.0, -9.0;

i get back the same list.

© Stack Overflow or respective owner

Related posts about java

Related posts about math