旋转矩阵的问题
Issues with rotation matrix
我目前正在研究物理引擎和渲染引擎之间的中间体。我的物理引擎接收一系列力和位置以及 returns 一个四元数。
我目前正在使用我上一个问题的答案(工作正常)将该四元数转换为旋转矩阵。我的坐标系是 z - 进入屏幕,y - 向上,x - 向右。
现在,在所有的阐述之后,我一直在通过一次旋转一个轴来进行测试。我可以毫无问题地绕 y 轴和 z 轴旋转。但是,当我尝试绕 z 轴旋转时,系统会产生奇怪的结果。旋转很好,但是当它旋转时,对象在 "flipping" 之前在 z 方向变平(即:负缩放)并返回到全尺寸。它每 90 度执行一次,与基本方向偏移 45 度。
这是我将四元数转换为旋转矩阵的代码:
Matrix4f output = new Matrix4f();
output.setIdentity();
if(input.length()!=0){
input.normalise();
}
float xx = input.x * input.x;
float xy = input.x * input.y;
float xz = input.x * input.z;
float xw = input.x * input.w;
float yy = input.y * input.y ;
float yz = input.y * input.z;
float yw = input.y * input.w;
float zz = input.z * input.z;
float zw = input.z * input.w;
output.m00 = 1 -2*((yy+zz));
output.m01 = 2*(xy+zw);
output.m02 = 2*(xz-yw);
output.m10 = 2*(xy-zw);
output.m11 = 1 - (2*(xx+zz));
output.m12 = 2*(yz+xw);
output.m20 = 2*(xz+yw);
output.m21 = 2*(yz+xw);
output.m22 = 1-(2*(xx+yy));
现在我在对象旋转时实时查看它,我没有看到任何不应该存在的东西。此外,这从这个等式直接传递到 opengl,所以我真的不明白为什么我会遇到这个问题。有什么想法吗?
output.m21 = 2*(yz+xw);
应该是 output.m21 = 2*(yz-xw);
我目前正在研究物理引擎和渲染引擎之间的中间体。我的物理引擎接收一系列力和位置以及 returns 一个四元数。
我目前正在使用我上一个问题的答案(工作正常)将该四元数转换为旋转矩阵。我的坐标系是 z - 进入屏幕,y - 向上,x - 向右。
现在,在所有的阐述之后,我一直在通过一次旋转一个轴来进行测试。我可以毫无问题地绕 y 轴和 z 轴旋转。但是,当我尝试绕 z 轴旋转时,系统会产生奇怪的结果。旋转很好,但是当它旋转时,对象在 "flipping" 之前在 z 方向变平(即:负缩放)并返回到全尺寸。它每 90 度执行一次,与基本方向偏移 45 度。
这是我将四元数转换为旋转矩阵的代码:
Matrix4f output = new Matrix4f();
output.setIdentity();
if(input.length()!=0){
input.normalise();
}
float xx = input.x * input.x;
float xy = input.x * input.y;
float xz = input.x * input.z;
float xw = input.x * input.w;
float yy = input.y * input.y ;
float yz = input.y * input.z;
float yw = input.y * input.w;
float zz = input.z * input.z;
float zw = input.z * input.w;
output.m00 = 1 -2*((yy+zz));
output.m01 = 2*(xy+zw);
output.m02 = 2*(xz-yw);
output.m10 = 2*(xy-zw);
output.m11 = 1 - (2*(xx+zz));
output.m12 = 2*(yz+xw);
output.m20 = 2*(xz+yw);
output.m21 = 2*(yz+xw);
output.m22 = 1-(2*(xx+yy));
现在我在对象旋转时实时查看它,我没有看到任何不应该存在的东西。此外,这从这个等式直接传递到 opengl,所以我真的不明白为什么我会遇到这个问题。有什么想法吗?
output.m21 = 2*(yz+xw);
应该是 output.m21 = 2*(yz-xw);