рендеринг облака точек OpenGL 3D из массива x, y, z

Нужно какое-то направление на 3d отображение облака точек с использованием openGl в C ++ (vs2008). Я пытаюсь сделать 3d отображение облака точек с текстурой. У меня есть 3 двумерных массива (каждый размер 1024×512), представляющих x, y, z каждой точки. Я думаю, что я на правильном пути с

glBegin(GL_POINTS);
for(int i=0; i<1024; i++)
{
for(int j=0; j<512; j++)
{
glVertex3f(x[i][j], y[i][j], z[i][j]);
}
}
}
glEnd();

Теперь это загружает все вершины в буфере (я думаю), но отсюда я не уверен, как поступить. Или я полностью неправильно Вот.

Затем у меня есть другой двумерный массив (того же размера), который содержит данные о цвете (значения от 0 до 255), которые я хочу использовать в качестве текстуры на трехмерном облаке точек и для отображения.

10

Решение

Код точечного рисунка хорош как есть.

(В долгосрочной перспективе вы можете столкнуться с проблемами производительности, если вам придется многократно рисовать эти точки, скажем, в ответ на вращение представления пользователем. Перестановка данных из 3 массивов в 1 с значениями x, y, z рядом друг с другом позволит Вы должны использовать более быстрые массивы вершин / VBO. Но пока, если это не сломано, не исправляйте это.)

Чтобы раскрасить точки, вам нужно glColor перед каждым glVertex. Это должно быть до, а не после, потому что в OpenGL glVertex означает, что это полная вершина, нарисуйте ее. Вы описали данные как облако точек, поэтому не меняйте glBegin на GL_POLYGON, оставьте его как GL_POINTS.

Хорошо, у вас есть другой массив с однобайтовыми значениями индекса цвета. Вы могли бы начать, просто используя это как уровень оттенков серого с

glColor3ub(color[i][j], color[i][j], color[i][j]);

который должен показывать точки от черного до белого.

Чтобы получить истинный цвет для каждой точки, вам нужна таблица соответствия цветов — я предполагаю, что есть либо та, которая поставляется с данными, либо та, которую вы создаете. Должно быть объявлено что-то вроде

static GLfloat ctab[256][3] = {
1.0, 0.75, 0.33,  /* Color for index #0 */
...
};

и используется до GlVertex с

glColor3fv(ctab[color[i][j]]);

Я использовал цвета с плавающей точкой, потому что это то, что OpenGL использует в наши дни. Если вы предпочитаете значения 0..255 для цветов, измените массив на GLubyte, а glColor3fv на glColor3ub.

Надеюсь это поможет.

2

Другие решения

Других решений пока нет …