Java 我的矩阵旋转有什么问题?

Java 我的矩阵旋转有什么问题?,java,matrix,geometry,Java,Matrix,Geometry,我正试着旋转一个模型 (float) Math.atan2(-camX.getXf() * padX, -camDir.getZf() * padY) Y 及 Z 但是 它在y轴上旋转(虽然它是侧向的,因为它是md2模型),但旋转Z轴并不能使它向右上。知道为什么吗 每个变量都在矩阵的相应区域中 编辑:好的,现在我使用以下代码: float x = 0; float y = (float) Math.atan2(-camX.getXf() * padX, -camDir.

我正试着旋转一个模型

(float) Math.atan2(-camX.getXf() * padX, -camDir.getZf() * padY)
Y

Z

但是

它在y轴上旋转(虽然它是侧向的,因为它是md2模型),但旋转Z轴并不能使它向右上。知道为什么吗

每个变量都在矩阵的相应区域中

编辑:好的,现在我使用以下代码:

float x = 0;
            float y = (float) Math.atan2(-camX.getXf() * padX, -camDir.getZf() * padY);
            float z = (float) -MathUtils.HALF_PI;

            float a = (float) Math.sin(x);
            float A = (float) Math.cos(x);
            float b = (float) Math.sin(y);
            float B = (float) Math.cos(y);
            float c = (float) Math.sin(z);
            float C = (float) Math.cos(z);

            Matrix3 m = new Matrix3(A*b, -(B*a),b,
                                   (C*a)+(A*b*c), (A*C)-(a*b*c), -(B*c),
                                   (a*c)-(A*C*b), (A*c)+(C*a*b), B*C); 
但现在没有一个轴正确旋转

以下是矩阵的设置方式:

xx, xy, xz, 
yx, yy, yz, 
zx, zy, zz

旋转矩阵不是这样工作的。角度不会进入矩阵!相反,我假设Java处理旋转矩阵就像处理笛卡尔坐标系中的任何其他变换矩阵一样。因为我认为您不想手动输入旋转矩阵,所以最好从一个新的矩阵3开始(我希望它在单位矩阵处自动初始化),然后依次使用rotateX(float x)、rotateY(float y)和rotateZ(float z)旋转它,其中x、y、z是您想要旋转的角度。(至少在使用com.threed.jpct.Matrix的情况下)请注意,结果确实取决于三次旋转的顺序。

旋转矩阵不是这样工作的。角度不会进入矩阵!相反,我假设Java处理旋转矩阵就像处理笛卡尔坐标系中的任何其他变换矩阵一样。因为我认为您不想手动输入旋转矩阵,所以最好从一个新的矩阵3开始(我希望它在单位矩阵处自动初始化),然后依次使用rotateX(float x)、rotateY(float y)和rotateZ(float z)旋转它,其中x、y、z是您想要旋转的角度。(至少在使用com.threed.jpct.Matrix的情况下)请注意,结果确实取决于三次旋转的顺序。

这是旋转矩阵在2D中的外观;它沿逆时针方向绕z轴旋转(x,y)空间中的一个点


这就是旋转矩阵在2D中的样子;它沿逆时针方向绕z轴旋转(x,y)空间中的一个点


这是一个关于如何使用旋转矩阵的典型教程。围绕三个轴应用旋转的顺序至关重要。或者,可以绕任意轴旋转。您可能还想探索。

这里是一个关于如何使用旋转矩阵的典型教程。围绕三个轴应用旋转的顺序至关重要。或者,可以绕任意轴旋转。您可能还想探索。

我没有使用com.threed.jpct.Matrix:(你知道我如何使用两个笛卡尔坐标来旋转一个轴吗?也就是说,使用x和y。我一次只能旋转一个轴,而不使用矩阵,它会将其他轴重置为0。那么你在使用什么?你可以用蛮力的方式:让a=sinx,a=cosx,b=siny,b=cosy,c=sinz,c=cosz。然后,试试矩阵{(AB,-Ba,b),(Ca+Abc,AC-Abc,-Bc),(AC-ACb,AC+Cab,Bc)}如果我的计算是正确的,它应该对应于rotateX关于x,然后rotateY关于y,然后rotateZ关于z。哦,你也可以用matMul来乘法矩阵。所以你取一个单位矩阵,然后旋转它,然后取一个单位矩阵,再旋转它,然后取一个单位矩阵,再旋转它,然后把它们放在一起。好的,可以吗你检查我问题的编辑,看看我是否做得对吗?我使用的是Ardor3d,所以我不能使用rotateX和rotateY:(我没有使用com.threed.jpct.Matrix:(你知道我如何使用两个笛卡尔坐标来旋转一个轴吗?也就是说,使用x和y。我一次只能旋转一个轴,而不使用矩阵,它会将其他轴重置为0。那么你在使用什么?你可以用蛮力的方式:让a=sinx,a=cosx,b=siny,b=cosy,c=sinz,c=cosz。然后,试试矩阵{(AB,-Ba,b),(Ca+Abc,AC-Abc,-Bc),(AC-ACb,AC+Cab,Bc)}如果我的计算是正确的,它应该对应于rotateX关于x,然后rotateY关于y,然后rotateZ关于z。哦,你也可以用matMul来乘法矩阵。所以你取一个单位矩阵,然后旋转它,然后取一个单位矩阵,再旋转它,然后取一个单位矩阵,再旋转它,然后把它们放在一起。好的,可以吗你检查我的问题的编辑,看看我是否做对了一切?我使用的是Ardor3d,所以我不能使用rotateX和rotateY:(
float x = 0;
            float y = (float) Math.atan2(-camX.getXf() * padX, -camDir.getZf() * padY);
            float z = (float) -MathUtils.HALF_PI;

            float a = (float) Math.sin(x);
            float A = (float) Math.cos(x);
            float b = (float) Math.sin(y);
            float B = (float) Math.cos(y);
            float c = (float) Math.sin(z);
            float C = (float) Math.cos(z);

            Matrix3 m = new Matrix3(A*b, -(B*a),b,
                                   (C*a)+(A*b*c), (A*C)-(a*b*c), -(B*c),
                                   (a*c)-(A*C*b), (A*c)+(C*a*b), B*C); 
xx, xy, xz, 
yx, yy, yz, 
zx, zy, zz