void EERIE_PHYSICS_BOX_ComputeForces(EERIE_3DOBJ * obj) { EERIE_3D PHYSICS_Gravity; PHYSICS_Gravity.x = 0.f; PHYSICS_Gravity.y = -20.f; PHYSICS_Gravity.z = 0.f; float PHYSICS_Damping = 0.6f; float lastmass = 1.f; float div = 1.f; for (long k = 0; k < obj->pbox->nb_physvert; k++) { PHYSVERT * pv = &obj->pbox->vert[k]; // Reset Force pv->force.x = pv->inertia.x; pv->force.y = pv->inertia.y; pv->force.z = pv->inertia.z; // Apply Gravity if (pv->mass > 0.f) { //need to be precomputed... if (lastmass != pv->mass) { div = 1.f / pv->mass; lastmass = pv->mass; } pv->force.x += (PHYSICS_Gravity.x * div); pv->force.y -= (PHYSICS_Gravity.y * div); pv->force.z += (PHYSICS_Gravity.z * div); } // Apply Damping pv->force.x += (-PHYSICS_Damping * pv->velocity.x); pv->force.y += (-PHYSICS_Damping * pv->velocity.y); pv->force.z += (-PHYSICS_Damping * pv->velocity.z); } for (int k = 0; k < obj->pbox->nb_physvert; k++) { // Now Resolves Spring System for (long l = 0; l < obj->pbox->nb_physvert; l++) { if (l != k) ApplySpring(obj, l, k, 18.f, 0.4f); } } }
void SpringSys::Compute_Forces(TimeValue t, int index) { ApplyDrag(index); ApplyUnaryForces(t, index); ApplySpring(t, index); }