2017-02-19 26 views
2

Для моего OpenGL приложения, у меня есть куб, определяемые следующие координаты:Используя матрицу для поворота кубы дает неправильный результат

coords=new float [] {-0.5f,0.5f,0.5f,1f, 
    -0.5f,-0.5f,0.5f,1f, 
    0.5f,-0.5f,0.5f,1f, 
    0.5f,0.5f,0.5f,1f, 
    -0.5f,0.5f,-0.5f,1f, 
    -0.5f,-0.5f,-0.5f,1f, 
    0.5f,-0.5f,-0.5f,1f, 
    0.5f,0.5f,-0.5f,1f}; 

, которая представляет следующую матрицу:

-0.5 -0.5 0.5 0.5 -0.5 -0.5 0.5 0.5 
0.5 -0.5 -0.5 0.5 0.5 -0.5 -0.5 0.5 
0.5 0.5 0.5 0.5 -0.5 -0.5 -0.5 -0.5 
1  1  1  1  1  1  1  1 

Я определяю вращение матрицы с:

float [] matrix=new float[16]; 
Matrix.setRotateM(matrix,0,90,1,0,0); 

Так что моя матрица:

1 0 0 0 
0 0 -1 0 
0 1 0 0 
0 0 0 1 

Когда я пытаюсь применить поворот к координатам с Matrix.multiplyMM(coords,0,matrix,0,coords,0);, я получаю следующий результат:

-0,5 -0,5 0,5 0,5 -0,5 -0,5 0,5 0,5 
    -0,5 -0,5 -0,5 -0,5 0,5 -0,5 -0,5 0,5 
    0,5 -0,5 -0,5 0,5 -0,5 -0,5 -0,5 -0,5 
    1  1  1  1  1  1  1  1 

Для меня, и в соответствии с моим калькулятором, а, 6-й и 7-й элементы вторая строка неверна (они должны быть положительными). То же самое для 5-го и 8-го элементов третьей строки.

Может ли кто-нибудь сказать мне, где проблема?

+0

Я могу ошибаться, но как же представляет собой матрицу, используя 1D массив? – CKing

+2

@CKing - это обычные способы обработки матриц. – QBrute

+0

@QBrute Я не следую. OP создает 1D-массив, но представляет данные как 2D-массив? – CKing

ответ

2

Вы неверно истолковали, что multiplyMM. Эта функция умножает матрицу 4x4 на другую матрицу 4x4. Позвонив

Matrix.multiplyMM(coords,0,matrix,0,coords,0); 

функция принимает первые 16 поплавков в качестве первой координат матрицы, первых 16 поплавков матрицы в качестве матрицы второго и сохраняет все в первых 16 поплавках координат. Таким образом, все элементы после 16-го никогда не затрагиваются.

Я думаю, вы хотели бы умножить каждый вектор в coords на матрицу в matrix. Для этого multiplyMM является абсолютно неправильной функцией, так как она умножает матричное умножение матрицы, а не вектор матричных времен. Для преобразования набора векторов на матрицу вам придется неоднократно называть Matrix.multiplyMV с соответствующими смещениями:

for (int i = 0; i < 8; i++) 
{ 
    Matrix.multiplyMV(coords, 4 * i, matrix, 0, coords, 4 * i); 
} 

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

  • Нет связанных вопросов^_^