【问题标题】:Read In Points From OBJ File C++从 OBJ 文件 C++ 中读取点
【发布时间】:2016-11-02 22:01:34
【问题描述】:

我正在尝试读取以下 OBJ 文件

#--- ObjWriter ---
v -0.599972 -0.599972 -0.599972
v -0.304591 -0.834531 0.539150
.
.
.
f 1 2 6 
f 1 6 5 
f 1 5 7 
.
.
.

我正在尝试设置一个函数,它将顶点的值(char v 后面的 3 个值)存储到点向量(Pt 由 ax、y 和 z 组成)和 a面(char f 后面的 3 个值)到另一个面向量(面由 3 个整数组成)。到目前为止,我已经尝试使用以下功能:

void readFile(char *inFile)
{
    ifstream inF(inFile);
    string line;

    while (getline(inF, line))
    {
        if (line[0] == 'v')
        {
            float x, y, z;
            inF >> x >> y >> z;

            // cout << x;

            verts.push_back(Pt(x, y, z));
        }
        else if (line[0] == 'f')
        {
            int x, y, z;
            inF >> x >> y >> z;
            faces.push_back(Face(x, y, z));
        }
        else if (line[0] == '#')
            continue;
    }
}

每当我通过在第一个 if 语句中显示 x 值来测试此方法时,我都会得到值“-858993460”。如何修复此功能? cout 线的位置被注释掉了。

【问题讨论】:

  • -858993460 是十六进制的0xCCCCCCCC。这是 Visual Studio 附带的 CRT 调试版本分配给未初始化数据的模式。由于我们无法“在第一个 if 语句中显示 x 值”,因此我们无法帮助您,也无法提供解释。
  • 我把 cout 放在我做测试的地方。另外,测试所有值是否已成功存储的最佳方法是什么?
  • 调试器是解决此类问题的正确工具。 询问 Stack Overflow 之前,您应该逐行浏览您的代码。如需更多帮助,请阅读How to debug small programs (by Eric Lippert)。至少,您应该 [编辑] 您的问题以包含一个重现您的问题的 Minimal, Complete, and Verifiable 示例,以及您在调试器中所做的观察。

标签: c++ input object-files


【解决方案1】:

您可以使用 assimp (http://www.assimp.org) 来代替编写自己的 obj 文件阅读器

关于您的代码:您应该在访问索引 0 处的字符串之前检查行是否为空。 然后,在读取浮点值时,您必须首先从行中跳过字符(在顶点的情况下为“v”)。例如,您可以将其读入一个虚拟 char 变量。 最后,>> 改变输入流的状态。例如,您可以使用 stringstream 并使用当前行对其进行初始化,然后从此流中读取。

类似这样的:

if(line.empty())
    continue;

if (line[0] == 'v')
{
    float x, y, z;
    char dummy;
    std::stringstream ss(line);
    ss >> dummy >> x >> y >> z;
    cout << x << ";" << y << ";" << z << "\n";
}

【讨论】:

  • 为什么将第一个字符读入一个虚拟字符,而不是将它读入一个适当的char 变量,并将其用作switch/case 语句的输入?
  • 检查 char 可以让我保存 v 的浮点数或 f 的整数,以便在以后的计算中使用。我需要区分不同的值集。
  • 我想展示如何在不进行太多更改的情况下运行代码。如果我要实现它,我不会使用字符串流和那些东西,而是会实现一个简单的解析器(FSM),因此也会在该行的第一个字符上分支。
猜你喜欢
  • 1970-01-01
  • 2013-05-14
  • 1970-01-01
  • 1970-01-01
  • 2020-10-07
  • 1970-01-01
  • 2020-10-18
  • 2014-04-02
  • 2012-05-15
相关资源
最近更新 更多