본문 바로가기

Today I Learned

23.05.30 - 직교 투영 행렬 만들기

직교 투영은 카메라의 영향을 받지 않고 원근감을 적용시키지 않기 때문에 원근 투영과 다르게

투영행렬을 따로 만들어줘야 한다. 

 

 

왼쪽의 월드 행렬에서 좌표 변환을 통해 오른쪽과 같은 NDC(Normalized Device Coordinate), 정규좌표로 만들어줘야 한다. 중간에 뷰 변환 행렬은 어디갔냐고? 카메라의 영향을 받지 않기 때문에 월드 행렬을 그대로 넘겨주기 위해 뷰 변환 행렬은 항등행렬이다. 좌표를 변환하려면 어떻게 해야 할까? 그림대로라면 화면의 SizeX가 1280, SizeY가 720일 때  위치좌표는 중앙이므로 (640,360)이 될 것이고 이 좌표가 NDC에서 (0,0)이 되어야 할 것이다.

 

	m_fSizeX = 1280.0f;
	m_fSizeY = 200.0f;
	m_fX = m_fSizeX * 0.5f;
	m_fY = g_iWinSizeY - m_fSizeY * 0.5f;

	_float4x4		Scaling, Translation;

	m_WorldMatrix = *D3DXMatrixScaling(&Scaling, m_fSizeX, m_fSizeY, 1.f) * 
		*D3DXMatrixTranslation(&Translation, m_fX - g_iWinSizeX * 0.5f, -m_fY + g_iWinSizeY * 0.5f, 0.f);

	m_ViewMatrix = *D3DXMatrixIdentity(&m_ViewMatrix);

	/* 뷰 스페이스에서 뷰 볼륨을 설정하고. 해당 뷰 볼륨에 있는 모든 점들을 
	투영스페이스로 그대로 찍어낸다. */
	D3DXMatrixOrthoLH(&m_ProjMatrix, g_iWinSizeX, g_iWinSizeY, 0.0f, 1.f);

 

좌표를 변환하기 전 위치 좌표 X는 SizeX의 절반이다. 위치 좌표 Y는 화면크기 Y에 sizeY의 절반을 뺀 것인데 밑에 깔린 형태로 사이즈가 커질 수록 위로 크기가 채워지는 형태가 된다. 이 좌표를 NDC로 변환하기 위해 먼저 사이즈만큼 Scaling을 하고 Translation으로 이동시킨다. 변환전 좌표는 윈도우 좌표계를 사용하는데 이를 정규화하기 위해  이동시켜야 한다. 변환전 위치좌표는 원점 기준 오른쪽 아래에 있으므로, 우선 x는 위치X에서 화면크기X의 절반을 빼준다. y는 변환전 좌표계와 NDC의 y축 양의 방향이 반대이므로 화면크기Y의 절반에 위치Y를 빼준다.