我正在学习用于学习目的的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如下:
你可以看到有一个我不能从我的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();
答案 0 :(得分:0)
我承认我太懒了,不能仔细查看你的算法,但是如果你不介意不重新发明轮子,我建议你使用NvTristrip library。这样,您可以获取索引网格并将其转换为trimesh。
然后,您可以创建一个普通的矩形索引网格,在每个顶点指定您的x,y,h坐标(其中h是矩阵的高度或'数据')。然后使用NvTristrip将索引的网格转换为tristrip,并将此数据提供给OpenScenegraph。
我自己使用NvTristrip和OpenScenegraph,它运行正常。
然而,我很好奇为什么你首先需要一个tristrip,因为索引网格看起来非常适合你的目的。 OpenScenegraph非常乐意支持QUAD原语。这会简化我的工作。