【发布时间】:2015-08-05 16:05:31
【问题描述】:
所以我正在编写 Wavefront OBJ 加载器。我能够获得顶点、法线和纹理坐标,但我遇到了面部问题。我试图弄清楚如何使用 std::stringstream 在 C++ 中忽略某些字符,例如“//”和“/”。有没有办法做到这一点?谢谢。
这是我的加载函数:
bool Model::load(std::string file_name) {
std::string line;
std::ifstream file(file_name.c_str());
if(file.is_open())
{
while(std::getline(file, line))
{
std::stringstream stream(line);
stream >> line;
if(line == "#")
{
// ignore.
}
if(line == "v") // vertices
{
double x, y, z;
stream >> x >> y >> z;
v.push_back(x);
v.push_back(y);
v.push_back(z);
#ifdef DEBUG
std::cout << "v " << x << " "<< y << " " << z << "\n";
#endif
}
if(line == "vt") // texture coordinates
{
double u, v;
stream >> u >> v;
vt.push_back(u);
vt.push_back(v);
#ifdef DEBUG
std::cout << "vt " << u << " "<< v << "\n";
#endif
}
if(line == "vn") // normals
{
double x, y, z;
stream >> x >> y >> z;
vn.push_back(x);
vn.push_back(y);
vn.push_back(z);
#ifdef DEBUG
std::cout << "vn " << x << " "<< y << " " << z << "\n";
#endif
}
if(line == "f")
{
short a, b, c;
stream >> a; stream >> b; stream >> c;
a--; b--; c--;
f.push_back(a);
f.push_back(b);
f.push_back(c);
std::cout << a << " " << b << " " << c << "\n";
}
}
file.close();
return true;
} return false;
}
【问题讨论】:
-
获取 Boost::Spirit 并实现完整的解析器?