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

OpenGL wireframe from x,y, and z text file

本文关键字:文件 OpenGL 线框 文本 来自      更新时间:2023-10-16

我有一个有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每行需要两个顶点,并且在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应该取前两个顶点并绘制一条线,然后对于每个新顶点,从最后一条线的末端绘制另一条线。

洞穴

所有这些都假设您的文件实际上是为生成这样的行而设计的。大多数三维文件格式包括顶点和索引。顶点告诉你三维位置,但索引告诉你哪些点应该连接到哪个点。然而,由于这看起来像是一种家庭作业,我将假设文件是如所述的,一个简单的X-Y-Z坐标列表,应该按顺序连接。