void getFaceNormSegs(void) { float center0[3], center1[3], normSeg0[3], normSeg1[3]; float geom0[3], geom1[3], geom2[3], geom3[3]; for (i = 0; i < grid - 1; ++i) { for (j = 0; j < grid - 1; ++j) { geom0[0] = i; geom0[1] = j; geom0[2] = posit[i][j]; geom1[0] = i; geom1[1] = j+1; geom1[2] = posit[i][j+1]; geom2[0] = i+1; geom2[1] = j; geom2[2] = posit[i+1][j]; geom3[0] = i+1; geom3[1] = j+1; geom3[2] = posit[i+1][j+1]; /* find center of triangle face by averaging three vertices */ add( center0, geom2, geom0 ); add( center0, center0, geom1 ); scalDiv( center0, 3.0 ); add( center1, geom2, geom1 ); add( center1, center1, geom3 ); scalDiv( center1, 3.0 ); /* translate normal to center of triangle face to get normal segment */ add( normSeg0, center0, faceNorms[0][i][j] ); add( normSeg1, center1, faceNorms[1][i][j] ); copy( faceNormSegs[0][0][i][j], center0 ); copy( faceNormSegs[1][0][i][j], center1 ); copy( faceNormSegs[0][1][i][j], normSeg0 ); copy( faceNormSegs[1][1][i][j], normSeg1 ); } } }
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * getFaceNormSegs: * * Initialize FaceNormSegs[0|1][0|1][i][j] with vertex normals. * The first index refers to the face number. * The second index refers to the face center (0) or face normal (1). */ void getFaceNormSegs(void) { int i, j; float center0[3], center1[3]; float geom0 [3], geom1 [3], geom2 [3], geom3 [3]; for(i=0; i<Grid-1; i++) { for(j=0; j<Grid-1; j++) { /* init vectors from geometry points */ geom0[0] = i; geom0[1] = j; geom0[2] = Posit[i][j]; geom1[0] = i; geom1[1] = j+1; geom1[2] = Posit[i][j+1]; geom2[0] = i+1; geom2[1] = j; geom2[2] = Posit[i+1][j]; geom3[0] = i+1; geom3[1] = j+1; geom3[2] = Posit[i+1][j+1]; /* center0 <- center of triangle face 0; avg three vertices */ add(center0, geom2, geom0); add(center0, center0, geom1); scalDiv(center0, 3.0); /* center1 <- center of triangle face 1; avg three vertices */ add(center1, geom2, geom1); add(center1, center1, geom3); scalDiv(center1, 3.0); /* translate normal to center of face to get normal segment; * FaceNormSegs[0 or 1][0][i][j] <- center of face 0 or 1 * FaceNormSegs[0 or 1][1][i][j] <- translated face norm */ copy(FaceNormSegs[0][0][i][j], center0); copy(FaceNormSegs[1][0][i][j], center1); add (FaceNormSegs[0][1][i][j], center0, FaceNorms[0][i][j]); add (FaceNormSegs[1][1][i][j], center1, FaceNorms[1][i][j]); } } }
void calcul(int xx,int yy) { if ((xx==0)&&(yy==0)) MakeNorm(); sub(cameraray,camera,a_points[xx][yy]); normz(cameraray); rray[0]=norm[xx][yy][0]*coeff+cameraray[0]; rray[1]=norm[xx][yy][1]*coeff+cameraray[1]; rray[2]=norm[xx][yy][2]*coeff+cameraray[2]; scalDiv(rray,-1); normz(rray); GLfloat depth=gendep+a_points[xx][yy][2]; GLfloat t=depth/rray[2]; GLfloat mapx=a_points[xx][yy][0]+rray[0]*t; GLfloat mapz=a_points[xx][yy][1]+rray[1]*t; newcoord[xx][yy][0]=-(mapx-a_points[0][0][0])/25.6; newcoord[xx][yy][1]=(mapz-a_points[size][size][1])/25.6; }
void getVertNorms(void) { float sum[3] = {0.0, 0.0, 0.0}; int i, j; for(i=0; i<Grid; i++) { for(j=0; j<Grid; j++) { // There are 8 edge cases if( i == 0 && j == 0 ){ // Bottom left } else if (i == 0 && j == (Grid - 1)){ // Top left } else if (i == (Grid - 1) && j == (Grid - 1)){ // Top Right } else if (i == (Grid - 1) && j == 0){ // Bottom Right } else if (i == 0){ // Left Only } else if (i == (Grid - 1)){ // Right Only } else if (j == 0){ // Bottom Only } else if (j == (Grid - 1)){ // Top Only } else { setVertNorms(sum, i, j, i - 1, j + 1, i, j - 1); setVertNorms(sum, i, j, i, j - 1, i + 1, j + 1); setVertNorms(sum, i, j, i + 1, j + 1, i + 1, j); setVertNorms(sum, i, j, i + 1, j, i + 1, j - 1); setVertNorms(sum, i, j, i + 1, j - 1, i, j - 1); setVertNorms(sum, i, j, i, j - 1, i - 1, j - 1); setVertNorms(sum, i, j, i - 1, j - 1, i - 1, j); setVertNorms(sum, i, j, i - 1, j, i - 1, j + 1); // Average scalDiv(sum, sqrt(sum[0]*sum[0] + sum[1]*sum[1] + sum[2]*sum[2])); set(sum, -sum[0], -sum[1], -sum[2]); // Now, set the vertnorms copy(vertNorms[i][j], sum); } } } }
void norm(float vec[3]) { float c = sqrt(vec[0] * vec[0] + vec[1] * vec[1] + vec[2] * vec[2]); scalDiv(vec, c); }