Example #1
0
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);
		}
	}
}