void kore::Camera::rotateViewQuat(const float angle, const glm::vec3 v3Axis) { glm::vec3 v3View = getForward(); glm::vec3 v3Up(0.0f, 1.0f, 0.0f); glm::quat quatView(0, v3View); glm::quat quatViewResult = glm::rotate(quatView, angle, v3Axis); v3View.x = quatViewResult.x; v3View.y = quatViewResult.y; v3View.z = quatViewResult.z; v3View = glm::normalize(v3View); glm::vec3 v3Side = glm::cross(v3Up, v3View); v3Side = glm::normalize(v3Side); v3Up = glm::cross(v3View, v3Side); v3Up = glm::normalize(v3Up); setOrientation(v3Side, v3Up, v3View); }
void Engine::Controller::CIControllerLookAtRotation::Update(Engine::CActor& i_CActor) { if (!i_CActor.GetHasData("Status") || strcmp(i_CActor.GetDataMember("Status"), "Disabled") == 0) { return; } if (!i_CActor.GetHasData("LookAtStatus") || strcmp(i_CActor.GetDataMember("LookAtStatus"), "Disabled") == 0) { return; } if (i_CActor.GetHasData("ActorNameToFollow")) { const char* kcpActorNameToFollow = i_CActor.GetDataMember("ActorNameToFollow"); Engine::CActor* pcActorToFollow = m_pcWorld->GetActorByName(kcpActorNameToFollow); if (pcActorToFollow == nullptr) { return; } //Get Location float fLocationX = 0.0f; if (i_CActor.GetHasMetric("LocationX")) { fLocationX = i_CActor.GetMetricMember("LocationX"); } float fLocationY = 0.0f; if (i_CActor.GetHasMetric("LocationY")) { fLocationY = i_CActor.GetMetricMember("LocationY"); } float fLocationZ = 0.0f; if (i_CActor.GetHasMetric("LocationZ")) { fLocationZ = i_CActor.GetMetricMember("LocationZ"); } //Get Target Location float fLookAtX = 0.0f; if (i_CActor.GetHasMetric("LocationX")) { fLookAtX = pcActorToFollow->GetMetricMember("LocationX"); } float fLookAtY = 0.0f; if (i_CActor.GetHasMetric("LocationY")) { fLookAtY = pcActorToFollow->GetMetricMember("LocationY"); } float fLookAtZ = 0.0f; if (i_CActor.GetHasMetric("LocationZ")) { fLookAtZ = pcActorToFollow->GetMetricMember("LocationZ"); } Shared::Math::CVector3 v3LookAtTarget(fLookAtX, fLookAtY, fLookAtZ); Shared::Math::CVector3 v3Position(fLocationX, fLocationY, fLocationZ); Shared::Math::CVector3 v3Up(0.0f, 1.0f, 0.0f); Shared::Math::CVector3 v3ZAxis = (v3LookAtTarget - v3Position).GetUnitVector(); Shared::Math::CVector3 v3XAxis = (v3Up.GetOuterProduct(v3ZAxis)).GetUnitVector(); Shared::Math::CVector3 v3YAxis = v3ZAxis.GetOuterProduct(v3XAxis); float fRotationX = 0.0f; float fRotationY = 0.0f; float fRotationZ = 0.0f; if (v3ZAxis.GetY() < 1.0f) { if (v3ZAxis.GetY() > -1.0f) { fRotationX = asinf(-v3ZAxis.GetY()) * 180.0f / static_cast<float>(M_PI); fRotationY = atan2(v3ZAxis.GetX(), v3ZAxis.GetZ()) * 180.0f / static_cast<float>(M_PI); fRotationZ = atan2(v3XAxis.GetY(), v3YAxis.GetY()) * 180.0f / static_cast<float>(M_PI); } else { fRotationX = static_cast<float>(M_PI) * 0.5f; fRotationY = atan2(-v3YAxis.GetX(), v3XAxis.GetX()) * 180.0f / static_cast<float>(M_PI); fRotationZ = 0.0f; } } else { fRotationX = static_cast<float>(M_PI) * -0.5f; fRotationY = atan2(-v3YAxis.GetX(), v3XAxis.GetX()) * 180.0f / static_cast<float>(M_PI); fRotationZ = 0.0f; } if (i_CActor.GetHasMetric("RotationX")) { i_CActor.SetMetricMember("RotationX", fRotationX); } if (i_CActor.GetHasMetric("RotationY")) { i_CActor.SetMetricMember("RotationY", fRotationY); } if (i_CActor.GetHasMetric("RotationZ")) { i_CActor.SetMetricMember("RotationZ", fRotationZ); } } }