Example #1
0
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 );
        }
    }
}
Example #2
0
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 * 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]);
	    }
	}
}
Example #3
0
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;

}
Example #4
0
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);

			}
		}
	}
}
Example #5
0
void norm(float vec[3])
{
    float c = sqrt(vec[0] * vec[0] + vec[1] * vec[1] + vec[2] * vec[2]);
    scalDiv(vec, c);
}