#arrays #opengl #for-loop #point-clouds
#массивы #opengl #for-цикл #облака точек
Вопрос:
Привет, у меня возникли проблемы с помещением данных изображения в 3D-массивы при выполнении облака точек с opengl.
Это мои два 3D-массива:
float*** imgdata;
imgdata = new float**[576];
for(int a=0; a<576; a )
{
*(imgdata a) = new float*[352];
for(int b=0; b<352; b )
*(*(imgdata a) b) = new float[1];
}
float*** texture;
texture = new float**[576];
for(int a=0; a<576; a )
{
*(texture a) = new float*[352];
for(int b=0; b<352; b )
*(*(texture a) b) = new float[3];
}
и именно здесь я загружаю карту глубины и цветное изображение
GBmp bm0;
GBmp bm1;
bm0.load("depth.bmp");
bm1.load("color.bmp");
теперь я пытаюсь поместить данные двух изображений в 3D-массивы, используя циклы for
похоже, проблема заключается именно в этой части.
for (int i=0; i<bm0.w; i )
{
for (int j=0; j<bm0.h; j )
{
for (int x=0; x<bm0.w; x )
{
for (int y=0; y<bm0.h; y )
{
texture[i][j][0] = bm1.rgb[x*3 y*bm0.w*3];
texture[i][j][1] = bm1.rgb[x*3 y*bm0.w*3 1];
texture[i][j][2] = bm1.rgb[x*3 y*bm0.w*3 2];
}
}
}
}
for (int i=0; i<bm0.w; i )
{
for (int j=0; j<bm0.h; j )
{
for (int x=0; x<bm0.w; x )
{
for (int y=0; y<bm0.h; y )
{
imgdata[i][j][0] = bm0.rgb[x y*bm0.w];
}
}
}
}
Когда я начинаю отладку, я получаю только пустое окно без каких-либо ошибок или необработанного исключения, поэтому я понятия не имею, что пошло не так. Любая помощь или совет приветствуются.
Вот вторая половина кода. Я использую эти два массива, imgdata amp; texture, для рисования точек в трехмерном пространстве.
glPointSize (1);
glBegin(GL_POINTS);
for (int i=0; i<bm0.w; i )
{
for (int j=0; j<bm0.h; j )
{
glColor3f(texture[i][j][0]/255, texture[i][j][1]/255, texture[i][j][2]/255);
x=imgdata[i][j][0];
y=imgdata[i][j][1];
z=imgdata[i][j][2];
glVertex3f(x,y,z);
}
}
glEnd();
glutSwapBuffers();
free(imgdata);
free(texture);
Комментарии:
1. Как вы используете эти
imgdata
иtexture
массивы? Поскольку вы упомянули OpenGL, используете ли вы их в качестве аргументов для функций OpenGL? Если да, можете ли вы показать вызовы, в которых вы их используете? У меня есть хорошая идея о том, что, вероятно, неправильно, но мне нужно увидеть использование массивов.2. Да, это так. Извините за отсутствие информации, я обновил вопрос.
3. Не та проблема, о которой я думал, что это может быть. Я подумал, что вы, возможно, используете его в качестве текстурных данных с момента его вызова
texture
, но это не так. Спасибо за добавление дополнительной информации.4. Да, я использую «текстуру» для определения цвета точек облака точек. Итак, эти циклы for, они кажутся вам нормальными?
Ответ №1:
Ваша логика цикла выглядит некорректно. Внимательно посмотрите на то, что здесь происходит:
for (int i=0; i<bm0.w; i )
{
for (int j=0; j<bm0.h; j )
{
for (int x=0; x<bm0.w; x )
{
for (int y=0; y<bm0.h; y )
{
texture[i][j][0] = bm1.rgb[x*3 y*bm0.w*3];
texture[i][j][1] = bm1.rgb[x*3 y*bm0.w*3 1];
texture[i][j][2] = bm1.rgb[x*3 y*bm0.w*3 2];
}
}
}
}
Похоже, вы хотите в значительной степени просто скопировать данные в массивы, которые вы выделили своим собственным расположением памяти. Два внешних цикла повторяют каждый пиксель в вашем целевом массиве ( texture
). Как только вы окажетесь внутри этих двух циклов, я полагаю, вы просто захотите скопировать соответствующий пиксель из исходного массива. Вместо этого у вас есть еще два цикла, которые повторяют каждый пиксель в исходном массиве.
Таким образом, вы перезаписываете texture[i][j]
с каждой итерацией двух внутренних циклов. Результатом этого является то, что все пиксели в целевом массиве будут иметь одинаковое значение, которое является последним пикселем в исходном массиве.
Вместо этого вам нужно что-то вроде этого:
for (int i=0; i<bm0.w; i )
{
for (int j=0; j<bm0.h; j )
{
texture[i][j][0] = bm1.rgb[i*3 j*bm0.w*3];
texture[i][j][1] = bm1.rgb[i*3 j*bm0.w*3 1];
texture[i][j][2] = bm1.rgb[i*3 j*bm0.w*3 2];
}
}
Это просто перебирает все пиксели и копирует их из источника в пункт назначения.
Другая проблема заключается в том, что вы выделяете и заполняете imgdata
с [1]
для последнего измерения, но затем получаете к нему доступ с помощью индексов [0]
, [1]
и [2]
в коде рисования.
Комментарии:
1. Спасибо, добрый сэр! Я не могу разобраться в этих циклах for в течение нескольких дней, вы объяснили это красиво и ясно.
2. Я разберусь с
imgdata
проблемой.3. что, если я изменил imgdata на
float** imgdata; imgdata = new float*[576]; for(int a=0; a<576; a ) { *(imgdata a) = new float[352]; }
, а затем часть для определения местоположения точек наx=imgdata[i][j]; y=imgdata[i][j]; z=imgdata[i][j]; glVertex3f(x,y,z);
, хотя я по-прежнему ничего не получаю..4. о, моя ошибка, я неправильно настроил перспективы.