2014-10-19 2 views
0

Я немного удивлен. Я отлаживал свой код часами, и GLM, похоже, отказывается от меня. Я борюсь со следующими 2 случаях:Порядок умножения GLM

.... 
cout << "multiplying A:" << endl; 
displayMatrix(node->wMatrix); 

cout << "and B:" << endl; 
displayMatrix((node->children)[i]->wMatrix); 

//switch order! 
mat4 temp = (node->children)[i]->wMatrix * node->wMatrix; 

cout << "Get result as:" << endl; 
displayMatrix(temp); 
... 

Метод displayMatrix выглядит следующим образом:

void displayMatrix(mat4 &m) 
{ 
    cout << m[0][0] << " " << m[0][1] << " " << m[0][2] << " " << m[0][3] << endl; 
    cout << m[1][0] << " " << m[1][1] << " " << m[1][2] << " " << m[1][3] << endl; 
    cout << m[2][0] << " " << m[2][1] << " " << m[2][2] << " " << m[2][3] << endl; 
    cout << m[3][0] << " " << m[3][1] << " " << m[3][2] << " " << m[3][3] << endl; 
} 

Вот результат я получаю:

multiplying A: 
1 0 0 0 
0 1 0 0.5 
0 0 1 0 
0 0 0 1 
and B: 
0.540302 -0.841471 0 0 
0.841471 0.540302 0 -0.5 
0 0 1 0 
0 0 0 1 
Get result as: 
0.540302 -0.841471 0 0 
0.841471 0.540302 0 0 
0 0 1 0 
0 0 0 1 

Обратите внимание, что в приведенном выше коде , порядок умножения матрицы - это противоположность тому, что вы пишете на бумаге. Другими словами, код говорит B * A. Я был очень отброшен этим.

Второй экземпляр:

cout << "temp:" << endl; 
cout << temp.x << " " << temp.y << " " << temp.z << " " << temp.w << endl; 

cout << "binding matrix inverse: " << endl; 
displayMatrix(bindingInvs.at(jIndex)); 

temp = bindingInvs.at(jIndex) * temp; 
cout << "now temp:" << endl; 
cout << temp.x << " " << temp.y << " " << temp.z << " " << temp.w << endl; 

cout << "joint world matrix: " << endl; 
displayMatrix(joints.at(jIndex)->wMatrix); 
temp = (joints.at(jIndex)->wMatrix) * temp; 
cout << "now temp:" << endl; 
cout << temp.x << " " << temp.y << " " << temp.z << " " << temp.w << endl; 

cout << "weight: " << jWeight << endl; 
temp = jWeight * temp; 

cout << "now temp:" << endl; 
cout << temp.x << " " << temp.y << " " << temp.z << " " << temp.w << endl; 

Вывод, который я получаю сейчас:

temp: 
0.087 0 -0.05 1 
binding matrix inverse: 
1 -0 0 -0 
-0 1 -0 0 
0 -0 1 -0 
-0 0 -0 1 
now temp: 
0.087 0 -0.05 1 
joint world matrix: 
1 0 0 0 
0 1 0 0.5 
0 0 1 0 
0 0 0 1 
now temp: 
0.087 0 -0.05 1 
weight: 1 
now temp: 
0.087 0 -0.05 1 

Temp никогда не получать изменилось по какой-то причине. Я не знаю, что делать, или почему это происходит. Мои программы компилируются и запускаются (я вставляю из вышеприведенного вывода). Конечно, это не вся программа. Это только шаги для отладки. Но я уверен, что этого достаточно, чтобы рассказать, что происходит.

ответ

4

Ваша функция displayMatrix вас сбивает с толку, поскольку вы печатаете матрицы, перенесенные на то, что вы ожидаете на бумаге. GLM использует стандартный порядок столбцов, поэтому адресация m[col][row].

Теперь, имея в виду, операция A*B - это на самом деле то, что вы должны ожидать.

Для вектора temp возникает та же проблема: первая матрица, которую вы умножаете на нее, идентична, поэтому она не изменяется. Вторая матрица является тождественной, за исключением последней строки 0 0.5 0 1, поэтому x, y и z не будут изменены, а новый w 'будет 0,5 * y + w. Поскольку y начинается с нуля, здесь ничего не меняется.

+0

Спасибо! Урок выучен! – sarora

Смежные вопросы