void PhysicsComponent::VUpdate(int deltaMs) { // get the transform component shared_ptr<TransformComponent> pTransformComponent = MakeStrongPtr(m_pOwner->GetComponent<TransformComponent>(TransformComponent::g_Name)); if (!pTransformComponent) { GCC_ERROR("No transform component!"); return; } // get the direction the object is facing Mat4x4 transform = pTransformComponent->GetTransform(); if (m_acceleration != 0) { // calculate the acceleration this frame float accelerationToApplyThisFrame = m_acceleration / 1000.f * (float)deltaMs; // Get the current velocity vector and convert to a scalar. The velocity vector is a combination of // the direction this actor is going in and the speed of the actor. The scalar is just the speed // component. Vec3 velocity(m_pGamePhysics->VGetVelocity(m_pOwner->GetId())); float velocityScalar = velocity.Length(); Vec3 direction(transform.GetDirection()); m_pGamePhysics->VApplyForce(direction, accelerationToApplyThisFrame, m_pOwner->GetId()); // logging // [rez] Comment this back in if you want to debug the physics thrust & rotation stuff. It spams quite // a bit of info the output window so I'm commenting it out for now. /* GCC_LOG("Actor", "Acceleration: " + ToStr(accelerationToApplyThisFrame) + "; velocityScalar: " + ToStr(velocityScalar) + \ "; direction: " + ToStr(direction) + "; direction.Length(): " + ToStr(direction.Length()) + \ "; velocity: " + ToStr(velocity) + "; velocity.Length(): " + ToStr(velocity.Length())); */ } if (m_angularAcceleration != 0) { // calculate the acceleration this frame float angularAccelerationToApplyThisFrame = m_angularAcceleration / 1000.f * (float)deltaMs; m_pGamePhysics->VApplyTorque(transform.GetUp(), angularAccelerationToApplyThisFrame, m_pOwner->GetId()); // logging // [rez] Comment this back in if you want to debug the physics thrust & rotation stuff. It spams quite // a bit of info the output window so I'm commenting it out for now. //GCC_LOG("Actor", "Angular Acceleration: " + ToStr(angularAccelerationToApplyThisFrame) ); } }
void WatchMeProcess::VOnUpdate(unsigned long deltaMs) { StrongActorPtr pTarget = MakeStrongPtr(g_pApp->m_pGame->VGetActor(m_target)); StrongActorPtr pMe = MakeStrongPtr(g_pApp->m_pGame->VGetActor(m_me)); shared_ptr<TransformComponent> pTargetTransform = MakeStrongPtr(pTarget->GetComponent<TransformComponent>(TransformComponent::g_Name)); shared_ptr<TransformComponent> pMyTransform = MakeStrongPtr(pMe->GetComponent<TransformComponent>(TransformComponent::g_Name)); if (!pTarget || !pMe || !pTargetTransform || !pMyTransform) { GCC_ERROR("This shouldn't happen"); Fail(); } Vec3 targetPos = pTargetTransform->GetPosition(); Mat4x4 myTransform = pMyTransform->GetTransform(); Vec3 myDir = myTransform.GetDirection(); myDir = Vec3(0.0f, 0.0f, 1.0f); Vec3 myPos = pMyTransform->GetPosition(); Vec3 toTarget = targetPos - myPos; toTarget.Normalize(); float dotProduct = myDir.Dot(toTarget); Vec3 crossProduct = myDir.Cross(toTarget); float angleInRadians = acos(dotProduct); if (crossProduct.y < 0) angleInRadians = -angleInRadians; Mat4x4 rotation; rotation.BuildRotationY(angleInRadians); rotation.SetPosition(myPos); pMyTransform->SetTransform(rotation); }