Как инициализировать glm :: mat4 с массивом? - PullRequest
36 голосов
/ 08 сентября 2011

Я использую Математическую библиотеку OpenGL ( glm.g-truc.net ) и хочу инициализировать glm::mat4 массивом с плавающей точкой.

float aaa[16];
glm::mat4 bbb(aaa);

Этоне работает.

Я думаю, что решение тривиально, но я не знаю, как это сделать.Я не мог найти хорошую документацию о GLM.Буду признателен за полезные ссылки.

Ответы [ 3 ]

64 голосов
/ 14 сентября 2011

Хотя конструктора нет, GLM включает функции make_ * в glm / gtc / type_ptr.hpp :

#include <glm/gtc/type_ptr.hpp>
float aaa[16];
glm::mat4 bbb = glm::make_mat4(aaa);
7 голосов
/ 15 июля 2013

Вы также можете напрямую скопировать память:

float aaa[16] = {
   1, 2, 3, 4,
   5, 6, 7, 8,
   9, 10, 11, 12,
   13, 14, 15, 16
};
glm::mat4 bbb;

memcpy( glm::value_ptr( bbb ), aaa, sizeof( aaa ) );
3 голосов
/ 13 сентября 2011

Вы можете написать функцию адаптера:

template<typename T>
tvec4<T> tvec4_from_t(const T *arr) {
    return tvec4<T>(arr[0], arr[1], arr[2], arr[3]);
}

template<typename T>
tmat4<T> tmat4_from_t(const T *arr) {
    return tmat4<T>(tvec4_from_t(arr), tvec4_from_t(arr + 4), tvec4_from_t(arr + 8), tvec4_from_t(arr + 12));
}


// later
float aaa[16];
glm::mat4 bbb = tmac4_from_t(aaa);
...