Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java3d四元数旋转_Java_3d_Rotation_Quaternions - Fatal编程技术网

java3d四元数旋转

java3d四元数旋转,java,3d,rotation,quaternions,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

我使用四元数在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;
}
<代码>公共静态数组列表旋转3D(数组列表,双角度,int席,int i,int z) { ArrayList newPoints=新的ArrayList();
对于(int i=0;i我没有研究代码,但从中得到的是正确的:假设是左手坐标系,当你将点(0,0,10)绕y轴旋转90度(即(0,1,0))时,你得到的结果是(-10,0,0)


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

我没有研究代码,但你从中得到的是正确的:假设是左手坐标系,当你将点(0,0,10)绕y轴旋转90度(即(0,1,0))时,你得到的结果是(-10,0,0)


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

我的错,我的错是(-10,0,0),但输出是(-10.0,0.0,2.220446E-15),所以不是很精确…它只差了2*10^-15,一个很小的数字。我称之为相当精确。我用这种方法在3D中旋转一个立方体的点,但它不是那么精确,因为它在oZ轴上以10个单位移动对象。然后结果是错误的,立方体最终在坐标轴的错误一侧?旋转的结果ion确实取决于坐标系的惯用手,请参见编辑。我的系统有oY向上,oZ面向用户,oX垂直于oZ,所以是右手。如果角度为负,立方体将在oX轴上向右平移(在轴的负部分),但也会旋转。我将添加两个屏幕,以便您能够轻松理解(并且是一个平行六面体,不是真正的立方体)。我的错误,元素(-10,0,0),但输出是(-10.0,0.0,2.220446E-15),所以不是很精确…它只差了2*10^-15,一个很小的数字。我称之为相当精确。我用这种方法在3D中旋转一个立方体的点,但它不是那么精确,因为它在oZ轴上以10个单位移动对象。然后结果是错误的,立方体最终在坐标轴的错误一侧?旋转的结果ion确实取决于坐标系的惯用手,请参见编辑。我的系统有oY向上,oZ面向用户,oX垂直于oZ,所以是右手。如果角度为负,立方体将在oX轴上向右平移(在轴的负部分),但也会旋转。我将添加两个屏幕,以便您能够轻松理解(是平行六面体,不是真正的立方体).由于2.220446E-15是一个如此小的数字,它似乎只是系统中的一个舍入问题。只是一个注释:cos和sin是根据常量值计算的。将它们从循环中去掉。事实上,我可以对代码进行一些优化。谢谢!该方法需要这么多参数吗?我理解浮点[],表示对象的原始坐标。我了解x,y,z,这是四分之一的值。但为什么仍然需要角度?四分之一的x,y,z值可以创建角度,尽管使用复杂的计算。由于2.220446E-15是一个如此小的数字,似乎它只是系统中的一个舍入问题。只是一个注释:cos和sin是根据常量值计算的。把它们从循环中去掉。事实上,我可以对代码进行一些优化。谢谢!这个方法需要这么多参数吗?我理解float[],表示对象的原始坐标。我了解x,y,z,这是四分之一的值。但为什么仍然需要角度?四分之一的x,y,z值可以创建角度,尽管使用复杂的计算。