2014-02-09 3 views
0

Я пытаюсь сделать простую проекцию, но у меня проблемы с GLM. В этом примере я выделил код проблемы. Все хорошо сформировано до glm::vec4 v = mvp * v;. Я читал о том, что другие сталкиваются с подобной проблемой из-за несоответствующих типов (например, double и float). Я получаю очень большие или очень маленькие числа, которые меняют каждую среду выполнения. Это заставляет меня поверить, что что-то указывает на адрес мусора где-то.Что случилось с этим умножением матрицы?

Как узнать, какие типы vec4 и mat4 (они шаблоны)? Здесь что-то не так? Это становится расстраивающим, так как я знаю, что моя ошибка должна быть маленькой, но я не могу понять.

#define GLM_FORCE_RADIANS // Hide warnings 
#include <cstdio> 
#include <cstdlib> 
#include <glm/glm.hpp> 
#include <glm/gtc/type_ptr.hpp> 
#include <glm/gtc/matrix_transform.hpp> 

void print_mat4(glm::mat4 mat) 
{ 
    int i, j; 
    for (j = 0; j < 4; j++) 
    { 
     for (i = 0; i < 4; i++) 
     { 
      printf("%f\t", mat[i][j]); 
     } 

     printf("\n"); 
    } 
} 

int main() 
{ 
    glm::mat4 projection = glm::perspective(45.0f, 1.0f, 0.1f, 100.0f); 
    glm::mat4 view = glm::lookAt(
     glm::vec3(4.0f, 3.0f, 3.0f), 
     glm::vec3(0.0f, 0.0f, 0.0f), 
     glm::vec3(0.0f, 1.0f, 0.0f) 
    ); 

    glm::mat4 model = glm::mat4(1.0f); 
    glm::mat4 mvp = projection * view * model; 


    printf("Projection: \n"); 
    print_mat4(projection); 
    printf("View: \n"); 
    print_mat4(view); 
    printf("Model: \n"); 
    print_mat4(model); 
    printf("MVP: \n"); 
    print_mat4(mvp);; 

    glm::vec4 vert = glm::vec4(-1.0f, -1.0f, 0.0f, 1.0f); 
    glm::vec4 v = mvp * v; 

    printf("\nOriginal: (%f, %f, %f, %f)\n", vert.x, vert.y, vert.z, vert.w); 
    printf("Transformed: (%f, %f, %f, %f)\n", v.x, v.y, v.z, v.w); 

    return 0; 
} 

P.S. Вы можете скомпилировать и запустить этот код, не связывая ничего. g++ matrix_test.cpp -o matrix_test && ./matrix_test

ответ

2

Нет ничего плохого в GLM, в вашем умножении используется неинициализированный glm::vec4 v.

Проверить эту линию:

glm::vec4 v = mvp * v; 

Вместо этого вы должны сделать это:

glm::vec4 v = mvp * vert; 
+0

Ok, так что исправляет эту проблему. Я предполагаю, что это не работает в моей реальной программе, так это то, как я передаю форму в GLSL. Ваш ответ - большая помощь, так как теперь я знаю, что ошибка связана не с формированием матриц, а с тем, что я делаю с ними после. Благодаря! – unclekyky

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