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);
		}
	}
}
Esempio n. 2
0
void SpringSys::Compute_Forces(TimeValue t, int index)
{
	ApplyDrag(index);
	ApplyUnaryForces(t, index);
	ApplySpring(t, index);
}