0

当还使用返回 glm::vec3 的重载 [] 运算符时,我遇到了将多个向量加法串在一起的问题。

我已经通过“取消字符串”我的添加(将每个添加到它自己的语句中)解决了这个问题,但我真的很想知道它为什么会发生(也许我的 [] 运算符做错了?)。

NVec是一个包装类std::vector<glm::vec3>,它的 [] 重载。这样做的目的是处理越界 [] 调用(边界是它们需要的任何东西,而不是标准索引边界)。

操作员

glm::vec3 &Terrain::NVec::operator[](int n)
{
    if(n>=0 && n < std::vector<glm::vec3>::size() &&      //special out of bounds checking
       n-(*i)*width*2 != width*2 && n-(*i)*width*2 != -1) //i is a pointer to an int somewhere
        return glm::vec3(std::vector<glm::vec3>::operator[](n).x);  //default [] operator for std::vector<glm::vec3>
    else{
        count--;              //keeps track of how many were out of bounds
        return glm::vec3(0);  //returns a {0,0,0} vector. I've tried this with return vec3(0,0,0) too
    }
}

问题代码:

faceNormals是一个NVec完整的三角形面法线,tri1是 aglm::vec3[3]i1toi6是索引。我真的按照这个顺序运行这些案例以获得我的结果。

// Case 1
tri1[0] = faceNormals[i1]
     + faceNormals[i2]
     + faceNormals[i3]
     + faceNormals[i4]
     + faceNormals[i5]
     + faceNormals[i6]; //gives garbage results

// Case 2
tri1[0] =  faceNormals[i1];
tri1[0] += faceNormals[i2];
tri1[0] += faceNormals[i3];
tri1[0] += faceNormals[i4];
tri1[0] += faceNormals[i5];
tri1[0] += faceNormals[i6]; //tri1[0] contains correct values

// Case 3
glm::vec3 v1 = glm::vec3(faceNormals[i1]);
glm::vec3 v2 = glm::vec3(faceNormals[i2]);
glm::vec3 v3 = glm::vec3(faceNormals[i3]);
glm::vec3 v4 = glm::vec3(faceNormals[i4]);
glm::vec3 v5 = glm::vec3(faceNormals[i5]);
glm::vec3 v6 = glm::vec3(faceNormals[i6]);
glm::vec3 tri = v1+v2+v3+v4+v5+v6; //tri contains correct values!

是的。这对我来说没有任何意义。tri[0]当我将 vec3 加法串在一起[]在同一语句中使用我的运算符时,我只会得到错误(奇怪的数据)。

4

0 回答 0