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); }
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); }