2012-10-07 4 views
-1

나는 그림 정점으로 3 차원 사각 절두체를 만들려고 노력 해요 :"홈 메이드"OpenGL 3D 객체가 음영 처리되지 않는 이유는 무엇입니까?

int xPts[] = { 1.0, 1.0, -1.0, -1.0, 2.0, 2.0, -2.0, -2.0 }; 
int yPts[] = { 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0 }; 
int zPts[] = { 1.0, -1.0, -1.0, 1.0, 2.0, -2.0, -2.0, 2.0 }; 

int sideA[] = { 0, 3, 7, 4 }; 
int sideB[] = { 0, 1, 5, 4 }; 
int sideC[] = { 2, 3, 7, 6 }; 
int sideD[] = { 1, 2, 6, 5 }; 

glPolygonMode(GL_FRONT, GL_FILL); 

glPushMatrix(); 
    glTranslatef(xLoc, yLoc, zLoc); 

    glRotatef(xRotation, 1, 0, 0); 
    glRotatef(yRotation, 0, 1, 0); 
    glRotatef(zRotation, 0, 0, 1); 

    glScalef(xSize, ySize, zSize); 

    glBegin(GL_POLYGON); 
     for (int i = 0; i < 4; i++) { 
      glVertex3f(xPts[i], yPts[i], zPts[i]); 
     } 

     for (int i = 4; i < 8; i++) { 
      glVertex3f(xPts[i], yPts[i], zPts[i]); 
     } 

     for (int i = 0; i < 4; i++) { 
      glVertex3f(xPts[sideA[i]], yPts[sideA[i]], zPts[sideA[i]]); 
     } 

     for (int i = 0; i < 4; i++) { 
      glVertex3f(xPts[sideB[i]], yPts[sideB[i]], zPts[sideB[i]]); 
     } 

     for (int i = 0; i < 4; i++) { 
      glVertex3f(xPts[sideC[i]], yPts[sideC[i]], zPts[sideC[i]]); 
     } 

     for (int i = 0; i < 4; i++) { 
      glVertex3f(xPts[sideD[i]], yPts[sideD[i]], zPts[sideD[i]]); 
     } 
    glEnd(); 
glPopMatrix(); 

이 성공적으로 내가 회전, 스케일, 그리고 문제를 번역 할 수없는 사각형 프러스 텀을 그립니다. 그러나 음영 처리가 해제됩니다. 그것은 밝은 노란색으로되어 있지만 모든면이 균일하게 음영 처리 된 것처럼 보입니다. 내 음영이 내 모든 사랑스러운 모양 모두에서 일반적으로 작동하는 것을 볼 수 있습니다.

내 사각형 절두체의 건물이 완전히 잘못 될 것입니까? 음영을 제대로 적용하려면 어떻게해야합니까?

enter image description here

+1

당신은 꼭지점 법선을주지 않았습니다. –

+0

죄송합니다, 저는 OpenGL을 처음 사용합니다 ... 나는 내가 필요하다는 것을 깨닫지 못했습니다. 어떻게 그 일을합니까? – carmenism

답변

3

은 또한 그렇지 않으면 조명/음영 계산 될 수 없다, glNormal3f를 사용하여 법선을 설정해야합니다. 이러한 경우를 계산하는 가장 쉬운 방법은 여섯 개의 평면 각각에 대해 두 인접 에지의 외적을 계산하는 것입니다. 당신이 손에 약간의 벡터 수학 라이브러리가있는 경우 그래서, 첫 정상의 코드는 이것에 대해 보일 것이다

Vector3f v1(xPts[0], yPts[0], zPts[0]); 
Vector3f v2(xPts[1], yPts[1], zPts[1]); 
Vector3f v3(xPts[2], yPts[2], zPts[2]); 
Vector3f edge1 = v1 - v2; 
Vector3f edge2 = v3 - v2; 
Vector3f normal = edge2.cross(edge1).normalize(); 
glNormal3f(normal.x, normal.y, normal.z); 
for (int i = 0; i < 4; i++) 
    glVertex3f(xPts[i], yPts[i], zPts[i]); 

// ... 

(물론 당신이 여섯 개 개의 폴리곤을 복사하는 대신 함수에이를 데려 가고 싶다는 않습니다. ..)