//---------------------------------------------------------------------------- void BouncingTetrahedra::PhysicsTick () { DoCollisionDetection(); DoCollisionResponse(); mTotalKE = 0.0f; for (int i = 0; i < NUM_TETRA; ++i) { const RigidTetra& tetra = *mTetras[i]; float invMass = tetra.GetInverseMass(); const Matrix3f& inertia = tetra.GetWorldInertia(); const Vector3f& position = tetra.GetPosition(); const Vector3f& linearMomentum = tetra.GetLinearMomentum(); const Matrix3f& rotOrient = tetra.GetROrientation(); const Vector3f& angularVelocity = tetra.GetAngularVelocity(); mTetraNodes[i]->LocalTransform.SetTranslate(position); mTetraNodes[i]->LocalTransform.SetRotate(rotOrient); mTotalKE += invMass*linearMomentum.Dot(linearMomentum) + angularVelocity.Dot(inertia*angularVelocity); } mTotalKE *= 0.5f; mScene->Update(); mSimTime += mSimDeltaTime; }
//---------------------------------------------------------------------------- void BouncingSpheres::PhysicsTick () { DoCollisionDetection(); DoCollisionResponse(); for (int i = 0; i < NUM_BALLS; ++i) { mBallNodes[i]->LocalTransform.SetTranslate(mBalls[i]->GetPosition()); } mScene->Update(); mSimTime += mSimDeltaTime; }
void World::DoPhysical(TimeSpan time, TimeSpan timeDelta) { // DoMotion /* ball_.Update(time, timeDelta); for(uint i = 0; i < pins_.size(); ++i) { pins_[i].Update(time, timeDelta); }*/ DoCollisionDetection(); DoCollisionResponse(); ball_.Update(time, timeDelta); for(uint i = 0; i < pins_.size(); ++i) { pins_[i].Update(time, timeDelta); } // * ÀÏ´Ü Pin0 ºÎÅÍ Å×½ºÆ®. ¿Ö ȸÀüÀÌ ¾ÈµÇ´ÂÁö. //pins_[0].Update(time, timeDelta); totalKE_ = 0.0f; totalKE_ += CalcKE(ball_.GetRigidBody()); for (uint i = 0; i < pins_.size(); i++) { totalKE_ += CalcKE(pins_[i].GetRigidBody()); } totalKE_ *= 0.5f; //// update the scene graph //m_spkScene->UpdateGS(0.0f); //// next simulation time: see DoMotion for calculation of m_fSimDelta //m_fSimTime += m_fSimDelta; }