所以我正在写一个Wavefront OBJ加载器。我能够获得顶点,法线和纹理坐标,但我遇到了面部问题。我想弄清楚如何忽略某些字符,例如" //"和" /"在C ++中使用std :: stringstream。反正有没有这样做?感谢。
这是我的加载功能:
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;
}
答案 0 :(得分:2)
您可以尝试直接检查您不想要的字符。在if
声明中,您可以continue
或break
或根据您的目的放置任何内容。
if (line == "/" || line == "//") {
continue; //if you want to move on to the next loop iteration
break; //if you want to leave the loop
//Do nothing if you want to continue in the current loop iteration
}
答案 1 :(得分:0)
使用您的方法,您可以使用特定的区域设置来确定>>
运算符的分隔符 - 这非常讨厌here。
在我的解析器中,我尝试阅读第一个tripplet(&#34; V&#34;或&#34; V / VT&#34;或&#34; V // VN&#34;或&#34; V / VT / VN&#34;)逐个字符地解析,然后分割字符串的其余部分,期望每个顶点具有相同数量的/
- 我发现它非常健壮。