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를 변형하고 정규화 할 수 있습니까?
예, 정상적으로 얼굴을해야합니다. 얼굴에 의해 정상적인 구현 후, 나는 꼭지점에 의해 정상을해야합니다. 얼굴에 의해 정상적인 나는 따라 코드를 수행합니다 : – Agata