带四元数的java 3D旋转

时间:2012-03-27 15:14:40

标签: java 3d rotation quaternions

我有这种使用四元数在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 个答案:

答案 0 :(得分:1)

我还没有研究过代码,但你得到的是正确的:假设一个左手坐标系,当你围绕y轴旋转点(0,0,10)90度时(即(0) ,1,0))你最终得到(-10,0,0)。

如果你的坐标系是右手的,我认为你必须扭转角度的符号。