2014-07-07 5 views
1

안녕하세요. 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"); 

가 지금은 두 이미지의 데이터를 입력하려고 컬러 이미지를로드 곳이다 루프 for 을 사용하여 3D 배열에 삽입하면 문제가있는 부분이됩니다.

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 & 텍스처를 사용하여 3D 공간에 점을 그립니다.

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); 
+0

이'imgdata' 및'texture' 배열을 어떻게 사용하고 있습니까? OpenGL에 대해 언급 했으므로 OpenGL 함수에 인수로 사용하고 있습니까? 그렇다면 사용하는 곳에서 전화를 걸 수 있습니까? 아마 잘못된 것이 무엇인지 잘 알고 있지만 배열의 사용법을 알아야합니다. –

+0

예. 정보 부족으로 죄송합니다. 질문을 업데이트했습니다. – SodaGuns

+0

문제가 아니라고 생각했습니다. 나는 텍스쳐 데이터를'texture'라고 부르기 때문에 텍스쳐 데이터로 사용할 수도 있다고 생각했지만 그렇지 않습니다. 추가 정보를 추가해 주셔서 감사합니다. –

답변

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)의 각 픽셀을 반복합니다. 일단이 두 개의 루프 안에 있으면 소스 배열에서 해당 픽셀을 복사하기를 원한다고 생각합니다. 대신 소스 배열의 각 픽셀을 반복하는 또 다른 두 개의 루프가 있습니다.

따라서 내부 루프 2 개를 반복 할 때마다 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]; 
    } 
} 

이 단순히 모든 픽셀을 통해 루프 및 복사합니다 :

대신, 당신은 이런 식으로 뭔가를해야합니다.

또 다른 문제

는 할당하고 마지막 차원의 [1]imgdata를 채울 수 있지만, 다음 인덱스 드로우 코드 [0], [1][2]으로 접근한다는 것이다.

+0

고맙습니다! 며칠 동안 루프를 사용하는 사람들에게 머리를 쓰지 않을 수 있습니다. \ – SodaGuns

+0

나는 'imgdata'문제에 대해 살펴볼 것입니다. – SodaGuns

+0

만약 내가 imgdata를 으로 바꾼다면 'float ** imgdata; imgdata = new float * [576]; (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); ' 그래도 나는 아무것도 얻지 못합니다. – SodaGuns

관련 문제