我创建了自己的顶点,颜色和索引,这些顶点,颜色和索引将使用openGL渲染。 以下是渲染顶点,颜色和索引的源代码。
//CODES TO SET VBO....
void displayCallback() {
glVertexPointer(...);
glColorPointer(...);
glDrawElemnts(GL_TRIANGLE_STRIP,...);
}
如您所见,索引将构建为GL_TRIANGLE_STRIP并将被渲染。 渲染后,我想用顶点,索引和颜色数据保存波前对象文件。
我试图让.obj文件说谎。
for(int i = 0; i < vertexSize; ++i) {
fprintf(fp, "v %f %f %f\n", vertices[i*3], vertices[i*3+1], vertices[i*3+2]);
}
fprintf("fp, "s 1\n");
for(int i = 0; i < indexSize; ++i) {
fprintf(fp, "f %d %d %d\n", indices[i*3], indices[i*3+1], indices[i*3+2]);
}
我尝试使用assimp查看器重新打开它,(http://www.assimp.org/)无法加载。 我错过了什么吗?
感谢。
答案 0 :(得分:2)
请添加一些简单的示例obj文件(像多维数据集一样的代码),以便我们可以看到文件中包含的内容。要看看我的意思,请看一下:
我敢打赌你错了指数。
GL_TRIANGLE_STRIP
每个三角形的1
个顶点不是3
根据OpenGL doc n
长度的顶点流将生成n-2
的{{1}}个三角形。
Wavefront obj文件索引从1开始
因此,您最有可能从GL_TRIANGLE_STRIP
建立索引,因此请检查...并相应地使用0
。
我不知道您的数据结构体系结构/拓扑结构,但在我看来,您的面孔应该像这样保存(未经测试,因为我没有您的数组/表和模型)推出#1,#2 强>一起:
+1
颜色数据
对于这个wavefront obj在单独的文件mtl,stl中使用材质扩展(我不熟悉那些抱歉...)但是现在3D扫描仪直接在obj文件中使用未记录的颜色编码(由一些观众支持)它是像这样做:
fprintf(fp, "f %d %d %d\n", indices[0]+1, indices[1]+1, indices[2]+1);
for(int i = 3; i < indexSize; i++)
fprintf(fp, "f %d %d %d\n", indices[i-2]+1, indices[i-1]+1, indices[i]+1);
因此,如果顶点具有v -5.231932 438.659877 -432.038039 0.000000 1.000000 0.000000
坐标,则第一个6
为3
,而最后x,y,z
为3
,因此以红色显示的链接答案的多维数据集将< / p>
r,g,b
您可以在查看器中尝试检查它是否支持此类编码...我在一些低成本的3D扫描仪应用程序上看到,他们能够保存这些文件,但重新加载后无法呈现颜色。 ..