iOS: умножение матриц GLKit не работает, насколько я могу судить

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


person KomodoDave    schedule 27.01.2012    source источник


Ответы (2)


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

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

http://www.mathsisfun.com/алгебра/matrix-multiplying.html

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

введите здесь описание изображения

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

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

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

введите здесь описание изображения

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

введите здесь описание изображения

person Zhang    schedule 27.01.2012
comment
Теперь я действительно смущен. Вы, кажется, переставили мои матрицы. Ваши матрицы показывают столбцы слева направо и строки сверху вниз, как обычно? Я думал, что каждые четыре последовательных аргумента, которые я передавал функции GLKMatrix4Make, были строками, но были ли они столбцами? Определение функции Apple для GLKMatrix4Make указывает, что она принимает аргументы (m00, m01, m02, m03, m10, m11..) и т. д. Я предположил, что это будет (первый столбец первой строки, второй столбец первой строки, третий столбец первой строки, четвертый столбец первой строки, первый столбец второй строки...). Это предположение неверно? - person KomodoDave; 27.01.2012
comment
В коде мы бы написали что-то вроде координаты (x, y, z), но в математике матрица отображает ось по вертикали (см. Мое второе изображение выше). - person Zhang; 27.01.2012
comment
Вот в чем проблема - большое спасибо, что рассказали мне, я ценю это! Кажется неинтуитивным переносить такие значения, я мог бы написать свой собственный конструктор, который принимает нормальный порядок значений, чтобы я больше не сталкивался с этой проблемой! Спасибо за помощь, Чжан. - person KomodoDave; 27.01.2012

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

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

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

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

person Aleksejs Mjaliks    schedule 05.01.2013