0

我有一系列职位:

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++ 中循环遍历数组,对每个位置进行转换,然后在新数组中输出转换后的位置,这是最好的方法?

4

2 回答 2

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

}
于 2013-06-07T16:18:35.270 回答
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 );
}
于 2013-06-07T16:22:18.140 回答