Exemple #1
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;
}
Exemple #2
0
void Window::init(){
	// load shader
	shader = new Shader("shaders/spotlight.vert", "shaders/spotlight.frag");
	//shader->printLog("shader log:");
	//system("pause");

	/// loading bunny
	Parser::parseObj("bunny.obj", bunny_pos, bunny_nor, bunny_pos_ind, bunny_nor_ind, bunny_min, bunny_max);
	bunny_tran.makeTranslate(-(bunny_min.x + bunny_max.x) / 2,
		-(bunny_min.y + bunny_max.y) / 2, -(bunny_min.z + bunny_max.z) / 2);
	bunny_scale = calculateScalingMatrix(width, height, bunny_min, bunny_max);
	
	/// loading bear
	Parser::parseObj("bear.obj", bear_pos, bear_nor, bear_pos_ind, bear_nor_ind, bear_min, bear_max);
	bear_tran.makeTranslate(-(bear_min.x + bear_max.x) / 2,
		-(bear_min.y + bear_max.y) / 2, -(bear_min.z + bear_max.z) / 2);
	bear_scale = calculateScalingMatrix(width, height, bear_min, bear_max);

	/// loading dragon
	Parser::parseObj("dragon.obj", dragon_pos, dragon_nor, dragon_pos_ind, dragon_nor_ind, dragon_min, dragon_max);
	dragon_tran.makeTranslate(-(dragon_min.x + dragon_max.x) / 2,
		-(dragon_min.y + dragon_max.y) / 2, -(dragon_min.z + dragon_max.z) / 2);
	dragon_scale = calculateScalingMatrix(width, height, dragon_min, dragon_max);


	//setting up light sources
	spotLight.setExponent(1);
	spotLight.setCutOff(5);
	spotLight.setSpotDirection(spot_direction);
	spotLight.setAttenuation(1.0, 0.1, 0.0);

	//setting up material for bunny
	material.setAmbient(m_ambient);
	material.setDiffuse(m_diffuse);
	material.setSpecular(m_specular);
	material.setShininess(shininess);

	//setting up material for bear
	b_material.setAmbient(f4(0.2, 0.6, 0.6, 1.0));
	b_material.setDiffuse(f4(0.5, 0.5, 0.5, 1.0));

	//setting up emissive material for point light
	emissive_ma.setAmbient(f4(0.8, 0.8, 0.8, 1.0));
	emissive_ma.setDiffuse(diffuse);
	emissive_ma.setSpecular(specular);
	emissive_ma.setEmission(f4(0.1,0.1,0.1,1.0));


	
	//building scene graph
	scaling_mt = new MatrixTransform(Matrix4d());
	rotate_mt = new MatrixTransform(Matrix4d());
	bunny = new MatrixTransform(bunny_scale * bunny_tran);
	root->addChild(rotate_mt);
	rotate_mt->addChild(scaling_mt);
	scaling_mt->addChild(bunny);
	bunny->addChild(new ObjNode(&bunny_pos, &bunny_nor, &bunny_pos_ind, &bunny_nor_ind, bunny_min, bunny_max, &material));

	bear = new MatrixTransform(bear_scale * bear_tran);
	bear->addChild(new ObjNode(&bear_pos, &bear_nor, &bear_pos_ind, &bear_nor_ind, bear_min, bear_max, &b_material));

	dragon = new MatrixTransform(dragon_scale * dragon_tran);
	dragon->addChild(new ObjNode(&dragon_pos, &dragon_nor, &dragon_pos_ind, &dragon_nor_ind, dragon_min, dragon_max, &b_material));

	Matrix4d t1;
	t1.makeTranslate(-3.0, -10.0, 2.0);
	pointL = new MatrixTransform(t1);
	root->addChild(pointL);
	pointL->addChild(new Sphere(0.5, 20, 20, Vector3d(1, 1, 1), draw::SOLID, &emissive_ma));

	Vector3d vCone(-3, -10, 0);
	vCone.normalize();
	Vector3d axis = Vector3d(0, 0, -1) * vCone;
	axis.normalize();
	Matrix4d rCone;
	rCone.makeRotate(acos(vCone.dot(Vector3d(0, 0, -1))) * 180 / M_PI, axis);
	Matrix4d t2;
	t2.makeTranslate(3, 10, 0);
	spotL = new MatrixTransform(t2 * rCone);
	root->addChild(spotL);
	Material * m_cone = new Material(f4(0.5, 0.6, 0.9, 1.0), f4(0.5, 0.5, 0.5, 1.0), f4(0, 0, 0, 1.0), 20, f4(0, 0, 0, 1.0), f3(0, 0, 0));
	spotL->addChild(new Cone(0.5, 1, 20, 20, Vector3d(0.0, 0.0, 0.0),draw::SOLID, m_cone));
}