iOS: умножение матрицы GLKit нарушено, насколько я могу судить - PullRequest
1 голос
/ 27 января 2012

Вот исходный код.ANSWER - правильный ответ, RESULT - фактический результат.

Я слепой, или он вычисляет -1 для записи 33, когда должно быть 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 часов я потратил на отладку некоторого кода OpenGL, только чтобы найтипроблема.Я, должно быть, что-то упустил, конечно.Кто-нибудь может определить, что происходит, или убедиться, что это не должно происходить?

Ответы [ 2 ]

3 голосов
/ 27 января 2012

Хм, я получил тот же результат, что и ваша матрица "РЕЗУЛЬТАТ".

Я сделал умножение матриц с ручкой и бумагой, следуя этим правилам:

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

Вот как я это сделал, используя ваши две матрицы a и b:

enter image description here

Хорошо, я думаю, что я знаю, где вы ошиблись, вы, должно быть, указали номера в неправильном положении:

То, как вы перечисляете число в коде, является горизонтальным, например, координата (x, y, z), но в матрице эти числа перемещаются в вертикальные позиции.

Так, например, [X Y Z W] должно стать вертикально:

enter image description here

Теперь ЕСЛИ мы должны были перечислить ваши номера в неправильной позиции и умножить Матрицу a на Матрицу b, мы получим тот же ответ, что и ваша матрица «ОТВЕТ»:

enter image description here

1 голос
/ 05 января 2013

Немного подробнее об этом.

В OpenGL ES предполагается, что матрицы имеют основной порядок столбцов.Итак, порядок элементов в том, как OpenGL ES считывает матрицу:

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

Конечно, математические утилиты Apple GLKit также строятся в соответствии с этим основным порядком столбцов.И это может немного сбивать с толку, пока вы понимаете это.:)

...