来自x,y和z文本文件的OpenGL线框

时间:2013-12-08 07:00:08

标签: c++ opengl opengl-1.x

我有一个包含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();             
    }
}

1 个答案:

答案 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每行需要两个顶点,而您只需在glBeginglEnd来电之间提供一个顶点。

glBeginglEnd应该包含特定的几何个别顶点。

但是,只需将调用移出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坐标列表应按顺序连接。