2013-07-13 3 views
1

Я изучаю программирование opengl для учебных целей, и я использую openscenegraph обертка вокруг opengl.Треугольная полоса и 3d сетки

Моя первая цель - визуализировать 3d-сетку, в которой данные высоты хранятся в файле как матрица 2d. Первый вопрос: могу ли я использовать TRIANGLE_STRIP для рендеринга этой сетки, которая может иметь вогнутые или выпуклые зоны?

Второй вопрос: есть ли какой-то конкретный альгорит для рендеринга 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.

Код, который я использовал, является следующим (считайте его кодом с открытым кодом). в строках и столбцах vars (int) i хранит размеры сетки. 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

Первый вопрос: Да. Второй: Что вы имеете в виду? Что должен делать алгоритм? Вы сделали какой-то прогресс в этой дополнительной строке? Ваш код выглядит правильно. Вы подтвердили, что дополнительная линия поступает из сетки, а не из какой-либо другой геометрии? Действительно ли это только одна строка, простирающаяся от (2,1) до (2,3)? Как это выглядит, когда вы используете x^2 + y^2 как функцию значения сетки? –

+0

Doh, я просто понял, что дополнительная строка просто проистекает из вырожденных треугольников, которые вы вставляете в конце каждой строки. -.- –

ответ

0

Я признаю, что я был слишком ленив, чтобы посмотреть на ваш алгоритм близко, но если вы не возражаете, не изобретать колесо, я призываю вас использовать NvTristrip library. При этом вы можете взять индексированную сетку и преобразовать ее в тримех.

Затем вы можете создать обычную индексированную сетку прямоугольников с координатами x, y, h, заданными в каждой вершине (где h - высота или «данные» из вашей матрицы). Затем вы конвертируете эту индексированную сетку в tristrip с помощью NvTristrip и передаете эти данные OpenScenegraph.

Я сам использовал NvTristrip с OpenScenegraph, и он отлично работает.

Тем не менее, мне любопытно, почему вам понадобится tristrip в первую очередь, поскольку индексированная сетка кажется идеальной для ваших целей. OpenScenegraph более чем счастливо поддерживает примитив QUAD. Это упростит вашу работу, я думаю.

Смежные вопросы