Нужно какое-то направление на 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), которые я хочу использовать в качестве текстуры на трехмерном облаке точек и для отображения.
Код точечного рисунка хорош как есть.
(В долгосрочной перспективе вы можете столкнуться с проблемами производительности, если вам придется многократно рисовать эти точки, скажем, в ответ на вращение представления пользователем. Перестановка данных из 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.
Надеюсь это поможет.
Других решений пока нет …