2013-07-13 142 views
1

我正在學習opengl編程的學習目的,我使用openscenegraph 圍繞opengl的包裝。三角帶和三維網格

我的第一個目標是渲染一個三維網格,其中高度數據作爲二維矩陣存儲在文件中。 第一個問題:我可以使用TRIANGLE_STRIP渲染可以具有凹面或凸面區域的網格嗎?

第二個問題:是否有特定的alghoritm爲此目的渲染三維網格(地形)?

我從一個非常簡單的網格數據開始:

10 10 10 10 10 
10 10 10 10 10 
10 10 5 10 10 
10 10 10 10 10 
10 10 10 10 10 

這是一個非常簡單的5x5的高度格,但結果,使用triangle_strip是遵循: enter image description here

如u可以看到有一個額外的線,我不能從我的triangle_Strip算法下降。

我使用的代碼是follow(考慮它是openscenegraph代碼)。行和列中的 變量(int)我存儲網格的尺寸。 數據是一個osg::Vec3**指針,其中以前我讀取普通值。 m_rpTerrainData是osg::ref_ptr<osg::Vec3Array>其中我加載,正確的順序(如triangle_strip想要)的頂點。

for(x=0;x<rows;x++) 
{ 
    for(y=0;y<columns;y++) 
    { 

     if(x<rows-1 && y<columns-1){ 
      this->m_rpTerrainData->push_back(data[x][y]); 
      this->m_rpTerrainData->push_back(data[x+1][y]); 

     } 


        /*degenerate triangle because we at last of a column*/ 
     if(x<rows-1 && y==columns-1){ 
      this->m_rpTerrainData->push_back(data[x][y]); 
      this->m_rpTerrainData->push_back(data[x+1][y]); 
         this->m_rpTerrainData->push_back(data[x+1][y]); 
         this->m_rpTerrainData->push_back(data[x+1][0]); 
     }      
    } 
} 
    //drop last element 
this->m_rpTerrainData->pop_back(); 
+0

顯示一些代碼。 –

+0

第一個問題:是的。第二:你的意思是?算法應該做什麼?你在額外的線路上有進展嗎?你的代碼看起來正確。你是否證實多餘的線來自網格,而不是來自其他幾何?這實際上只是從(2,1)延伸到(2,3)的一條線嗎?當你使用x^2 + y^2作爲網格值函數時,它看起來像什麼? –

+0

Doh,我剛剛意識到多餘的線條來自您在每行末尾插入的退化三角形。 -.- –

回答

0

我承認,我是懶得在你的算法來仔細一看,但如果你不介意不重新發明輪子,我強烈建議你使用NvTristrip library。有了這個,你可以採取索引網格並將其轉換爲三網格。

然後,您可以創建一個正常索引的矩形網格,並在每個頂點指定您的x,y,h座標(其中h是矩陣的高度或「數據」)。然後使用NvTristrip將該索引網格轉換爲三角網格,並將此數據提供給OpenScenegraph。

我自己用OpenScenegraph使用NvTristrip,它工作正常。

但是,我很好奇你爲什麼需要一個三腳架,因爲索引網格看起來非常適合你的目的。 OpenScenegraph不僅僅是支持QUAD原語。這會簡化你的工作,我想。