0

glm::vec3 を返すオーバーロードされた [] 演算子も使用している場合、複数のベクトル加算をつなぎ合わせることに問題があります。

追加を「ストリング解除」することで問題を解決しました(それぞれを独自のステートメントに入れます)が、なぜそれが起こったのか本当に知りたいです(私の [] 演算子が間違っているのでしょうか?)。

NVecstd::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
    }
}

問題コード:

faceNormalsNVec三角形の面の法線でいっぱいですtri1glm::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