void Impl_CameraController_FirstPerson::UpdateRotating(float dx, float dy)
	{
		using namespace math;

		Matrix44 local = m_pObject->GetLocalTransform();
		Matrix44 parent = MatrixIdentity();
		if(m_pObject->GetParent())
		{
			parent = m_pObject->GetParent()->GetWorldTransform();
		}

		Vector3 axis_x = local.GetRow3(0);
		axis_x.Normalize();
		Vector3 axis_y = parent.GetRow3(1);
		axis_y.Normalize();
		
		Vector3 pos = local.GetRow3(3);

		local.SetRow3(3, Vector3(0, 0, 0));

		float step = D2R(0.1);

		local = local * MatrixRotationAxis(axis_x, dy * step) * MatrixRotationAxis(axis_y, dx * step);
		local.SetRow3(3, pos);
		m_pObject->SetLocalTransform(local);

		m_pCameraData->UpdateCamera();
	}
	void Impl_CameraController_FirstPerson::UpdateMoving(float dt)
	{
		using namespace math;

		Matrix44 local = m_pObject->GetLocalTransform();

		Vector3 pos = local.GetRow3(3);

		Vector3 axis_x = local.GetRow3(0);
		axis_x.Normalize();
		Vector3 axis_y = local.GetRow3(1);
		axis_y.Normalize();
		Vector3 axis_z = local.GetRow3(2);
		axis_z.Normalize();

		float speed = 5.0f;

		float step = speed * dt;

		if(m_forward)
		{
			axis_z *= step;
			pos += axis_z;
		}

		if(m_backward)
		{
			axis_z *= -step;
			pos += axis_z;
		}


		if(m_left)
		{
			axis_x *= -step;
			pos += axis_x;
		}

		if(m_right)
		{
			axis_x *= step;
			pos += axis_x;
		}

		local.SetRow3(3, pos);
		m_pObject->SetLocalTransform(local);

		CorrectPosition();

		m_pCameraData->UpdateCamera();
	}