Почему это не работает (glm::make_mat4)?

У меня есть этот код:

glm::mat4 aLookAt(const glm::vec3& Eye, const glm::vec3& Center, const glm::vec3& Up)
{
    glm::vec3 Z = glm::normalize(Eye - Center);
    glm::vec3 Y = Up;
    glm::vec3 X = glm::normalize(glm::cross(Y, Z));
    Y = glm::normalize(glm::cross(Z, X));
    float Matrix[4][4];
    Matrix[0][0] = X.x;
    Matrix[1][0] = X.y;
    Matrix[2][0] = X.z;
    Matrix[3][0] = (float)glm::dot(-X, Eye);
    Matrix[0][1] = Y.x;
    Matrix[1][1] = Y.y;
    Matrix[2][1] = Y.z;
    Matrix[3][1] = (float)glm::dot(-Y, Eye);
    Matrix[0][2] = Z.x;
    Matrix[1][2] = Z.y;
    Matrix[2][2] = Z.z;
    Matrix[3][2] = (float)glm::dot(Z, Eye);
    Matrix[0][3] = 0;
    Matrix[1][3] = 0;
    Matrix[2][3] = 0;
    Matrix[3][3] = 1.0f;

    glm::mat4 theMatrix = glm::make_mat4(Matrix);
    return theMatrix;
}

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

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

Почему? На этот раз я действительно не ожидал ошибок.


person Community    schedule 23.04.2018    source источник
comment
В какой строке появляется эта ошибка?   -  person BDL    schedule 24.04.2018
comment
Ну, ошибки исчезают, когда я удаляю строку glm::mat4 theMatrix = glm::make_mat4(Matrix);   -  person    schedule 24.04.2018


Ответы (1)


Компилятор говорит вам, почему. Вы передаете float[4][4] методу, который ожидает pointer to float:

template<typename T >
detail::tmat4x4< T >    make_mat4 (T const *const ptr)

Эти типы несовместимы. Вместо этого вам нужен float[16]:

float Matrix[16];
Matrix[0] = X.x;
Matrix[1] = X.y;
Matrix[2] = X.z;
Matrix[3] = (float)glm::dot(-X, Eye);
Matrix[4] = Y.x;
Matrix[5] = Y.y;
Matrix[6] = Y.z;
Matrix[7] = (float)glm::dot(-Y, Eye);
Matrix[8] = Z.x;
Matrix[9] = Z.y;
Matrix[10] = Z.z;
Matrix[11] = (float)glm::dot(Z, Eye);
Matrix[12] = 0;
Matrix[13] = 0;
Matrix[14] = 0;
Matrix[15] = 1.0f;
person Max Vollmer    schedule 23.04.2018
comment
Ааа спасибо! Но какая разница между float[16] и float[4][4] — они оба массивы одного типа и размера? - person ; 24.04.2018
comment
Один представляет собой массив из 16 поплавков, другой — массив из 4 массивов по 4 поплавка. Первый будет распадаться на указатель на float, второй — на указатель на float[4]. Да, они имеют одинаковый размер, но они разных типов. - person Max Vollmer; 24.04.2018