1

私のオブジェクトリーダーは、objファイルから頂点、法線テクスチャ座標値を読み取ることを目的としており、次に面の値を読み取り、頂点、法線、およびテクスチャのベクトルから対応するデータを取得することを目的としています。私が抱えている問題は、読み取った値から-1を取り除くことを無視しているように見えることがあることです:

using namespace std;

class Model
{

string name;

int verticesAmount;
int indicesAmount;
int normalAmount;
int textureAmount;

vector<XMFLOAT3> vertices;
vector<short> indices;
vector<SimpleVertex> simplevertex;
vector<XMFLOAT3> normals;
vector<XMFLOAT3> textures;

public:
    Model(const string OBJname)
    {
LoadOBJ(OBJname);
    }

 vector<XMFLOAT3> GetVertices()
 {

     return vertices;
 }

 vector<SimpleVertex> GetVertexData()
 {
     return simplevertex;
 }

 vector<short> GetIndices()
 {

     return indices;
 }

 int GetNumberOfVertices()
 {
     return simplevertex.size();
 }

  int GetNumberOfIndices()
 {
     return indices.size();
 }

void LoadOBJ(const string fileName)
{
    verticesAmount = 0;
    indicesAmount = 0;
    normalAmount = 0;
    textureAmount = 0;

    ifstream inFile;
    inFile.open(fileName.c_str());


    if (!inFile.good())
    {
        cerr  << "Can't open file" << fileName << endl; // checks if you can open the file or not
    }
    else cout<<fileName<< " opened successfully \n";

    string line;
    while(!inFile.eof())
    {

        inFile >> line;
        XMFLOAT3 temp;
            if (line[0] =='v')
            {
                if (line.length() >1)
                {
                    if(line[1] == 'n')
                    {
                        inFile >> temp.x;
                        inFile >> temp.y;
                        inFile >> temp.z;
                        normals.push_back(temp);
                        normalAmount++;
                    }
                    else if (line[1] == 't')
                    {
                        inFile >> temp.x;
                        inFile >> temp.y;
                        inFile >> temp.z;
                        textures.push_back(temp);
                        textureAmount++;
                    }
                }
                else
                {
                    inFile >> temp.x;
                    inFile >> temp.y;
                    inFile >> temp.z;
                    vertices.push_back(temp);
                    indicesAmount++;
                }
            }
            else if (line[0] == 'f')
            {
                SimpleVertex temp2;
                char bin;
                int tempindice;

                inFile >> tempindice;                           // inputs data
                indices.push_back(tempindice-1);
                temp2.Pos.x = vertices[(tempindice-1)].x;
                inFile >> bin;                                  // gets rid of the /
                inFile >> tempindice;                           // inputs data
                temp2.Texture.x = textures[(tempindice-1)].x;
                inFile >> bin;                                  // gets rid of the /
                inFile >> tempindice;                           // inputs data
                temp2.Normal.x = normals[(tempindice-1)].x;

                inFile >> tempindice;                           // inputs data
                indices.push_back(tempindice-1);
                temp2.Pos.y = vertices[(tempindice-1)].y;
                inFile >> bin;                                  // gets rid of the /
                inFile >> tempindice;                           // inputs data
                temp2.Texture.y = textures[(tempindice-1)].y;
                inFile >> bin;                                  // gets rid of the /
                inFile >> tempindice;                           // inputs data
                temp2.Normal.y = normals[(tempindice-1)].y;

                inFile >> tempindice;                           // inputs data
                indices.push_back(tempindice);
                temp2.Pos.z = vertices[(tempindice-1)].z;
                inFile >> bin;                                  // gets rid of the /
                inFile >> tempindice;                           // inputs data
                temp2.Texture.z = textures[(tempindice-1)].z;
                inFile >> bin;                                  // gets rid of the /
                inFile >> tempindice;                           // inputs data
                temp2.Normal.z = normals[(tempindice-1)].z;

                simplevertex.push_back(temp2);
                indicesAmount++;
            }
            else
            {
                inFile.ignore(1000,'\n');
            }
        }

    inFile.close();

}

};

これは私が作成したモデル クラス全体であり、問​​題があるのは loadOBj 関数です。使用する SimpleVertex 構造は次のとおりです。

struct SimpleVertex
{
    XMFLOAT3 Pos;
    XMFLOAT3 Normal;
    XMFLOAT3 Texture;
};

なぜこのようなことをしているのかよくわからず、私の講義は当惑しているように見えます。

4

0 に答える 0