【问题标题】:C++ OBJ Loader Fstream IssueC++ OBJ 加载程序 Fstream 问题
【发布时间】: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 &gt;&gt; text 电话是怎么回事?你已经打电话给std::getline()。您可以使用std::stringstream 进一步解析每一行,example
  • rafix07 就是这么说的,尽管它仍然会出现同样的问题

标签: c++ vector mesh loader


【解决方案1】:

问题是你打了两次电话

file >> text;

这一行应该只被调用一次。

另一个问题是在你的while循环中你正在调用

getline(file,line)

所以一行的内容被读入line 变量,但你没有解析line 字符串来从这行OBJ 文件中提取数据。

我认为你应该逐行阅读getline(file,line) 然后创建 istringstream 对象并可以解析数据,因此修改后的代码应如下所示

    std::string line;
    while (std::getline(file, line)) {
      std::string text;
      std::istringstream iss(line);

      iss >> text;
      if (text == "v") {
        Vector3 vertex;
        iss >> vertex.X;
        iss >> vertex.Y;
        iss >> vertex.Z;
        vertices.push_back(vertex);
      }

      if (text == "vt") {
        TexCoord texCoord;
        iss >> texCoord.u;
        iss >> texCoord.v;
        textureCoords.push_back(texCoord);
       }
  }

【讨论】:

  • i.imgur.com/Qvwsuqz.png 好吧,我照你说的做了,尽管它仍然给出完全相同的问题,例如每个顶点的最后一个数字被遗漏,并且返回的奇怪值如“-3E-06”
  • 您应该编辑您的问题,使用当前代码并粘贴您正在打印 x、y 和 z 坐标的行。
  • 我的代码没有改变,问题中显示的代码是我当前的代码,我已经添加了打印出顶点的代码。
  • 我对我的问题进行了另一个编辑以提供更多信息
  • GLfloat 的精度有限,你可以使用 GLdouble 代替 GLfloat,改变它看看你会得到什么输出。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-28
  • 1970-01-01
  • 2011-05-20
相关资源
最近更新 更多