在使用返回glm :: vec3的重载[]运算符时,我遇到了将多个向量加法串联在一起的问题。
我通过“删除”我的添加内容来解决这个问题(将每个内容放在它自己的声明中)但是我真的想知道它为什么会发生(也许我的[]运算符做错了? )。
NVec
是std::vector<glm::vec3>
的包装类,它的[]重载超载。这样做的目的是处理out of bounds []调用(边界是他们需要的,而不是标准的索引边界)。
操作
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
是glm::vec3[3]
,i1
到i6
是索引。我按顺序运行这些案例以获得我的结果。
// 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!
所以,是的。这对我没有任何意义。当我将vec3添加添加和在同一语句中使用我的tri[0]
运算符时,我只会收到错误([]
中的奇怪数据)。