簡體   English   中英

來自x,y和z文本文件的OpenGL線框

[英]OpenGL wireframe from x,y, and z text file

我有一個具有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();             

幾乎可以產生您想要的內容,但實際上會顯示所有其他行,因為它將您發送的每一對都視為一行。 因此,它將在點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位置,而索引告訴您應該將哪些點連接到哪個點。 但是,由於這看起來像是一種家庭作業,因此我將假定該文件如前所述,這是應按順序連接的XYZ坐標的簡單列表。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM