三角带和3d网格

时间:2013-07-13 10:44:36

标签: opengl

我正在学习用于学习目的的opengl编程,我正在使用openscenegraph 封装opengl。

我的第一个目标是渲染一个3d网格,其中高度数据作为2d矩阵存储在文件中。 第一个问题:我可以使用TRIANGLE_STRIP渲染那个可以有凹区或凸区的网格吗?

第二个问题:为此目的,是否有特定的alghoritm渲染3d网格(地形)?

我从一个非常简单的网格数据开始:

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

你可以看到有一个我不能从我的triangle_Strip算法中删除的额外行。

我使用的代码如下(认为它是openscenegraph代码)。 在行和列中vars(int)我存储网格尺寸。 data是一个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();

1 个答案:

答案 0 :(得分:0)

我承认我太懒了,不能仔细查看你的算法,但是如果你不介意不重新发明轮子,我建议你使用NvTristrip library。这样,您可以获取索引网格并将其转换为trimesh。

然后,您可以创建一个普通的矩形索引网格,在每个顶点指定您的x,y,h坐标(其中h是矩阵的高度或'数据')。然后使用NvTristrip将索引的网格转换为tristrip,并将此数据提供给OpenScenegraph。

我自己使用NvTristrip和OpenScenegraph,它运行正常。

然而,我很好奇为什么你首先需要一个tristrip,因为索引网格看起来非常适合你的目的。 OpenScenegraph非常乐意支持QUAD原语。这会简化我的工作。