-1

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

1 回答 1

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调用之间提供一个。

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();             

几乎会产生你想要的东西,但实际上会显示每一行,因为它将你发送的每一对视为一行。所以它会在点 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();             

UsingGL_LINE_STRIP指示 OpenGL 它应该采用前两个顶点并绘制一条线,然后对于每个新顶点,从最后一条线的末端绘制另一条线。

警告

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

于 2013-12-08T21:27:18.043 回答