加载 .dae 文件时出现问题,索引和顶点加载正确
Posted
技术标签:
【中文标题】加载 .dae 文件时出现问题,索引和顶点加载正确【英文标题】:Problems loading .dae files, indices and vertices load correct 【发布时间】:2013-08-20 08:52:12 【问题描述】:所以在阅读this 之后,我认为最好更改为我加载文件的格式并决定使用 .dae 文件。写完这个非常简单的 xml-loader:
void Model::loadModelFromDae(std::string source)
using namespace std;
string name = source.substr(0,source.find("."));
cout<<"+++LOADING::"<<name<<"+++"<<endl;
ifstream file;
file.open(source);
string line;
size =0;
indexSize=0;
while(getline(file,line))
/*possible float_array's: vertices and normal*/
if(std::string::npos != line.find("<float_array"))
if(std::string::npos != line.find("positions"))
//get the size of the vertices float_array
int loc_count = line.find("count");
// to explain the hardcoded values: count=" is 7 char's
string cout_substr = line.substr(line.find("count"),line.find(">"));
cout_substr = cout_substr.substr(7,cout_substr.find("\""));
size = atoi(cout_substr.c_str());
cout<<"\tSIZE:"<<size<<endl;
vertices = new float[size];
memset(vertices,0.0f,sizeof(float)*size);
string values = line.substr(line.find("count")+11,line.size());
values = values.substr(0,values.size()-14);
std::stringstream converter(values);
vector<float> temp;
// Iterate over the istream, using >> to grab floats
// and push_back to store them in the vector
std::copy(std::istream_iterator<float>(converter),
std::istream_iterator<float>(),
std::back_inserter(temp));
for(int i=0;i<temp.size();i++) vertices[i] = temp.at(i);
//TODO: handle normal array
/*Handling indices*/
if(std::string::npos != line.find("<p>"))
string values = line.substr(line.find(">")+1,line.length());
values = values.substr(0,values.length()-4);
std::stringstream converter(values);
vector<short> temp;
// Iterate over the istream, using >> to grab shorts
// and push_back to store them in the vector
std::copy(std::istream_iterator<short>(converter),
std::istream_iterator<short>(),
std::back_inserter(temp));
indices = new short[temp.size()];
indexSize = temp.size();
cout<<"\tINDEXSIZE:"<<indexSize<<endl;
for(int i=0;i<temp.size();i++) indices[i] = temp.at(i);
cout<<"+++ENDED LOADING +DAE+ FILE:"<<name<<"+++"<<endl;
我仍然有一些问题:我正在尝试加载一个立方体,并检查每个顶点/索引,它们与 XML 文件完全匹配,但输出完全不是我所期望的:立方体呈现三角形,但不是按照他们应该的顺序。所以我有几个问题:
.dae 是否以不同的格式保存它的索引,然后 openGL 采用 是吗? (可选,因为它需要大量调试)你能发现我的错误吗,我最初的想法是顶点的朝向是 错了,但把glFrontFace(GL_CCW);
或 glFrontFace(GL_CW);
不会改变任何东西。
【问题讨论】:
【参考方案1】:在弄乱了索引之后,我得出了这样的结论:索引不仅是顶点的索引,还包括法线和 UV 的索引。因此,在加载索引时,您应该注意哪个索引属于哪个元素。
【讨论】:
以上是关于加载 .dae 文件时出现问题,索引和顶点加载正确的主要内容,如果未能解决你的问题,请参考以下文章