2015-01-14 4 views
2

Я пытаюсь использовать матрицу modelview для одного из моих проектов, но пока я получаю несколько неожиданных результатов, что блокирует мой дальнейший прогресс.openGL/glut & glm ModelView Matrix

GameEntity::GameEntity{ 
    view_matrix = glm::lookAt(glm::vec3(0.f, 0.f, 0.f), glm::vec3(0.f, 0.f, 1.f), glm::vec3(0.f, -1.f, 0.f)); 
    //view_matrix = glm::mat4(1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0); //glLoadIdentity 
    //returns this matrix, since model_matrix is identity then this is clean view_matrix? 
    model_matrix = glm::mat4(1.0f); 
} 

void GameEntity::Scale(glm::vec3 vector) 
{ 
    model_matrix = glm::scale(model_matrix, vector); 
} 

void GameEntity::getMatrix(GLfloat arr[16]) 
{ 
    glm::mat4 modelview = view_matrix * model_matrix; 
    for (int i = 0; i < 4; i++){ 
     arr[i] = modelview[i][0]; 
     arr[i+1] = modelview[i][1]; 
     arr[i+2] = modelview[i][2]; 
     arr[i+3] = modelview[i][3]; 
     } 
} 

и теперь ожидаемый результат матрица (это то, что я получаю от glLoadIdentity и glScale (0.3,0.3,1.0))

[ 0.3, 0.0, 0.0, 0.0 ] 
[ 0.0, 0.0, 0.0, 0.0 ] 
[ 0.0, 0.0, 0.0, 0.3 ] 
[ 0.0, 0.0, 0.3, 0.0 ] 

, но вместо того, чтобы после масштабирования я получить матрицу (справа один при использовании непосредственно view_matrix занесены, GameEntity прокомментировал код)

[ 0.3, 0.0, 0.0, 0.0 ] [ 0.3, 0.0, 0.0, 0.0 ] 
[ 0.0, 0.0, 0.0, 0.0 ] [ 0.0, 0.0, 0.0, 0.0 ] 
[ 0.0, 0.0, 0.0, 0.0 ] [ 0.0, 0.0, 0.0, 1.0 ] 
[ 0.0, 0.0, 0.0, 1.0 ] [ 0.0, 0.0, 1.0, 0.0 ] 

с 1-ю матрицу я получаю круг сплющенный с двойной линией, с второй ее вытянулся на одной оси. Любые идеи, что я делаю неправильно?

ответ

3

Функция Get Matrix неправильная. При итерации цикла, вы не пропуская нужное количество элементов в обр, первая итерация

arr[0] = modelview[0][0]; 
    arr[1] = modelview[0][1]; 
    arr[2] = modelview[0][2]; 
    arr[3] = modelview[0][3]; 

и второй идет

arr[1] = modelview[1][0]; 
    arr[2] = modelview[1][1]; 
    arr[3] = modelview[1][2]; 
    arr[4] = modelview[1][3]; 

и так далее. Вы должны установить, что с помощью

for (int i = 0; i < 4; i++) { 
    arr[4*i ] = modelview[i][0]; 
    arr[4*i+1] = modelview[i][1]; 
    arr[4*i+2] = modelview[i][2]; 
    arr[4*i+3] = modelview[i][3]; 
} 

КСТАТИ: Почему вы возитесь с ссылкой на ваш getMatrix прототип? Очевидно, вы хотите работать с обычными массивами C здесь, поэтому просто используйте указатели (или типы параметров функции массива, которые действуют как указатель). void GameEntity::getMatrix(GLfloat arr[16]) работает так же хорошо и намного, гораздо легче читать. И нет никакой пользы в использовании указателя.

+0

Бог я тупой, ну кодирование под покровом ночи плохо:/ – Kwydin

+0

и смешно достаточно кажется, что правильный glm :: lookAt находится в точке vec3 (0,0,0), vec3 (0,0, -1), vec3 (0,1,0), thx для справки – Kwydin

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