我有一个包含3个坐标的文件,我可以将它渲染为点,线,三角形或任何基元。 我想构建一个这个文件的线框模型,我应该更改或添加什么来将其视为线框
样品:
void draw()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glClearDepth(1.0f);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
glOrtho(-50.0,50.0,-50.0,50.0,-50.0,50.0);
glColor4f(1.0f,1.0f,1.0f,1.0f);
glPointSize(3);
glLineWidth(3);
glColor3f(1.0f,1.0f,1.0f);
for(int i=0; i<points; i++)
{
glBegin(GL_LINES);
glNormal3f(0.0f, 0.0f, 1.0f);
glVertex3d(vList[i][0],vList[i][1],vList[i][2]);
glEnd();
}
}
答案 0 :(得分:3)
这永远不会产生任何输出:
for(int i=0; i<points; i++)
{
glBegin(GL_LINES);
glNormal3f(0.0f, 0.0f, 1.0f);
glVertex3d(vList[i][0],vList[i][1],vList[i][2]);
glEnd();
}
GL_LINES每行需要两个顶点,而您只需在glBegin
和glEnd
来电之间提供一个顶点。
glBegin
和glEnd
应该包含特定的几何,不个别顶点。
但是,只需将调用移出for循环就无法解决问题:
glBegin(GL_LINES);
for(int i=0; i<points; i++)
{
glNormal3f(0.0f, 0.0f, 1.0f);
glVertex3d(vList[i][0],vList[i][1],vList[i][2]);
}
glEnd();
这将几乎生成您想要的内容,但实际上会显示每条OTHER行,因为它将您发送的每一对视为一行。因此,它将在点1和2之间绘制一条线,然后在3和4之间绘制一条线。这是因为GL_LINES意味着“将我发送的每一对解释为一条全新的线,与先前的顶点无关。
你真正想要的是:
glBegin(GL_LINE_STRIP);
for(int i=0; i<points; i++)
{
glNormal3f(0.0f, 0.0f, 1.0f);
glVertex3d(vList[i][0],vList[i][1],vList[i][2]);
}
glEnd();
使用GL_LINE_STRIP
指示OpenGL它应该占用前两个顶点并绘制一条线,然后对于每个新顶点,从最后一行的末尾绘制另一条线。
所有这些假设您的文件实际上是为了生成这样的行。大多数3D文件格式包括顶点和索引。顶点告诉您3D位置,但索引会告诉您哪些点应该连接到哪个点。但是,由于这看起来像是一种家庭作业,我将假设文件如上所述,一个简单的X-Y-Z坐标列表应按顺序连接。