当还使用返回 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]
和i1
toi6
是索引。我真的按照这个顺序运行这些案例以获得我的结果。
// 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 加法串在一起并[]
在同一语句中使用我的运算符时,我只会得到错误(奇怪的数据)。