【发布时间】:2018-03-13 01:24:35
【问题描述】:
我目前正在尝试创建自己的 OBJLoader,使用 Fstream 加载和搜索 OBJ 文件以读取顶点等。这是我目前所拥有的(尚未完成)
Mesh* OBJLoader::LoadModel(char* path)
{
Mesh* mesh = new Mesh(); //New Mesh
std::vector<Vector3> vertices;
std::vector<TexCoord> textureCoords;
std::vector<Vector3> normals;
//Loads OBJ file from path
std::ifstream file;
file.open(path);
if (!file.good())
{
std::cout << "Can't open texture file " << path << std::endl;
return nullptr;
}
std::string line;
while (std::getline(file, line))
{
std::string text;
file >> text;
if (text == "v")
{
Vector3 vertex;
file >> vertex.X;
file >> vertex.Y;
file >> vertex.Z;
vertices.push_back(vertex);
//std::cout << vertex.Z << std::endl;
}
file >> text;
if (text == "vt")
{
TexCoord texCoord;
file >> texCoord.u;
file >> texCoord.v;
textureCoords.push_back(texCoord);
}
}
return nullptr;
}
一开始它似乎有效,我通过打印出值来测试它,看看它们是否与 OBJ 文件中的值匹配,似乎……大多数不匹配,我不知道为什么。
我将从 OBJ 文件中获得的这些顶点放在一个顶点向量中,因此我通过打印出顶点向量来比较值来测试这个加载器,这就是我得到的:
这些是最后几个顶点,应该与我在 OBJ 文件中的最后几个顶点匹配:
您可能会看到,这些值并不完全匹配。有些值在末尾缺少一个数字,而有些则显示完全不同的东西,例如“-3E-06”。 有谁知道为什么会发生这种情况以及我该如何解决它,因为它几乎可以完美运行。
如果您想知道的话,这也是我用来打印出上述函数中的顶点的代码:
for (int i = 0; i < vertices.size(); i++)
{
std::cout << vertices[i].X << " " << vertices[i].Y << " " <<
vertices[i].Z << std::endl;
}
编辑 我注意到,简单地使用 file >> 打印出 Vertices 而不是将它们放入 vertices 向量中然后将它们打印出来会导致打印出正确的值。似乎当我将值放入顶点向量时,它会稍微改变它们。 在我将 OBJ 文件的第一个 X 顶点放入输出“-2.97217”而值应为“-2.972168”的“vertex.X”之后,我测试了打印输出。奇怪的是,它似乎在对最后两个数字进行四舍五入,尽管它似乎只针对 X 和 Y 顶点而不是 Z。
【问题讨论】:
-
那些
file >> text电话是怎么回事?你已经打电话给std::getline()。您可以使用std::stringstream进一步解析每一行,example。 -
rafix07 就是这么说的,尽管它仍然会出现同样的问题