我有一个有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();
}
}
这永远不会产生任何输出:
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应该取前两个顶点并绘制一条线,然后对于每个新顶点,从最后一条线的末端绘制另一条线。
洞穴
所有这些都假设您的文件实际上是为生成这样的行而设计的。大多数三维文件格式包括顶点和索引。顶点告诉你三维位置,但索引告诉你哪些点应该连接到哪个点。然而,由于这看起来像是一种家庭作业,我将假设文件是如所述的,一个简单的X-Y-Z坐标列表,应该按顺序连接。