Esempio n. 1
0
void drawGrid()
{
	if (!grid)
	{
		grid = new Mesh();
		grid->createGrid(10);
	}

	glLineWidth(1);
	glEnable(GL_BLEND);
	glDepthMask(false);
	glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
	Shader* grid_shader = Shader::getDefaultShader("grid");
	grid_shader->enable();
	Matrix44 m;
	m.translate(floor(Camera::last_enabled->eye.x / 100.0)*100.0f, 0.0f, floor(Camera::last_enabled->eye.z / 100.0f)*100.0f);
	grid_shader->setUniform("u_color", Vector4(0.7, 0.7, 0.7, 0.7));
	grid_shader->setUniform("u_model", m);
	grid_shader->setUniform("u_camera_position", Camera::last_enabled->eye);
	grid_shader->setUniform("u_viewprojection", Camera::last_enabled->viewprojection_matrix);
	grid->render(GL_LINES); //background grid
	glDisable(GL_BLEND);
	glDepthMask(true);
	grid_shader->disable();
}
Esempio n. 2
0
		Matrix44 Transform::toMatrix() {
			Matrix44 m;
			m.translate(position.getX(), position.getY(), position.getZ());
    		m *= rotation.toMatrix();
    		m.scale(scale.getX(), scale.getY(), scale.getZ());
    		return m;
		}
Esempio n. 3
0
void State::recalculate()
{
	velocity = momentum * inverseMass;
	angularVelocity = inverseInertiaTensor * angularMomentum;
	orientation.normalize();
	float4 fspin;
	fspin.xyz = angularVelocity.vec;
	fspin.w = 0.f;
	spin = .5f * Quaternion(fspin) * orientation;
	Matrix44 translation; translation.translate(position);
	bodyToWorld = translation * orientation.matrix();
	worldToBody = bodyToWorld.inverse();
}
Esempio n. 4
0
Matrix44 Camera::get_perspective_matrix() const
{
    Matrix44 perspective;
    perspective.translate(-position_);
    perspective.rotate_zx(angle_.y);
    perspective.rotate_yz(angle_.x);
    perspective.rotate_xy(angle_.z);
    perspective.perspective(    angle_of_view_,
                                width_,
                                height_,
                                near_clip_,
                                far_clip_);
    return perspective;
}
Esempio n. 5
0
void BoidsApp::setup()
{	
	Rand::randomize();
	//setFullScreen(true);
	shouldBeFullscreen = false;
	
	mCenter				= Vec3f( getWindowWidth() * 0.5f, getWindowHeight() * 0.5f, 0.0f );
	mSaveFrames			= false;
	mIsRenderingPrint	= false;
	changeInterval		= 15.0;
	time(&lastChange);
	gravity				= false;
	
	// SETUP CAMERA
	mCameraDistance		= 350.0f;
	mEye				= Vec3f( 0.0f, 0.0f, mCameraDistance );
	mCenter				= Vec3f::zero();
	mUp					= Vec3f::yAxis();
	mCam.setPerspective( 75.0f, getWindowAspectRatio(), 5.0f, 5000.0f );
	lastFrameTime		= getElapsedSeconds();
	deltaT				= 0;
	newFlock			= 0;
	
	mParticleTexture	= gl::Texture( loadImage( loadResource( RES_PARTICLE ) ) );
	
	
	// Initialize the OpenCV input (Below added RS 2010-11-15)
	try {
		//ci::Device device = Capture.
		std::vector<boost::shared_ptr<Capture::Device> > devices = Capture::getDevices();
		
		std::cout << "Capture Devices:" << std::endl;
		std::vector<boost::shared_ptr<Capture::Device> >::iterator device_iterator;
		//for(device_iterator=devices.begin(); device_iterator!=devices.end(); device_iterator++)
		for(int i=0; i<devices.size();i++)
		{
			console() << "device " << i << ": " << devices[i]->getName() << std::endl;
			
		}
		
		//UNCOMMENT FOLLOWING LINE FOR BUILT-IN CAMERA
		//capture = Capture(320,240);
		
		//UNCOMMENT FOLLOWING LINE FOR UNIBRAIN OR WHATEVER
		capture = Capture(320,240,devices[0]);//,devices[0]);	//FIXME this is a dumb way to select a device
		
		capture.start();
		silhouetteDetector = new SilhouetteDetector(320,240);
	} catch ( ... ) {
		console() << "Failed to initialize capture device" << std::endl;
	}
	cvThreshholdLevel = 45;		
	// CREATE PARTICLE CONTROLLER
	flock_one.addBoids( NUM_INITIAL_PARTICLES );
	flock_two.addBoids( NUM_INITIAL_PARTICLES );
	flock_one.setColor(ColorA( CM_RGB, 0.784, 0.0, 0.714, 1.0));
	flock_one.silRepelStrength = -0.50f;
	flock_two.setColor(ColorA( CM_RGB, 0.0, 1.0, 0.0, 1.0));
	imageColor = ColorA( CM_RGB, 0.4, 0.4, 0.4, 1.0);
	
	flock_one.addOtherFlock(&flock_two);
	flock_two.addOtherFlock(&flock_one);
	// SETUP PARAMS
	mParams = params::InterfaceGl( "Flocking", Vec2i( 200, 310 ) );
	mParams.addParam( "Scene Rotation", &mSceneRotation, "opened=1" );//
	mParams.addSeparator();
	mParams.addParam( "Fullscreen", &shouldBeFullscreen,"keyIncr=f" ); //FIXME
	mParams.addSeparator();
	mParams.addParam( "Eye Distance", &mCameraDistance, "min=100.0 max=2000.0 step=50.0 keyIncr=s keyDecr=w" );
	//mParams.addParam( "Center Gravity", &flock_one.centralGravity, "keyIncr=g" );
	//mParams.addParam( "Flatten", &flock_one.flatten, "keyIncr=f" );
	mParams.addSeparator();
	//mParams.addParam( "Zone Radius", &flock_one.zoneRadius, "min=10.0 max=100.0 step=1.0 keyIncr=z keyDecr=Z" );
//	mParams.addParam( "Lower Thresh", &flock_one.lowerThresh, "min=0.025 max=1.0 step=0.025 keyIncr=l keyDecr=L" );
//	mParams.addParam( "Higher Thresh", &flock_one.higherThresh, "min=0.025 max=1.0 step=0.025 keyIncr=h keyDecr=H" );
//	mParams.addSeparator();
//	mParams.addParam( "Attract Strength", &flock_one.attractStrength, "min=0.001 max=0.1 step=0.001 keyIncr=a keyDecr=A" );
//	mParams.addParam( "Repel Strength", &flock_one.repelStrength, "min=0.001 max=0.1 step=0.001 keyIncr=r keyDecr=R" );
//	mParams.addParam( "Orient Strength", &flock_one.orientStrength, "min=0.001 max=0.1 step=0.001 keyIncr=o keyDecr=O" );
//	mParams.addSeparator();
	mParams.addParam( "CV Threshhold", &silhouetteDetector->cvThresholdLevel, "min=0 max=255 step=1 keyIncr=t keyDecr=T" );
	
	//setup transformation from camera space to opengl world space
	imageToScreenMap.setToIdentity();
	imageToScreenMap.translate(Vec3f(getWindowSize().x/2, getWindowSize().y/2, 0));	//translate over and down
	imageToScreenMap.scale(Vec3f(-1*getWindowSize().x/320.0f, -1*getWindowSize().y/240.0f,1.0f));	//scale up
	polygons = new vector<Vec2i_ptr_vec>();
	
	currentBoidRuleNumber = 0;
	
	// ** stuff to create boid rulesets ** //
	
	// State 1: stuckOnYou - both flocks are attracted to the silhouette
	BoidSysPair stuckOnYou;
	stuckOnYou.flockOneProps.zoneRadius			= 80.0f;
	stuckOnYou.flockOneProps.lowerThresh		= 0.5f;
	stuckOnYou.flockOneProps.higherThresh		= 0.8f;
	stuckOnYou.flockOneProps.attractStrength	= 0.004f;
	stuckOnYou.flockOneProps.repelStrength		= 0.01f;
	stuckOnYou.flockOneProps.orientStrength		= 0.01f;
	stuckOnYou.flockOneProps.silThresh			= 1000.0f;
	stuckOnYou.flockOneProps.silRepelStrength	= -0.50f;
	stuckOnYou.flockOneProps.gravity			= false;
	stuckOnYou.flockOneProps.baseColor			= ColorA( CM_RGB, 0.784, 0.0, 0.714, 1.0);
	
	stuckOnYou.flockTwoProps=stuckOnYou.flockOneProps;
	stuckOnYou.imageColor						= ColorA( 0.08f, 0.0f, 0.1f, 1.0f);
	boidRulesets.push_back(stuckOnYou);
	
	// State 2: repel - both flocks are repeled by the silhouette
	BoidSysPair repel;
	repel.flockOneProps.zoneRadius				= 80.0f;
	repel.flockOneProps.lowerThresh				= 0.5f;
	repel.flockOneProps.higherThresh			= 0.8f;
	repel.flockOneProps.attractStrength			= 0.004f;
	repel.flockOneProps.repelStrength			= 0.01f;
	repel.flockOneProps.orientStrength			= 0.01f;
	repel.flockOneProps.silThresh				= 500.0f;
	repel.flockOneProps.silRepelStrength		= 1.00f;
	repel.flockOneProps.gravity					= false;
	repel.flockOneProps.baseColor				= ColorA( CM_RGB, 0.157, 1.0, 0.0,1.0);

	repel.flockTwoProps=repel.flockOneProps;
	repel.imageColor							= ColorA( 0.08f, 0.0f, 0.1f, 1.0f);	
	boidRulesets.push_back(repel);
	
	
	//// State 3: grav - like repel, but with gravity added
	BoidSysPair grav;
	grav.flockOneProps=repel.flockOneProps;
	grav.flockOneProps.gravity					= true;
	grav.flockOneProps.repelStrength			= 0.005f;
	grav.flockOneProps.baseColor				= ColorA( CM_RGB, 0.157, 0.0, 1.0,1.0);
	grav.flockTwoProps=grav.flockOneProps;
	grav.imageColor								= ColorA( 0.08f, 0.0f, 0.1f, 1.0f);
	boidRulesets.push_back(grav);
	
	
	//// State 4: diff - one flock is attracted to the silhouette and the other is repeled
	BoidSysPair diff;
	
	diff.flockOneProps=repel.flockOneProps;
	diff.flockTwoProps=stuckOnYou.flockOneProps;
	diff.imageColor								= ColorA( 0.08f, 0.0f, 0.1f, 1.0f);
	boidRulesets.push_back(diff);
	 
	
}