Exemplo n.º 1
0
ofxBox2dJoint::ofxBox2dJoint(b2World* b2world, b2Body* body1, b2Body* body2, ofVec2f anchor1, ofVec2f anchor2, float frequencyHz, float damping, bool bCollideConnected) {
	ofxBox2dJoint();
	setup(b2world, body1, body2, anchor1, anchor2, frequencyHz, damping, bCollideConnected);
}
Exemplo n.º 2
0
void Blobs02 :: addBlob( float bx, float by, float radius, int nodesTotal )
{
	if( nodesTotal % 2 != 0 )	// always even number of nodes, for opposite joins to balance.
		nodesTotal += 1;
	
	blobs.push_back( Blob() );
	
	float nodeMass;
	float nodeBounce;
	float nodeFriction;
	
	nodeMass		= 30.0;
	nodeBounce		= 0.53;
	nodeFriction	= 0.1;
	
	blobs.back().nodesTotal = nodesTotal;
	blobs.back().nodeRadius = radius;
	blobs.back().nodeScale	= new float[ nodesTotal ];
	
	for( int i=0; i<nodesTotal; i++ )
	{
		blobs.back().nodeScale[ i ] = 0;
	}
	
	blobs.back().nodes.push_back( ofxBox2dCircle() );				// center node.
	blobs.back().nodes.back().setPhysics( nodeMass, nodeBounce, nodeFriction );
	blobs.back().nodes.back().setup( box2d.getWorld(), bx, by, 10, true );
	blobs.back().nodes.back().disableCollistion();
	
	// the joints
	for( int i=0; i<nodesTotal; i++ ) 
	{
		float p = ( i / (float)nodesTotal ) * PI * 2;
		float x = bx + cos( p ) * radius; 
		float y = by + sin( p ) * radius;
		blobs.back().nodes.push_back( ofxBox2dCircle() );
		blobs.back().nodes.back().setPhysics( nodeMass, nodeBounce, nodeFriction );
		blobs.back().nodes.back().setup( box2d.getWorld(), x, y, 20 );
	}
	
	float jointStiffness;	// joint stiffness.
	float jointDamping;		// joint damping.

	jointStiffness	= 10.0;
	jointDamping	= 0.9;
	
	// joins between neighbouring nodes.
	for( int i=1; i<blobs.back().nodes.size(); i++ )
	{
		blobs.back().nodeJoints.push_back( ofxBox2dJoint() );
		
		if( i < blobs.back().nodes.size() - 1 )
		{
			blobs.back().nodeJoints.back().setWorld( box2d.getWorld() );
			blobs.back().nodeJoints.back().addJoint( blobs.back().nodes[ i ].body, blobs.back().nodes[ i + 1 ].body, jointStiffness, jointDamping );
		}
		else
		{
			blobs.back().nodeJoints.back().setWorld( box2d.getWorld() );
			blobs.back().nodeJoints.back().addJoint( blobs.back().nodes[ i ].body, blobs.back().nodes[ 1 ].body, jointStiffness, jointDamping );
		}
	}
	
	jointStiffness	= 1.0;
	jointDamping	= 0.9;
	
	// joins between opposite nodes.
	int nodesHalf = (int)( blobs.back().nodes.size() * 0.5 );
	for( int i=1; i<nodesHalf + 1; i++ )
	{
		int j = i + nodesHalf;
		
		blobs.back().nodeJoints.push_back( ofxBox2dJoint() );
		
		blobs.back().nodeJoints.back().setWorld( box2d.getWorld() );
		blobs.back().nodeJoints.back().addJoint( blobs.back().nodes[ i ].body, blobs.back().nodes[ j ].body, jointStiffness, jointDamping );
	}
	
	jointStiffness	= 1.0;
	jointDamping	= 0.9;
	
	// joins to center node.
	for( int i=1; i<blobs.back().nodes.size(); i++ )
	{
		blobs.back().nodeJoints.push_back( ofxBox2dJoint() );
		blobs.back().nodeJoints.back().setWorld( box2d.getWorld() );
		blobs.back().nodeJoints.back().addJoint( blobs.back().nodes[ 0 ].body, blobs.back().nodes[ i ].body, jointStiffness, jointDamping );
	}
}
//----------------------------------------
ofxBox2dJoint::ofxBox2dJoint(b2World* b2world, b2DistanceJointDef jointDef) {
    ofxBox2dJoint();
    setup(b2world, jointDef);
}