Exemple #1
0
void Update(Scene* scene, float dt)
{
    Particle* particles = &scene->mParticles[0];
    Triangle* triangles = &scene->mTriangles[0];
    Element* elements = &scene->mElements[0];
    const Vec3* planes = &scene->mPlanes[0];

    uint32_t numParticles = NumParticles(scene);
    uint32_t numTriangles = NumTriangles(scene);
    uint32_t numPlanes = scene->mPlanes.size();

    SceneParams params = scene->mParams;

    FractureEvent* fractures = &scene->mFractures[0];
    uint32_t maxFractures = scene->mFractures.size();

    uint32_t numFractures = UpdateForces(particles, numParticles, triangles, elements, numTriangles,
                                         params.mGravity, params.mLameLambda, params.mLameMu, params.mDamping, params.mDrag, dt,
                                         fractures, maxFractures, params.mToughness, params.mYield, params.mCreep);

    CollidePlanes(particles, numParticles, planes, numPlanes, params.mFriction);

    IntegrateForces(particles, numParticles, dt);

    //if (numFractures)
    //	cout << "numFractures: " << numFractures << endl;

    // todo. ugh figure out a better way to manage this
    scene->mParticles.resize(2*numParticles);
    particles = &scene->mParticles[0];

    /*
    glColor3f(1.0f, 0.0f, 0.0f);
    glBegin(GL_LINES);
    for (size_t i=0; i < numFractures; ++i)
    {
    	Vec2 p = Vec2(fractures[i].mPlane)*-fractures[i].mPlane.z;
    	Vec2 n = PerpCCW(Vec2(fractures[i].mPlane));

    	glVertex2fv(p+n*100.0f);
    	glVertex2fv(p-n*100.0f);

    	glVertex2fv(p);
    	glVertex2fv(p + Vec2(fractures[i].mPlane));

    }
    glEnd();
    */

    if (params.mToughness > 0.0f)
    {
        numParticles = Fracture(particles, numParticles, triangles, numTriangles, fractures, numFractures);

        numParticles = SeparateSingular(particles, numParticles, triangles, numTriangles);
    }

    scene->mParticles.resize(numParticles);
    particles = &scene->mParticles[0];
}
Exemple #2
0
void PhysicsN::IntegrateVelocity( Body2D *b, real dt )
{
	if(b->im == 0.0f)
		return;

	b->position += b->velocity * dt;
	b->orient += b->angularVelocity * dt;
	b->SetOrient( b->orient );
	IntegrateForces( b, dt );
}
Exemple #3
0
		void Body::IntegrateVelocity(float delta)
		{
			if(m_inverseMass == 0.0f)
			{
				return;
			}

			m_position += m_velocity*delta;
			m_orientation += m_angularVelocity*delta;
			m_shape->SetOrientation(m_orientation);
			IntegrateForces(delta);
		}
Exemple #4
0
void PhysicsN::Step( void )
{
	// Generate new collision info
	contacts.clear( );
	for(uint32 i = 0; i < bodies.size( ); ++i)
	{
		Body2D *A = bodies[i];

		for(uint32 j = i + 1; j < bodies.size( ); ++j)
		{
			Body2D *B = bodies[j];
			if(A->im == 0 && B->im == 0)
				continue;
			Manifold m( A, B );
			m.Solve( );
			if(m.contact_count)
				contacts.emplace_back( m );
		}
	}

	// Integrate forces
	for(uint32 i = 0; i < bodies.size( ); ++i)
		IntegrateForces( bodies[i], m_dt );

	// Initialize collision
	for(uint32 i = 0; i < contacts.size( ); ++i)
		contacts[i].Initialize( );

	// Solve collisions
	for(uint32 j = 0; j < m_iterations; ++j)
		for(uint32 i = 0; i < contacts.size( ); ++i)
			contacts[i].ApplyImpulse( );

	// Integrate velocities
	for(uint32 i = 0; i < bodies.size( ); ++i)
		IntegrateVelocity( bodies[i], m_dt );

	// Correct positions
	for(uint32 i = 0; i < contacts.size( ); ++i)
		contacts[i].PositionalCorrection( );

	// Clear all forces
	for(uint32 i = 0; i < bodies.size( ); ++i)
	{
		Body2D *b = bodies[i];
		b->force = Vec2( 0, 0 );
		b->torque = 0;
	}
}
    void IntegrateVelocity(RigidBody2D *b, float dt)
    {
      if (b->im == 0.0f)
        return;

      b->position += b->velocity * dt;
      b->orient += b->angularVelocity * dt;
      b->SetOrient(b->orient);
      if (b->gameObject != nullptr)
      {
        b->gameObject->transform->position = Vector3(b->position.x, b->position.y, b->gameObject->transform->position.z);
        b->gameObject->transform->Rotate(b->angularVelocity * dt);
      }
      IntegrateForces(b, dt);
    }