예제 #1
0
// Called whenever the window size changes
void Window::reshapeCallback(int new_width, int new_height)
{
	width = new_width;
	height = new_height;
	limit = width * height * 3 - 2;
	delete[] pixels;
	delete[] zbuffer;
	pixels = new float[width * height * 3];
	zbuffer = new float[(width + 1) * (height + 1)];
	viewport = Projection::viewport(0, 0, width, height);
	viewport.print("view port");
	projection = Projection::perspective(60, double(width) / double(height), 1.0, 1000.0);
	projection.print("projection");
	//Matrix4d t;
	//t.makeTranslate(0, 0, -20);
	//projection = projection * t;


	// calculate scaling matrix for bunny
	double x = (bunny_xmax - bunny_xmin) / 2;
	double y = (bunny_ymax - bunny_ymin) / 2;
	double z = (bunny_zmax - bunny_zmin) / 2;

	double a = z / y;
	double ymax = 20 / (a + 1 / tan(30 * M_PI / 180));
	double sy = ymax / y;					// scaling factor according to y

	double xmax = ymax * (double)width / (double)height; //scaling factor according to x
	double sx = xmax / x;

	double min = sy < sx ? sy : sx;
	scale_bunny.makeScale(min, min, min);

	// calculate scaling matrix for dragon
	x = (dragon_xmax - dragon_xmin) / 2;
	y = (dragon_ymax - dragon_ymin) / 2;
	z = (dragon_zmax - dragon_zmin) / 2;

	a = z / y;
	ymax = 20 / (a + 1 / tan(30 * M_PI / 180));
	xmax = ymax * (double)width / (double)height;
	sy = ymax / y;
	sx = xmax / x;
	min = sy < sx ? sy : sx;
	scale_dragon.makeScale(min, min, min);
	//scale_dragon.print("scaling matrix for dragon:");

}
예제 #2
0
void Window::keyboardCallback(unsigned char key, int, int)
{
	switch (key){
	case '1':
		bunny = true;
		break;
	case '2':
		bunny = false;
		break;
	case 's':
		temp.makeScale(0.9, 0.9, 0.9);
		scaling.multiply(temp);
		break;
	case 'S':
		temp.makeScale(1.1, 1.1, 1.1);
		scaling.multiply(temp);
		break;
	case 27:
		exit(0);
	}
}
예제 #3
0
void Window::mouseMotionProcess(int x, int y){
	Vector3d direction;
	double pixel_diff;
	double rot_angle, zoom_factor;
	Vector3d curPoint;
	curPoint = trackBallMapping(x, y);
	switch (movement){
	case control::ROTATION:
	{
		if (!lightControl){
			direction = curPoint - lastPoint;
			double velocity = direction.magnitude();
			if (velocity > 0.0001){
				Vector3d rotAxis = lastPoint * curPoint;
				rotAxis.normalize();
				rot_angle = velocity * ROTSCALE;
				Matrix4d r;
				r.makeRotate(rot_angle, rotAxis);
				rotation = r * rotation;
				rotate_mt->setMatrix(rotation);
			}
		}
	}
	break;
	case control::SCALING:
	{
		pixel_diff = curPoint[1] - lastPoint[1];
		zoom_factor = 1.0 + pixel_diff * ZOOMSCALE;
		if (!lightControl){
			Matrix4d s;
			s.makeScale(zoom_factor, zoom_factor, zoom_factor);
			scaling = scaling * s;
			scaling_mt->setMatrix(scaling);
			displayCallback();
		}
		else{
			spotLight.setCutOff(spotLight.getCutOff() * zoom_factor);
		}
		
	}
		break;
	}
	lastPoint = curPoint;
}
예제 #4
0
Matrix4d Window::calculateScalingMatrix(int w, int h, Coordinate3d min, Coordinate3d max){
	double x = (max.x - min.x) / 2;
	double y = (max.y - min.y) / 2;
	double z = (max.z - min.z) / 2;

	//cout << "x : " << x << " y : " << y << " z : " << z << endl;

	double a = z / y;
	double ymax = 20 / (a + 1 / tan(30 * M_PI / 180));
	double sy = ymax / y;

	double xmax = ymax * double(w) / double(h);
	double sx = xmax / x;

	double factor = sy < sx ? sy : sx;
	Matrix4d s;
	s.makeScale(factor, factor, factor);
	return s;
}
void BuildingConstructor::construct() {
	GLdouble currentMaxH = maxH;
	GLdouble currentMinH = minH;
	GLdouble xTranslation = ((double) rand() * 0.5) / (double) RAND_MAX;
	GLdouble zTranslation = ((double) rand() * 0.5) / (double) RAND_MAX;
	GLdouble xScaling = 2.0;
	GLdouble zScaling = 2.0;
	GLdouble rotationAngle = 90.0;
	GLdouble lotBias = 0.02;
	Matrix4d translation;
	Matrix4d scaling;
	Matrix4d rotation;
	Matrix4d rotation90;
	Building* building = NULL;
	
	GLdouble scaleMax = 0.90;
	GLdouble scaleMin = 0.5;
	double colorH = 1.0;
	double colorL = 0.90;
	double r = (double) rand() * (colorH + 1.0 - colorL) / (double) RAND_MAX + colorL;
	double g = (double) rand() * (colorH + 1.0 - colorL) / (double) RAND_MAX + colorL;
	double b = (double) rand() * (colorH + 1.0 - colorL) / (double) RAND_MAX + colorL;

	GLuint buildingChoice = rand() * (3 + 1) / RAND_MAX;
	GLuint roofChoice = rand() * (5 - 4 + 1) / RAND_MAX + 4;

	std::cerr << "buildingChoice: " << buildingChoice << "  roofChoice: " << roofChoice << std::endl;

	rotation.identity();
	rotation90.makeRotateY(rotationAngle);

	switch (choice) {
		// medium buildings
		case 0:
			while (buildingChoice == 1) {
				buildingChoice = rand() * (3 + 1) / RAND_MAX;
			}
			std::cerr << "hhhh" << std::endl;
			xScaling = (double) rand() * (3.0 + 1.0 - 2.0) / (double) RAND_MAX + 2.0;
			zScaling = (double) rand() * (3.0 + 1.0 - 2.0) / (double) RAND_MAX + 2.0;
			translation.makeTranslate(xTranslation, 0.0, zTranslation);
			scaling.makeScale(xScaling, currentMaxH, zScaling);
			building = new Building(buildingChoice, roofChoice, r, g, b, texture, xScaling, currentMaxH, zScaling, translation * scaling);
			root->addChild(building->getRoot());
			break;
		// mid towards out buildings
		case 1:
			buildingChoice = rand() * (3 + 1 - 1) / RAND_MAX + 1;
			xScaling = zScaling = (double) rand() * (1.0 + 1.0 - 0.5) / (double) RAND_MAX + 0.5;

			for (int count = 0; count < layerCount - 1; ++count) {
				currentMaxH -= ((double) rand() * (scaleMax - scaleMin)) / (double) RAND_MAX + scaleMin;;

				xScaling += 0.3;
				zScaling += 0.3;

				if (xScaling > 3.0 || zScaling > 3.0) {
					break;
				}
				// std::cerr << "zScaling: " << zScaling << std::endl;
				scaling.makeScale(xScaling, currentMaxH, zScaling);

				building = new Building(buildingChoice, roofChoice, r, g, b, texture, xScaling, currentMaxH, zScaling, scaling);
				root->addChild(building->getRoot());
			}
			break;
		// tall buildings with rotation
		case 2:
			scaling.makeScale(3.0, 1.0, 3.0);
			buildingChoice = rand() * (3 + 1 - 1) / RAND_MAX + 1;
			building = new Building(buildingChoice, roofChoice, r, g, b, texture, 3.0, 1.0, 3.0, scaling);
			root->addChild(building->getRoot());


			translation.makeTranslate(xTranslation, 0.0, zTranslation);
			scaling.makeScale(xScaling, currentMaxH, zScaling);
			building = new Building(buildingChoice, roofChoice, r, g, b, texture, xScaling, currentMaxH, zScaling, translation * scaling);
			root->addChild(building->getRoot());

			//t s m
			xTranslation = 0.5 - lotBias;
			zTranslation = 0.0;
			zScaling = ((double) rand() * (currentMaxH - currentMinH)) / (double) RAND_MAX + currentMinH;

			for (int count = 0; count < layerCount - 1; ++count) {
				currentMaxH -= ((double) rand() * (scaleMax - scaleMin)) / (double) RAND_MAX + scaleMin;;
				rotation = rotation90 * rotation;

				zScaling = ((double) rand() * (scaleMax - scaleMin)) / (double) RAND_MAX + scaleMin;
				// std::cerr << "zScaling: " << zScaling << std::endl;
				scaling.makeScale(xScaling, currentMaxH, zScaling);

				translation.makeTranslate(xTranslation, 0.0, 0.0);

				building = new Building(buildingChoice, roofChoice, r, g, b, texture, xScaling, currentMaxH, zScaling, rotation * translation * scaling);
				root->addChild(building->getRoot());
			}
			break;
		default:
			break;
	}
}