본문 바로가기

Direct3D

[Direct3D] View, Projection, ViewPort Matrix

[주의] 공부 중인 자료이므로, 틀릴 가능성이 많아 참고만 하는 것이 좋다

cMatrix cMatrix::View(cVector3 & vEye, cVector3 & vLookAt, cVector3 & vUp, cVector3& vRight)
{
	cVector3 l = (vLookAt - vEye).Normalize();
	cVector3 r = cVector3::Cross(vUp, l).Normalize();
	cVector3 u = cVector3::Cross(l, r).Normalize();

	cMatrix viewMat(4);
	viewMat.SetData(
		r.x,						u.x,						l.x,						0.f,
		r.y,						u.y,						l.y,						0.f,
		r.z,						u.z,						l.z,						0.f,
		-cVector3::Dot(vEye, r),	-cVector3::Dot(vEye, u),	-cVector3::Dot(vEye, l),	1.f
	);
	return viewMat;
}

cMatrix cMatrix::Projection(float fFovY, float fAspect, float fNearZ, float fFarZ)
{
	float fSy = 1.f / tanf(fFovY / 2.f);
	float fSx = fSy / fAspect;
	cMatrix projMat(4);
	projMat.SetData(
		fSx,	0.f,	0.f,									0.f,
		0.f,	fSy,	0.f,									0.f,
		0.f,	0.f,	 fFarZ / (fFarZ - fNearZ),				1.f,
		0.f,	0.f,	-(fFarZ * fNearZ) / (fFarZ - fNearZ),	0.f
	);
	return projMat;
}

cMatrix cMatrix::ViewPort(float x, float y, float w, float h, float minZ, float maxZ)
{
	cMatrix vpMat(4);
	vpMat.SetData(
		w /	2.f,	0.f,		0.f,			0.f,
		0.f,		-h / 2.f,	0.f,			0.f,
		0.f,		0.f,		maxZ - minZ,	0.f,
		x + w/2.f,	y + h/2.f,	minZ,			1.f
	);
	return vpMat;
}

 

View 행렬 매개변수

1. vEye : 카메라 벡터

2. vLookAt : (0, 0, 1) 월드 내의 카메라가 보는 지점

3. vRight : (1, 0, 0) 벡터

4. vUp : (0, 1, 0) 벡터

 

Projection 행렬 매개변수

1. fFov : 시야각 수직 영역 : PI(3.14) / 4

2. fAspect : 종횡비 : 스크린 너비 / 스크린 높이

3. fNearZ : 가까운 평면까지의 거리 : 1

4. fFarZ : 먼 평면까지의 거리 : 100

 

ViewPort 행렬 매개변수

1. x : 0

2. y : 0

3. w : 스크린 너비

4. h : 스크린 높이

---------- 1 ~ 4 항목은 윈도우와의 상대적인 뷰포트의 사각형을 정의하는 것

5. minZ : 최소 깊이 버퍼 값 : 0

6. maxZ : 최대 깊이 버퍼 값 : 1

'Direct3D' 카테고리의 다른 글

[DirectX3D] ASE File 구조  (0) 2019.09.11