2012-08-27 8 views
1

OPENGL 프로젝트의 조명에 문제가 있습니다. ECLIPSE를 사용하여 C++에서 프로그래밍합니다. 트라이앵글 스트립으로 해석되는 테레 인이 있습니다. 내 렌더링의 코드는 다음과 같습니다어떻게 삼각형 스트립에서 NORMAL을 계산합니까?

HeightMap::~HeightMap(void) { 
} 

float HeightMap::getScaledGrayColor(double height) { 
float fColor = NULL; 
if (height == this->NODATA_value) { 
    return 0.0f; 
} 
fColor = ((255.00f/max) * height)/255.00f; 

return fColor; 
} 
double* HeightMap::getHeights(int rowNumber) { 
rowNumber = rowNumber + 6; 

ifstream fin(this->filename); 
string s; 
long length; 

fin.seekg(0, ios::beg); // go to the first line 

for (int i = 0; i < rowNumber; i++) { // loop 'till the desired line 
    getline(fin, s); 
} 

string nextToken; 
getline(fin, nextToken); 
StringUtils stringUtils; 
vector<string> tempVec = stringUtils.split(nextToken, " "); 
double* heights = new double[this->ncols]; 
for (int i = 0; i < tempVec.size() - 1; i++) { 
    heights[i] = strtod(tempVec[i].c_str(), NULL); 
} 
return heights; 
} 


void HeightMap::Render(void) 
{ 
int x = 0; 
int i = 0; 
for (int i = 0, j = 0; j < nrows; i--, j++) { 
    //cout<<"valore di i è: "<<i<<endl; 
    //cout<<"valore di j è: "<<j<<endl; 
    double * rowHeights = this->getHeights(j);// 
    for (int x = 0; x < ncols; x++) { 

     float color = getScaledGrayColor(rowHeights[x]); 
     double * Quote = this->getHeights(x); 
     glBegin(GL_TRIANGLE_STRIP); 
     glColor3f(color, color, color); 

     //triangolo ABC 
     //glNormal3f((x * cellsize), (i * cellsize), 0); 
     glVertex3f((x * cellsize), (i * cellsize), 0); //vertice base 
     //glNormal3f((x * cellsize), ((i * cellsize) + cellsize), 0); 
     glVertex3f((x * cellsize), ((i * cellsize) + cellsize), 
0);//vertice base 
     //glNormal3f(((x * cellsize) + (cellsize/2)), ((i * cellsize)+ 
(cellsize/2)), *Quote);//vertice altezza 
     glVertex3f(((x * cellsize) + (cellsize/2)), ((i * cellsize) 
       + (cellsize/2)), *Quote);//vertice altezza 


     //triangolo DEF 
     //glNormal3f((x * cellsize), (i * cellsize) + cellsize, 0); 
     glVertex3f((x * cellsize), (i * cellsize) + cellsize, 0); 
//vertice base 
     //glNormal3f((x * cellsize) + cellsize, (i * cellsize) + cellsize, 
0);//vertice base 
     glVertex3f((x * cellsize) + cellsize, (i * cellsize) + cellsize, 
0);//vertice base 
     //glNormal3f(((x * cellsize) + (cellsize/2)), ((i * cellsize)+ 
(cellsize/2)), *Quote);//vertice altezza 
     glVertex3f(((x * cellsize) + (cellsize/2)), ((i * cellsize) 
          + (cellsize/2)), 
*Quote);//vertice altezza 

     //triangolo GHI 
     //glNormal3f((x * cellsize) + cellsize, (i * cellsize) + cellsize, 
0); //vertice base 
     glVertex3f((x * cellsize) + cellsize, (i * cellsize) + cellsize, 
0); //vertice base 
     //glNormal3f((x * cellsize) + cellsize, i * cellsize, 0);//vertice 
base 
     glVertex3f((x * cellsize) + cellsize, i * cellsize, 0);//vertice 
base 
     //glNormal3f(((x * cellsize) + (cellsize/2)), ((i * cellsize)+ 
(cellsize/2)), *Quote);//vertice altezza 
     glVertex3f(((x * cellsize) + (cellsize/2)), ((i * cellsize) 
          + (cellsize/2)), 
*Quote);//vertice altezza 

     //triangolo LMN 
     //glNormal3f((x * cellsize), (i * cellsize), 0); //vertice base 
     glVertex3f((x * cellsize), (i * cellsize), 0); //vertice base 
     //glNormal3f((x * cellsize) + cellsize, (i * cellsize), 
0);//vertice base 
     glVertex3f((x * cellsize) + cellsize, (i * cellsize), 0);//vertice 
base 
     //glNormal3f(((x * cellsize) + (cellsize/2)), ((i * cellsize)+ 
(cellsize/2)), *Quote);//vertice altezza 
     glVertex3f(((x * cellsize) + (cellsize/2)), ((i * cellsize) 
          + (cellsize/2)), 
*Quote);//vertice altezza 
     glEnd(); 
     } 
    //} 
} 

} 

내가 정점 정상을 사용하려고하지만 난 glnormal 함수의 인수를 계산하는 방법을 모르겠어요. 그렇다면 얼굴에는 보통을 사용해야합니다. 이 문제를 해결해 줄 수 있습니까?


예 내가 정점 정상해야 할면에 의해 전후 통상 필요

:이 보이드 하이트 :: 렌더링 (공극) { INT 할 얼굴 정상 위해 X = 0; int i = 0; glPushMatrix(); glRotatef (각도, xrot, yrot, zrot); // 객체 회전 cout < < "valore di nrows è :"< getHeights (j); float vectorba [3] = {0.0,0.0,0.0}; float vectorcb [3] = {0.0,0.0,0.0}; float xnormal = 0.0; float ynormal = 0.0; float znormal = 0.0; float len ​​= 0.0;

for (int x = 0; x < ncols; x++) { 
     //if (rowHeights[x] != this->NODATA_value) { 
     float color = getScaledGrayColor(rowHeights[x]); 
     double * Quote = this->getHeights(x); 
     glBegin(GL_TRIANGLE_STRIP); 
     glColor3f(color, color, color); 
     //triangolo ABC 

     //inizio normal 
     vectorba[0]={(x * cellsize)-(x * cellsize)}; 
     vectorba[1]={((i * cellsize) + cellsize)-(i * cellsize)}; 
     vectorcb[0]={((x * cellsize) + (cellsize/2))-(x * cellsize)}; 
     vectorcb[1]={((i * cellsize) + (cellsize/2))-((i * cellsize)  +cellsize)}; 
     vectorcb[2]=*Quote; 
     // calculate the cross product and place the resulting vector 
     // into the variable xnormal,ynormal e znormal 
     xnormal = (vectorba[1] * vectorcb[2]) - (vectorba[2] *  vectorcb[1]); 
     ynormal = (vectorba[2] * vectorcb[0]) - (vectorba[0] * vectorcb[2]); 
     znormal = (vectorba[0] * vectorcb[1]) - (vectorba[1] * vectorcb[0]); 
     //fine normal 

     //inizio normalize 
     // calculate the length of the vector 
      len = (float)(sqrt((xnormal * xnormal) + (ynormal * ynormal) + (znormal * znormal))); 

      // avoid division by 0 
      if (len == 0.0f) 
       len = 1.0f; 

      // reduce to unit size 
      xnormal /= len; 
      ynormal /= len; 
      znormal /= len; 
      //fine normalize 

     //glNormal3f((x * cellsize), (i * cellsize), 0); //normal per vertex. controllare la formula 
     glVertex3f((x * cellsize), (i * cellsize), 0); //vertice base A 
     //glNormal3f((x * cellsize), ((i * cellsize) + cellsize), 0); 
     glVertex3f((x * cellsize), ((i * cellsize) + cellsize), 0);//vertice base B 

     glNormal3f(xnormal, ynormal, znormal); //normal per face 

     //glNormal3f(((x * cellsize) + (cellsize/2)), ((i * cellsize)+ (cellsize/2)), *Quote);//vertice altezza 
     glVertex3f(((x * cellsize) + (cellsize/2)), ((i * cellsize) 
       + (cellsize/2)), *Quote);//vertice altezza C 


     //triangolo DEF 

     //inizio normal 
     vectorba[0]={(x * cellsize) + cellsize-(x * cellsize)}; 
     vectorba[1]={((i * cellsize) + cellsize)-((i * cellsize) + cellsize)}; 
     vectorcb[0]={((x * cellsize) + (cellsize/2))-(x * cellsize) + cellsize}; 
     vectorcb[1]={((i * cellsize)+ (cellsize/2))-((i * cellsize) + cellsize)}; 
     vectorcb[2]=*Quote; 
     // calculate the cross product and place the resulting vector 
     // into the variable xnormal,ynormal e znormal 
     xnormal = (vectorba[1] * vectorcb[2]) - (vectorba[2] * vectorcb[1]); 
     ynormal = (vectorba[2] * vectorcb[0]) - (vectorba[0] * vectorcb[2]); 
     znormal = (vectorba[0] * vectorcb[1]) - (vectorba[1] * vectorcb[0]); 
     //fine normal 

     //inizio normalize 
     // calculate the length of the vector 
     len = (float)(sqrt((xnormal * xnormal) + (ynormal * ynormal) + (znormal * znormal))); 

     // avoid division by 0 
     if (len == 0.0f) 
      len = 1.0f; 

     // reduce to unit size 
     xnormal /= len; 
     ynormal /= len; 
     znormal /= len; 
     //fine normalize 

     //glNormal3f((x * cellsize), (i * cellsize) + cellsize, 0); 
     glVertex3f((x * cellsize), (i * cellsize) + cellsize, 0); //vertice base D 
     //glNormal3f((x * cellsize) + cellsize, (i * cellsize) + cellsize, 0);//vertice base 
     glVertex3f((x * cellsize) + cellsize, (i * cellsize) + cellsize, 0);//vertice base E 

     glNormal3f(xnormal, ynormal, znormal); //normal per face 

     //glNormal3f(((x * cellsize) + (cellsize/2)), ((i * cellsize)+ (cellsize/2)), *Quote);//vertice altezza 
     glVertex3f(((x * cellsize) + (cellsize/2)), ((i * cellsize)+ (cellsize/2)), *Quote);//vertice altezza F 

     //triangolo GHI 

     //inizio normal 
     vectorba[0]={(x * cellsize) + cellsize-(x * cellsize) + cellsize}; 
     vectorba[1]={i * cellsize-(i * cellsize) + cellsize}; 
     vectorcb[0]={((x * cellsize) + (cellsize/2))-(x * cellsize) + cellsize}; 
     vectorcb[1]={((i * cellsize)+ (cellsize/2))-(i * cellsize)}; 
     vectorcb[2]=*Quote; 
     // calculate the cross product and place the resulting vector 
     // into the variable xnormal,ynormal e znormal 
     xnormal = (vectorba[1] * vectorcb[2]) - (vectorba[2] * vectorcb[1]); 
     ynormal = (vectorba[2] * vectorcb[0]) - (vectorba[0] * vectorcb[2]); 
     znormal = (vectorba[0] * vectorcb[1]) - (vectorba[1] * vectorcb[0]); 
     //fine normal 

     //inizio normalize 
     // calculate the length of the vector 
     len = (float)(sqrt((xnormal * xnormal) + (ynormal * ynormal) + (znormal * znormal))); 
     // avoid division by 0 
     if (len == 0.0f) 
      len = 1.0f; 

     // reduce to unit size 
     xnormal /= len; 
     ynormal /= len; 
     znormal /= len; 
     //fine normalize 

     //glNormal3f((x * cellsize) + cellsize, (i * cellsize) + cellsize, 0); //vertice base 
     glVertex3f((x * cellsize) + cellsize, (i * cellsize) + cellsize, 0); //vertice base G 
     //glNormal3f((x * cellsize) + cellsize, i * cellsize, 0);//vertice base 
     glVertex3f((x * cellsize) + cellsize, i * cellsize, 0);//vertice base H 

     glNormal3f(xnormal, ynormal, znormal); //normal per face 

     //glNormal3f(((x * cellsize) + (cellsize/2)), ((i * cellsize)+ (cellsize/2)), *Quote);//vertice altezza 
     glVertex3f(((x * cellsize) + (cellsize/2)), ((i * cellsize)+ (cellsize/2)), *Quote);//vertice altezza I 

     //triangolo LMN 

     //inizio normal 
     vectorba[0]={(x * cellsize) + cellsize-(x * cellsize)}; 
     vectorba[1]={(i * cellsize)-(i * cellsize)}; 
     vectorcb[0]={((x * cellsize) + (cellsize/2))-(x * cellsize) + cellsize}; 
     vectorcb[1]={((i * cellsize)+ (cellsize/2))-(i * cellsize)}; 
     vectorcb[2]=*Quote; 
     // calculate the cross product and place the resulting vector 
     // into the variable xnormal,ynormal e znormal 
     xnormal = (vectorba[1] * vectorcb[2]) - (vectorba[2] * vectorcb[1]); 
     ynormal = (vectorba[2] * vectorcb[0]) - (vectorba[0] * vectorcb[2]); 
     znormal = (vectorba[0] * vectorcb[1]) - (vectorba[1] * vectorcb[0]); 
     //fine normal 

     //inizio normalize 
     // calculate the length of the vector 
     len = (float)(sqrt((xnormal * xnormal) + (ynormal * ynormal) + (znormal * znormal))); 
     // avoid division by 0 
     if (len == 0.0f) 
      len = 1.0f; 
     // reduce to unit size 
     xnormal /= len; 
     ynormal /= len; 
     znormal /= len; 
     //fine normalize 

     //glNormal3f((x * cellsize), (i * cellsize), 0); //vertice base 
     glVertex3f((x * cellsize), (i * cellsize), 0); //vertice base L 
     //glNormal3f((x * cellsize) + cellsize, (i * cellsize), 0);//vertice base 
     glVertex3f((x * cellsize) + cellsize, (i * cellsize), 0);//vertice base M 

     glNormal3f(xnormal, ynormal, znormal); //normal per face 

     //glNormal3f(((x * cellsize) + (cellsize/2)), ((i * cellsize)+ (cellsize/2)), *Quote);//vertice altezza 
     glVertex3f(((x * cellsize) + (cellsize/2)), ((i * cellsize)+  (cellsize/2)), *Quote);//vertice altezza N 
     glEnd(); 
     } 
    //} 
} 
glPopMatrix(); 
} 

제형이 맞습니까? 어떻게 함수를 사용하여 Render를 변형하고 정규화 할 수 있습니까?

답변

2

내가 이해한다면 얼굴로 평범한 것을 원하십니까?

삼각형 점이있는 경우 각면의 법선을 계산할 수 있습니다.

이것 좀 봐 : 정점에 의해

http://www.opengl.org/wiki/Calculating_a_Surface_Normal

정상은 얼굴 사이의 평균 법선을 고려하여 계산 될 수있다.

+0

예, 정상적으로 얼굴을해야합니다. 얼굴에 의해 정상적인 구현 후, 나는 꼭지점에 의해 정상을해야합니다. 얼굴에 의해 정상적인 나는 따라 코드를 수행합니다 : – Agata