将C++中的float*转换为glm::vec3

7

我该如何将一个以 float* 形式表示的浮点数组转换成 glm::vec3?我曾经成功地实现过,但是我的硬盘坏了。我尝试了几种 C 样式和 static_cast,但好像都行不通。

3个回答

23

float*vec3:

float data[] = { 1, 2, 3 };
glm::vec3 vec = glm::make_vec3(data);

vec3float*

glm::vec3 vec(1, 2, 3);
float* data = glm::value_ptr(vec);

在这两种情况下,不要忘记包含#include <glm/gtc/type_ptr.hpp>


然而,这是一种转换而不是强制转换,可能会分配新的内存。 - Neonit
它不会分配新的内存。它怎么可能呢?如果它从堆栈返回了某些东西,那将是无效的,因为它只返回一个指针;如果它从堆中返回了某些东西,文档会告诉你清理它。唯一的选择是使用 atexit 或其他类似的方法,但这是一个不好的做法,在库中通常不会看到。此外,我检查了代码,它只返回第一个数据成员的地址。 - floomby

11

glm文档告诉你如何从vec3转换为float*

#include <glm/glm.hpp>
#include <glm/gtc/type_ptr.hpp>
glm::vec3 aVector(3);
glm::mat4 someMatrix(1.0);
glUniform3fv(uniformLoc, 1, glm::value_ptr(aVector));
glUniformMatrix4fv(uniformMatrixLoc,
       1, GL_FALSE, glm::value_ptr(someMatrix));

你使用glm::value_ptr

文档没有明确说明这一点,但显然glm希望这些类型与数组“布局兼容”,以便可以直接与OpenGL函数一起使用。如果是这样,那么你可以使用以下强制转换将数组转换为vec3:

float arr[] = { 1.f, 0.f, 0.f };
vec3<float> *v = reinterpret_cast<vec3<float>*>(arr);

你可能需要将此功能封装在自己的实用程序函数中,因为您不希望在整个代码库中散布此类转换。


为了向你那个爱挑剔的理论软件工程师同事出售它,你可以添加一个 static_assert(sizeof(glm::vec3) == 3 * sizeof(float)) 来增加额外的安全性,以防万一 vec3 的实现从仅仅是一个 float[3] 包装器发生变化。 - Neonit

2
glm::vec3 construct_vec3(float *value)
{
    return glm::vec3(value[0], value[1], value[2]);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接