私のオブジェクトリーダーは、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;
};
なぜこのようなことをしているのかよくわからず、私の講義は当惑しているように見えます。