2013-07-13 82 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原语。这会简化你的工作,我想。