2011-10-24 2 views
1

3DGL 파일을 OpenGL 프로그램에로드하고 약간의 문제가 발생했습니다. 모든 꼭지점이 올바르게 배치되고면이 그려지지만 문제는 대부분의 (또는 모든) 꼭지점이 하나 또는 두 개의 꼭지점에 대한 연결을 유지하는 것처럼 보이므로 많은 수의 여분의 모서리가 만들어집니다. 이전에이 문제를 겪은 사람이나 해결 방법에 대한 의견이 있으십니까?어떻게하면 제대로 3ds 파일에서 얼굴을 렌더링 할 수 있습니까?

다음 코드 블록은 내가 얼굴을 그리는 데 사용하는 루프입니다. 한 번에 하나의 꼭지점을 반복하며, 사용되지 않은면 수정 자이므로 매 4 번째 값 (이론상)을 건너 뜁니다.

glBegin(GL_TRIANGLES); 
for(int x = 1; x < 4*numberOfTriangles+1; x++) 
{ 
    //Face bit modifiers not needed, skip em. 
    if(tLoop == 4) 
    { 
     tLoop = 0; 
     continue; 
    } 
    else 
    { 
     glVertex3f(Vertices[Triangles[x]*3],Vertices[(Triangles[x]*3)+1],Vertices[(Triangles[x]*3)+2]); 
     tLoop++; 
    } 
} 
glEnd(); 

다음은 내가 가진 문제를 나타내는 이미지입니다. http://img.photobucket.com/albums/v298/Reaperc89/Pistol.jpg

+0

이것은 3ds 파일의 메쉬 데이터를 정확히 모른 채로는 문제를 해결하기 어렵습니다. 메쉬가 인덱스 된 삼각형 (즉, 인덱스 세트 (3 개의 인덱스 세트 각각이 3 개의 버텍스를 참조)과 정점 세트)로 저장 될 수 있습니다. – axon

+0

3ds 파일 메쉬 데이터는 정점을 차례로 저장하는 반면면 데이터는 정점을 나타내는 3 개의 인덱스로 저장됩니다. 예를 들어 입방체의 경우,면 1의 세 인덱스는 4, 0 및 7 일 수 있습니다. 이는 정점 목록의 5, 1 및 8 번째 정점과 관련이 있습니다. 얼굴 데이터의 일부이기도 한 네 번째 값이 있지만 지오메트리를 구성하는 데 필요하지 않은면의 비트 플래그 수정 자입니다. – Evan

+2

왜'x = 0' 대신에'x = 1'로 시작 했습니까? 만약 당신이 원하지 않는 값을 읽지 않거나 (즉 반복을 반복 할 수 있도록 루프를 풀어 놓기를 권장하지만) 별도의 변수를 가지기보다는'if (x % 4 == 3) 하나의 삼각형을 그립니다. – user786653

답변

3

glBeginglEnd이 루프 외부에 있다는 사실은 아무런 문제가되지 않습니다. 하나씩 다른 꼭지점을 사용하여 삼각형을 그리는 것은 올바른 방법입니다. 3 개의 연속 된 정점마다 삼각형 모양을 만듭니다. 원하는 모양입니다.

문제는 else 블록 안에 tLoop을 증가시켜 4 번째 대신 5 번째 인덱스를 건너 뛰었습니다. 그래서 unrolling은 그것을 막았지만, 루프 밖에서 작동하지 않는 것은 glBegin/glEnd과 아무런 관련이 없습니다.

glBegin(GL_TRIANGLES); 
for(int x = 1; x < 4*numberOfTriangles+1; x++) 
    if(x % 4) //works if x starts at 1, though I don't know why x has to start at 1 
     glVertex3f(Vertices[Triangles[x]*3],Vertices[(Triangles[x]*3)+1],Vertices[(Triangles[x]*3)+2]); 
glEnd(); 

또는 더 나은 루프 풀다 :하지만 등이 주석에서 말했다, 당신은 단지 대신 x를 사용할 수 있기 때문에, 어쨌든 tLoop 필요하지 않습니다

glBegin(GL_TRIANGLES); 
for(int x = 1; x < 4*numberOfTriangles+1; x+=4) { 
    glVertex3f(Vertices[Triangles[x]*3],Vertices[(Triangles[x]*3)+1],Vertices[(Triangles[x]*3)+2]); 
    glVertex3f(Vertices[Triangles[x+1]*3],Vertices[(Triangles[x+1]*3)+1],Vertices[(Triangles[x+1]*3)+2]); 
    glVertex3f(Vertices[Triangles[x+2]*3],Vertices[(Triangles[x+2]*3)+1],Vertices[(Triangles[x+2]*3)+2]); 
} 
glEnd(); 

을하지만 내부 glBegin/glEnd를 배치 루프는 당신이 할 수있는 가장 실망스러운 것입니다. 실제로 이미 정점/인덱스 배열 기반 표현을 사용하는 경우 렌더링 코드를 즉각적인 모드보다 훨씬 빠른 버텍스 배열로 이식하는 것이 매우 쉽습니다. VBO를 사용하면 더욱 그렇습니다.

+0

아, 알았어요. 지금 당신이 얻고있는 것을 봅니다. 피드백 덕분입니다. – Evan

0

내 자신의 문제를 파악했습니다. 시작과 끝 블록이 루프 바깥에 어떻게 나타나는지 주목하십시오. 이 프로그램은 메쉬의 모든 정점을 하나씩 사용하여 삼각형을 그려 내려고했습니다. 따라서 그것은 마치 거대한 혼란을 일으켰습니다. 한 번에 3 개의 정점 배치 (한면)로 변경하고 시작/끝 블록을 루프 안에 배치하고 매회 4 씩 루프를 변경하여 얼굴 데이터를 건너 뛸 수있게했습니다.

궁금한 점이 있으시면

+0

삼각형을 렌더링 할 수있는 가장 느린 방법 일뿐입니다. glBegin/glEnd를 사용하는 것은 더 이상 사용되지 않는 방법입니다. 각 삼각형에 대해 그렇게하는 것은 병리학 적으로 나쁘다. 나는 당신이 잘못 가고있는 곳을 이해하려고 노력하는 데 더 많은 시간을 할애 할 것을 촉구합니다. – Alan

+0

OpenGL을 처음 접했을 때 다른 방법이 있다는 것을 깨닫지 못했습니다. 이제는 당신이 언급 했었지만 나는 좀더 자세히 들여다 볼 수 있습니다. – Evan

+0

아니, 그게 네 문제가 아니었다. 내 대답을 보라. –