如何用数组初始化 glm::mat4?

Posted

技术标签:

【中文标题】如何用数组初始化 glm::mat4?【英文标题】:How to initialize a glm::mat4 with an array? 【发布时间】:2011-09-08 16:49:45 【问题描述】:

我正在使用 OpenGL 数学库 (glm.g-truc.net) 并希望使用浮点数组初始化 glm::mat4

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

这不起作用。

我想解决方案很简单,但我不知道该怎么做。 我找不到关于 glm 的好文档。我会很感激一些有用的链接。

【问题讨论】:

【参考方案1】:

虽然没有构造函数,但 GLM 在 glm/gtc/type_ptr.hpp 中包含 make_* 函数:

#include <glm/gtc/type_ptr.hpp>
float aaa[16];
glm::mat4 bbb = glm::make_mat4(aaa);

【讨论】:

另外别忘了确保源数组是按column-wise存储的,否则你需要添加glm::mat4 bbbT = glm::make_mat4(aaa); glm::mat4 bbb = glm::transpose(bbbT);【参考方案2】:

你也可以直接复制内存:

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 ) );

【讨论】:

我需要输入“std::memcpy()”吗?这个memcpy() 函数在哪里?【参考方案3】:

你可以写一个适配器函数:

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);

【讨论】:

以上是关于如何用数组初始化 glm::mat4?的主要内容,如果未能解决你的问题,请参考以下文章

如何用一行代码初始化字符串类型的数组?

如何用颜色绘制 gluQuadric?

如何用不同的默认值初始化多维数组

如何用值初始化 Kotlin 中的数组?

如何用js push() 初始化一个二维数组

如何用数字初始化 char 类型的全局一维数组?