iOS:GLKitmatrix乘法被打破,据我所知

这是源代码。 ANSWER是正确答案, RESULT是实际结果。

我是失明的,还是计算入门33-1时,它应该是1

代码如下:

 GLKMatrix4 a = GLKMatrix4Make(-1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, -1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000); GLKMatrix4 b = GLKMatrix4Make(1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, -1.000000, 0.000000, 0.000000, 1.000000, -1.000000, 0.000000, 0.000000, 0.000000, 1.000000); GLKMatrix4 ANSWER = GLKMatrix4Make(-1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, -1.000000, 0.000000, 0.000000, -1.000000, 1.000000, 0.000000, 0.000000, 0.000000, 1.000000); NSLog(@"##################################################"); GLKMatrix4 RESULT = GLKMatrix4Multiply(a,b); NSLog(@"Result:"); NSLog(@" %f %f %f %f",RESULT.m00,RESULT.m01,RESULT.m02,RESULT.m03); NSLog(@" %f %f %f %f",RESULT.m10,RESULT.m11,RESULT.m12,RESULT.m13); NSLog(@" %f %f %f %f",RESULT.m20,RESULT.m21,RESULT.m22,RESULT.m23); NSLog(@" %f %f %f %f",RESULT.m30,RESULT.m31,RESULT.m32,RESULT.m33); NSLog(@"Answer:"); NSLog(@" %f %f %f %f",ANSWER.m00,ANSWER.m01,ANSWER.m02,ANSWER.m03); NSLog(@" %f %f %f %f",ANSWER.m10,ANSWER.m11,ANSWER.m12,ANSWER.m13); NSLog(@" %f %f %f %f",ANSWER.m20,ANSWER.m21,ANSWER.m22,ANSWER.m23); NSLog(@" %f %f %f %f",ANSWER.m30,ANSWER.m31,ANSWER.m32,ANSWER.m33); NSLog(@"##################################################"); 

这是输出:

 ################################################## Result: -1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -1.000000 0.000000 0.000000 -1.000000 -1.000000 0.000000 0.000000 0.000000 1.000000 Answer: -1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -1.000000 0.000000 0.000000 -1.000000 1.000000 0.000000 0.000000 0.000000 1.000000 ################################################## 

我花了最后5个小时试图debugging一些OpenGL代码,只发现这是问题。 我肯定会错过一些东西。 任何人都可以发现发生了什么,或者validation这不应该发生?

嗯,我得到了和你的“RESULT”matrix相同的结果。

我用纸和笔做了matrix乘法,遵循这些规则:

http://www.mathsisfun.com/algebra/matrix-multiplying.html

这是我如何使用你的两个matrixa和b:

在这里输入图像说明

好吧,我想我知道你错了什么地方,你一定是把数字列在错误的位置:

您在代码中列出数字的方式是水平的,例如坐标(x,y,z),但在matrix中,这些数字会移动到垂直位置。

所以例如,[XYZW]应该是垂直的:

在这里输入图像说明

现在, 如果我们要将您的数字列在错误的位置,并将matrixa与matrixb相乘,我们将得到与“ANSWER”matrix相同的答案:

在这里输入图像说明

关于这一点的更多细节。

OpenGL ES假设matrix有列主要的顺序。 那么OpenGL ES读取matrix的元素顺序是:

 m00 m10 m20 m30 m01 m11 m21 m31 m02 m12 m22 m32 m03 m13 m23 m33 

当然,苹果公司的GLKitmath公用程序也是按照这个专栏的专业命令build立的。 当你意识到这一点时,可能会有点混乱。 🙂

Interesting Posts