작업물/DirectX 11

[ DirectX11 3D Project ] 카메라 줌인, 줌아웃, 회전

Lero God 2018. 8. 24. 09:53




지난번엔 카메라 이동을 만들었고 이번에는 카메라 줌인과 줌아웃, 그리고 회전을 만들어보겠습니다!


카메라의 회전과 줌은 다이렉트 인풋 객체의 마우스 이동값과 버튼 입력값을 이용해서 만들겠습니다. SystemClass가 다이렉트 인풋 객체를 가지고 있어서 마우스 동작에 대한 처리를 할 함수를 SystemClass에 추가합니다. 함수 이름은 MouseInput이라고 짓겠습니다. MouseInput 함수는 Run 함수에서 프레임마다 호출합니다. MouseInput 함수에서는 마우스의 이동값과 버튼 입력값을 가지고 있는 DIMOUSESTATE 구조체를 인자로 넘겨주면서 GraphisClass의 MouseInput을 호출합니다. 


void SystemClass::MouseInput()
{
	DIMOUSESTATE mouseState = m_Input->GetMouseState();
	m_Graphics->MouseInput(mouseState);
}


GraphicsClass에도 MouseInput 함수를 선언하고 그 다음 함수 내부 구현을 해보겠습니다. GraphicsClass의 MouseInput 함수는 매개변수로 받은 DIMOUSESTATE 구조체를 이용해 카메라의 회전과 줌을 합니다. 


먼저 카메라의 회전은 오른쪽 마우스를 눌렀을 때 마우스의 이동값에 따라 카메라가 바라보는 곳의 위치를 변경하는 방식으로 구현합니다. 다음 그림을 보면 카메라가 바라보는 위치를 변경하는 것만으로도 카메라가 자전하는 느낌을 줄 수 있습니다. 







좌우 회전은 바라보는 곳의 X 좌표와 Z 좌표를 변경합니다. 우회전은 카메라 오른쪽 방향 벡터의 X좌표와 Z 좌표 값을 더하면 되고 좌회전은 빼면 됩니다. 상하 회전은 Y 좌표에 임의 값을 더하고 빼는 방식으로 합니다. 바라보는 위치를 바꿨다면 카메라 객체에 세팅 해줍니다.


void GraphicsClass::MouseInput(const DIMOUSESTATE mouseState)
{
	// Camera rotation. Activates when right mouse button pressed.
	const float moveValue = 0.3f;
	if (mouseState.rgbButtons[1] & 0x80)
	{
		XMFLOAT3 lookAtVector = m_Camera->GetLookAtVector();
		XMFLOAT3 cameraRightVector = m_Camera->GetCameraRightDirection();
		if (mouseState.lX > 0)
		{
			lookAtVector.x += cameraRightVector.x * moveValue;
			lookAtVector.z += cameraRightVector.z * moveValue;
		}
		else if(mouseState.lX < 0)
		{
			lookAtVector.x -= cameraRightVector.x * moveValue;
			lookAtVector.z -= cameraRightVector.z * moveValue;
		}

		if (mouseState.lY > 0)
		{
			lookAtVector.y -= moveValue;
		}
		else if(mouseState.lY < 0)
		{
			lookAtVector.y += moveValue;
		}

		m_Camera->SetLookAtVector(lookAtVector);
	}


다음은 줌인과 줌아웃을 구현합니다. 줌은 다음 그림과 같이 카메라의 위치를 변경하면 됩니다. 






마우스 휠을 아래로 내렸을 때 줌아웃을 하고, 마우스 휠을 위로 올렸을 때 줌인을 하도록 합니다. 줌아웃은 카메라 위치에서 카메라가 바라보는 방향 벡터를 빼주고, 줌인은 카메라 위치에서 카메라가 바라보는 방향 벡터를 더해줍니다.


	// Camera zoom in and out.
	XMFLOAT3 cameraPosition = m_Camera->GetPosition();
	const XMFLOAT3 cameraForwardDirection = m_Camera->GetCameraForwardDirection();
	if (mouseState.lZ > 0)
	{
		cameraPosition.x += cameraForwardDirection.x;
		cameraPosition.y += cameraForwardDirection.y;
		cameraPosition.z += cameraForwardDirection.z;
	}
	else if (mouseState.lZ < 0)
	{
		cameraPosition.x -= cameraForwardDirection.x;
		cameraPosition.y -= cameraForwardDirection.y;
		cameraPosition.z -= cameraForwardDirection.z;
	}

	m_Camera->SetPosition(cameraPosition);
}


이렇게 이번엔 마우스의 입력값과 위치값을 이용해 카메라의 회전과 줌 구현하는 방법을 알아봤습니다. 





'작업물 > DirectX 11' 카테고리의 다른 글

[ DirectX11 3D Project ] 카메라의 이동  (0) 2018.08.09