如何从3ds文件中正确渲染人脸?
How can I properly render faces from a 3ds file
我已经实现了将3DS文件加载到我的OpenGL程序中的能力,并且遇到了一个小问题。所有的顶点都被正确地放置,并且绘制了面,但问题是大多数(或全部)顶点似乎保留了与一个或两个顶点的连接,从而创建了大量额外的边。有人遇到这个问题之前或有一个建议,我可以如何解决它?
下面的代码块是我用来绘制面的循环。它一次循环一个顶点,跳过每四个值(理论上),因为它们是未使用的面部修饰符。
glBegin(GL_TRIANGLES);
for(int x = 1; x < 4*numberOfTriangles+1; x++)
{
//Face bit modifiers not needed, skip em.
if(tLoop == 4)
{
tLoop = 0;
continue;
}
else
{
glVertex3f(Vertices[Triangles[x]*3],Vertices[(Triangles[x]*3)+1],Vertices[(Triangles[x]*3)+2]);
tLoop++;
}
}
glEnd();
下面是一个图像,代表了我遇到的问题。http://img.photobucket.com/albums/v298/Reaperc89/Pistol.jpg
glBegin
和glEnd
在循环之外的事实绝对没有问题。使用每个顶点一个接一个地绘制三角形是正确的方法。它将每3个连续的顶点构建一个三角形,这就是你想要的。
您的问题是,您在else块中增加了tLoop
,因此实际上跳过了每第五个索引,而不是每四个索引。所以展开阻止了它,但是它与glBegin/glEnd
不能在循环外工作无关。但就像评论中说的,你不需要tLoop
,因为你可以用x
代替:
glBegin(GL_TRIANGLES);
for(int x = 1; x < 4*numberOfTriangles+1; x++)
if(x % 4) //works if x starts at 1, though I don't know why x has to start at 1
glVertex3f(Vertices[Triangles[x]*3],Vertices[(Triangles[x]*3)+1],Vertices[(Triangles[x]*3)+2]);
glEnd();
或者更好的是展开循环:
glBegin(GL_TRIANGLES);
for(int x = 1; x < 4*numberOfTriangles+1; x+=4) {
glVertex3f(Vertices[Triangles[x]*3],Vertices[(Triangles[x]*3)+1],Vertices[(Triangles[x]*3)+2]);
glVertex3f(Vertices[Triangles[x+1]*3],Vertices[(Triangles[x+1]*3)+1],Vertices[(Triangles[x+1]*3)+2]);
glVertex3f(Vertices[Triangles[x+2]*3],Vertices[(Triangles[x+2]*3)+1],Vertices[(Triangles[x+2]*3)+2]);
}
glEnd();
但是将glBegin/glEnd
放在循环中是你能做的最愚蠢的事情。事实上,如果你已经使用了基于顶点/索引数组的表示,那么将渲染代码移植到顶点数组应该是相当容易的,这比直接模式要快得多,在vbo的支持下更是如此。
自己解决了问题。注意开始和结束块是如何出现在循环之外的。程序试图使用网格中的每个顶点绘制三角形,一个接一个。因此它制造了一个巨大的混乱。我改为一次放置三个顶点(一个面),并将开始/结束块放置在循环中,并将循环更改为每次递增4,允许我跳过面数据。
如果有人好奇的话
- .cpp和.h文件中的模板专用化声明
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 文本文件中的单词链表
- CMake-按正确顺序将项目与C运行时对象文件链接
- 使用新行和不使用新行读取文件
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 挂起和取消挂起一个文件DLL
- 如何确定我已使用非编码文件到达 EOF?
- 命名空间中具有.h和.cpp文件的类
- 如何使用ndk-build.cmd构建Android.so文件
- 从包含m行的文件中提取n行,必要时(惰性地)重复该文件
- 读取文件并输入到矢量中
- 在C++中查找文件
- c++库的公共头文件中应该包含什么
- 用c++从输入文件中读取另一行
- Cppcheck生成xml转储文件
- 读取文件的最后一行并输入到链接列表时出错
- 无法编译 rtmidi 测试 cmidiin.cpp 文件, 非法指令
- 为什么我尝试在 OpenGL 中加载的 3ds 文件会出现此未经处理的异常?
- 如何从3ds文件中正确渲染人脸?