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
。glm::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 の追加を[]
つなぎ合わせ、同じステートメントで演算子を使用すると、エラー ( の奇妙なデータ) が発生するだけです。