Exemplo n.º 1
0
int main(int argc, char *argv[]) {
  Image *src;
  int i, j;
  float x, y, z;
  Vector N;
  Lighting *l;
  Point p;
  Point V;
  Point lp;
  Color BlueGrey;
  Color Sun;
  Color Cb;
  Color Cs;
  Color c;
  int rows = 500, cols = 500;

	color_set(&BlueGrey, 0.2, 0.25, 0.3);
	color_set(&Sun, 0.9, 0.85, 0.8);
	color_set(&Cb, 0.7, 0.2, 0.1);
	color_set(&Cs, 0.3, 0.3, 0.3);

	point_set(&V, 0.0, 4.0, 0.0, 1.0);
	point_set(&lp, 1.0, 5.0, 1.0, 1.0);

  src = image_create(rows, cols);

  // add an ambient light and a point light, slightly below and to the right of the viewer
  l = lighting_create();
  lighting_add( l, LightAmbient, &BlueGrey, NULL, NULL, 0.0, 0.0 );
  lighting_add( l, LightPoint, &Sun, NULL, &lp, 0.0, 0.0 );

  // for each pixel in the image
  for(i=0;i<rows;i++) {
	  // the z value is defined by the pixel (faux parallel projections)
	  z = -1 + i * (2.0/(rows-1));
	  for(j=0;j<cols;j++) {
		  // the x value is defined by the pixel (faux parallel projection)
		  x = -1 + j * (2.0/(cols-1));
		  y = 1.0 - x*x - z*z;
		  if( y <= 0.0 )
			  continue;

		  y = sqrt(y);

		  // the surface point and normal vector are the same since the sphere is centered on 0
		  p.val[0] = x;
		  p.val[1] = y;
		  p.val[2] = z;
		  vector_set( &N, x, y, z );
		  lighting_shading( l, &N, &V, &p, &Cb, &Cs, 32, 1, &c);
		  image_setColor( src, i, j, c );
	  }
  }
  image_write( src, "test9d.ppm");

  return(0);
}
Exemplo n.º 2
0
int main(int argc, char* argv[]){
	Image* src;
	Module *scene;
	Module* GRAPHICS;
	View3D view;
	Matrix vtm, gtm;
	DrawState *ds;
	Lighting *light;
	Point center;//center of animation
	Polygon poly;//polygon that holds the animation path points
	int frameNum;//holds the frame number for animation
	char filename[100];//holds the frame name
	Color Red;
	Color Blue;
	Color Green;
	Color Grey;
	Color Lemon;
	Color Black;
	Color White;
	Color Yellow;
	Color DarkAmbiant;
	Color randColor[10];


	//setting colors
	Color_set(&Red, 1.0, 0.2, 0.1 );
	Color_set(&Blue, 0.1, 0.1, 1.0);
	Color_set(&Green, 0.1, 1, 0.1 );
	Color_set(&White, 1, 1, 1 );
	Color_set(&Grey, 0.7, 0.7, 0.7 );
	Color_set(&Lemon, 1.0, 1.0, 0.8);
	Color_set(&Black, 0.05, 0.05, 0.05);
	Color_set(&Yellow, 1, 0.894118, 0.709804);
	Color_set(&DarkAmbiant, 0.3, 0.3, 0.3);

	Color_set(&randColor[0], 0, 1, 1);
	Color_set(&randColor[1], 0.498039, 1, 0);
	Color_set(&randColor[2], 1, 0.54902, 0);
	Color_set(&randColor[3], 1, 0.0784314, 0.576471);
	Color_set(&randColor[4], 1, 0.843137, 0);
	Color_set(&randColor[5], 0.960784, 1, 0.980392);
	Color_set(&randColor[6], 1, 0.647059, 0);
	Color_set(&randColor[7], 1, 0.270588, 0);
	Color_set(&randColor[8], 0, 1, 0.498039);
	Color_set(&randColor[9], 1, 1, 0);



	// setting the view
	point_set3D( &(view.vrp), 35, 60, 30 );
	vector_set( &(view.vpn), -view.vrp.val[0]+35, -view.vrp.val[1], -view.vrp.val[2]);
	vector_set( &(view.vup), 0, 1, 0 );
	view.d = 1;
	view.du = 1.6;
	view.dv = 0.9;
	view.f = 1;
	view.b = 200;
	view.screenx = 1280;
	view.screeny = 720;

	matrix_setView3D( &vtm, &view );
	matrix_identity( &gtm );


	//creating GRAPHICS module
	GRAPHICS = module_create();
	module_alphabet_G(GRAPHICS);

	module_identity(GRAPHICS);
	module_translate(GRAPHICS, 10, 0, 0);
	module_alphabet_R(GRAPHICS);

	module_identity(GRAPHICS);
	module_translate(GRAPHICS, 20, 0, 0);
	module_alphabet_A(GRAPHICS);

	module_identity(GRAPHICS);
	module_translate(GRAPHICS, 30, 0, 0);
	module_alphabet_P(GRAPHICS);

	module_identity(GRAPHICS);
	module_translate(GRAPHICS, 40, 0, 0);
	module_alphabet_H(GRAPHICS);

	module_identity(GRAPHICS);
	module_translate(GRAPHICS, 50, 0, 0);
	module_alphabet_I(GRAPHICS);

	module_identity(GRAPHICS);
	module_translate(GRAPHICS, 56, 0, 0);
	module_alphabet_C(GRAPHICS);

	module_identity(GRAPHICS);
	module_translate(GRAPHICS, 68, 0, 0);
	module_alphabet_S(GRAPHICS);


	// setting the light
	light = lighting_create();
	lighting_add( light, LightAmbient, &Lemon, NULL, NULL, 0, 0);
	lighting_add(light, LightPoint, &White , NULL, &view.vrp, 0, 0);
	lighting_add(light, LightSpot, &White, &view.vpn, &view.vrp, cos(10*M_PI/180), 40);

	//setting drawstate
	ds = drawstate_create();
	point_copy(&(ds->viewer), &(view.vrp) );
	ds->shade = ShadePhong;
	// ds->shade = ShadeDepth;
	drawstate_setBody(ds, Black);
	drawstate_setSurface(ds, Red);
	drawstate_setSurfaceCoeff(ds, 10);

	//Animation
	frameNum =0;

	//path #1
	point_set3D(&center, 40, 0, -10);
  	view_rotate_circle(&poly, &center, 100, 50, 0, 0, 0);
  	polygon_print(&poly, stdout);
  	for(int k=0; k<100; k++){
  		frameNum++;
		point_set3D( &(view.vrp), poly.vertex[k].val[0], poly.vertex[k].val[1], poly.vertex[k].val[2]);
		vector_set( &(view.vpn), -view.vrp.val[0], -view.vrp.val[1], -view.vrp.val[2] );
		matrix_setView3D( &vtm, &view );

		//creating scene module
		scene = module_create();
		module_module(scene, GRAPHICS);

		// image
		src = image_create( view.screeny, view.screenx );
		image_fillrgb(src, 1.0, 1.0, 0.8);

		//Drawing
		module_draw( scene, &vtm, &gtm, ds, light, src );
		sprintf(filename, "../images/frame_%.4d.ppm",frameNum);
		image_write( src, filename);
	}

	//path #2
	point_set3D(&center, 40, 0, -10);
  	view_rotate_circle(&poly, &center, 100, 90, 0, 0 , 0);
  	// polygon_print(&poly, stdout);
  	for(int k=0; k<100; k++){
  		if(frameNum == 119){
  			point_print(&view.vrp, stdout);
  			break;
  		}
  		view_rotate_circle(&poly, &center, 50, 50+k, 0-2*k, 0 , 0);
  		frameNum++;
		point_set3D( &(view.vrp), poly.vertex[k].val[0], poly.vertex[k].val[1], poly.vertex[k].val[2]);
		vector_set( &(view.vpn), -view.vrp.val[0], -view.vrp.val[1], -view.vrp.val[2] );
		matrix_setView3D( &vtm, &view );

		//creating scene module
		scene = module_create();
		module_module(scene, GRAPHICS);

		// image
		src = image_create( view.screeny, view.screenx );
		image_fillrgb(src, 1.0, 1.0, 0.8);

		//Drawing
		module_draw( scene, &vtm, &gtm, ds, light, src );
		sprintf(filename, "../images/frame_%.4d.ppm",frameNum);
		image_write( src, filename);
	}

	//path #3
	for(int k=0; k<120; k++){

  		frameNum++;
  		if(frameNum <= 160){
			point_set3D( &(view.vrp), -3.345+(k), 36.298+(k), 28.391-(k/2.0));
			vector_set( &(view.vpn), -view.vrp.val[0]+k, -view.vrp.val[1], -view.vrp.val[2]);
			matrix_setView3D( &vtm, &view );
		}

		//creating scene module
		scene = module_create();
		module_module(scene, GRAPHICS);

		if(frameNum == 160){
			light = lighting_create();
			lighting_add( light, LightAmbient, &Grey, NULL, NULL, 0, 0);
		}
		// setting the light
		if(frameNum == 165){
			Point plight1;
			point_set3D(&plight1, -5, 10, -10);

			lighting_add(light, LightSpot, &White, &view.vpn, &plight1, cos(10*M_PI/180), 40);
		}
		if(frameNum == 175){
			Point plight2;
			point_set3D(&plight2, 85, 10, -10);

			lighting_add(light, LightSpot, &White, &view.vpn, &plight2, cos(10*M_PI/180), 40);
		}
		if(frameNum == 180){
			lighting_add(light, LightSpot, &White, &view.vpn, &view.vrp, cos(10*M_PI/180), 40);
		}

		if(frameNum >= 183){
			light = lighting_create();
			lighting_add( light, LightAmbient, &Grey, NULL, NULL, 0, 0);

			int output1 = 0 + (rand() % (int)(10 - 0 + 1));
			int output2 = 0 + (rand() % (int)(10 - 0 + 1));
			int output3 = 0 + (rand() % (int)(10 - 0 + 1));

			Point plight1;
			point_set3D(&plight1, -5, 10, -10);
			lighting_add(light, LightSpot, &randColor[output1], &view.vpn, &plight1, cos(10*M_PI/180), 40);

			Point plight2;
			point_set3D(&plight2, 85, 10, -10);
			lighting_add(light, LightSpot, &randColor[output2], &view.vpn, &plight2, cos(10*M_PI/180), 40);

			lighting_add(light, LightSpot, &randColor[output3], &view.vpn, &view.vrp, cos(10*M_PI/180), 40);
		}
		// image
		src = image_create( view.screeny, view.screenx );
		image_fillrgb(src, 1.0, 1.0, 0.8);

		//setting drawstate
		ds = drawstate_create();
		point_copy(&(ds->viewer), &(view.vrp) );
		ds->shade = ShadePhong;
		// ds->shade = ShadeDepth;
		drawstate_setBody(ds, Black);
		drawstate_setSurface(ds, Red);
		drawstate_setSurfaceCoeff(ds, 10);

		//Drawing
		module_draw( scene, &vtm, &gtm, ds, light, src );
		sprintf(filename, "../images/frame_%.4d.ppm",frameNum);
		image_write( src, filename);
	}

	//***Uncomment for making the .gif animation***
	printf("Making the demo.gif file....\n");
	system("convert -delay 10 ../images/frame_*.ppm ../images/demo.gif");
	printf("Cleaning up...\n");
	system("rm -f ../images/frame_*.ppm");
	printf("Finished Successfully :)\n");
	return(0);
}