使用c ++和glm转换位置数组

时间:2013-06-07 16:06:34

标签: c++ glm-math

我有一系列职位:

float positions[] = {
-42.5806f, 27.8838f, 49.9729f,
-14.9092f, 26.1262f, 54.3193f,
-28.5149f, 32.7642f, 59.4234f,
-28.4439f, 23.9779f, 55.7947f,
21.8174f, 27.4106f, 54.9496f,
48.8382f, 28.1005f, 50.7636f,
34.1595f, 33.8675f, 58.1264f,
35.4594f, 24.8225f, 56.0585f,
-55.9764f, 36.8791f, 42.2097f,
-9.83348f, 39.9998f, 70.2909f,
};

我想用三个glm :: mat4矩阵变换每个位置;模型,视图和投影。为了转换每个位置,我需要取每行并将其乘以矩阵:

tPositions = proj * view * model * glm::vec4(position[0], position[1], position[2], 1.0);

请注意,我必须将每个位置转换为vec4才能使乘法正确。

我尝试了什么:

float tPositions;
for( unsigned int i=0; i < 9; i++ ){

    glm::vec4 v = glm::vec4(positions[0], positions[1], positions[2], 1.0);
    tPositions[i] = proj * view * model * v;

}

但这不会起作用,因为头寸指数是错误的(并且更合适)。

我的问题是:

如何在C ++中循环遍历数组,对每个位置进行转换,然后以最佳方式在新数组中输出转换后的位置?

2 个答案:

答案 0 :(得分:1)

每次迭代都需要跳过三个数字,结果是glm::vec4不是浮点数

std::vector<glm::vec4> tPositions;
for( unsigned int i=0; i < sizeof(positions)/sizeof(float); i+=3 ){

    glm::vec4 v = glm::vec4(positions[i], positions[i+1], positions[i+2], 1.0);
    tPositions.push_back( proj * view * model * v );

}

答案 1 :(得分:0)

另一个答案只是为了好玩。对索引执行这些重复乘法可能效率不高。

std::vector<glm::vec4> tPositions;
const int numVecs = sizeof(positions)/(3 * sizeof(float));
for( unsigned int i=0; i < numVecs; ++i ){
    glm::vec4 v = glm::vec4(positions[(3 * i)], positions[(3 * i) + 1], positions[(3 * i) + 2], 1.0);
    tPositions.push_back( proj * view * model * v );
}