개요

DiretX9를 이용한 3D GAME 참고한 자료

인데 뭔지 모르겠다. 


 

 

벡터

 

공간의 벡터

벡터는 방향만을 모델링하기 위해 백터를 이용하거나 빛이 비추는 방향이나 다각형의 방향, 3D 세계에서 카메라가 보고 있는 방향 등을 알아내고자 할 때 사용할 수 있다.

 

벡터의 속성으로는 길이와 방향으로 위치는 벡터의 속성이 아니다.

다른 위치에 있더라도 동일한 길이와 방향이면 동일하다고 볼 수 있다.

 

좌표 시스템

좌표 시스템에 벡터의 꼬리를 위치시켜보면 아래와 같다

표준점 내에 위치한 벡터의 머리 좌표를 이용하여 벡터를 기술할 수 있다.

때문에 포인트와 벡터를 혼동하는 일이 있을 수 있다

벡터의 표기

벡터는 굵은 소문자 또는 대문자로 표기할 수 있다.

u = (ux,uy) , N = (Nx,Ny,Nz) , c = (cx, cy, cz, cw)

 

기저 벡터

표준 기저 벡터라고 불리는 세가지가 있다.

i = (1, 0, 0) , j = (0, 1, 0) , k = (0, 0, 1)

 

단위 벡터

크기로 1을 가지는 벡터

 

cVector3 cVector3::Normalize()
{
	float l = Length();
	cVector3 v;
	v.x = x / l;
	v.y = y / l;
	v.z = z / l;
	return v;
}

 

 

벡터 상등

벡터가 동일한 차원이고 대응되는 성분(길이, 방향)이 같으면 두 벡터가 동일한 것으로 본다.

부동 소수점 수를 비교할 때, EPSILON 상수를 버퍼로 사용한다.

 

 

벡터의 크기

||u|| = sqrt( x * x + y * y + z * z )

 

float cVector3::Length()
{
	return (float)sqrt(x * x + y * y + z * z);	// : 사용 math.h
}

 

 

벡터의 정규화

벡터의 크기를 1로 만들어 단위벡터가 되도록 하는 것

각 성분을 벡터의 크기로 나누면 정규화가 된다.

 

 

 

벡터 더하기

u + v = ( ux + vx , uy + vy , uz + vz )

 

cVector3 cVector3::operator+(cVector3& vec)
{
	cVector3 v;
	v.x = x + vec.x;
	v.y = y + vec.y;
	v.z = z + vec.z;
	return v;
}

 

 

벡터 빼기

u - v = u + (-v) = ( ux - vx , uy - vy , uz - yz )

 

cVector3 cVector3::operator-(cVector3& vec)
{
	cVector3 v;
	v.x = x - vec.x;
	v.y = y - vec.y;
	v.z = z - vec.z;
	return v;
}

 

 

내적

uv 가 모두 단위 벡터일 경우 u · v는 두 벡터간의 각도의 cos이 된다.

 

float cVector3::Dot(cVector3& v1, cVector3& v2)
{
	return v1.x * v2.x + v1.y * v2.y + v1.z * v2.z;
}

- u · v = 0 이라면, 두 벡터간의 각도는 90도 (수직) 이다.

- u · v > 0 이라면, 두 벡터간의 각도는 90도 보다 작다.

- u · v < 0 이라면, 두 벡터간의 각도는 90도 보다 크다.

 

 

외적

 

p = u x v = [ ( uy * vz - uz * vy ) , ( uz * vx - ux * vz ) , ( ux * vy - uy * vx ) ]

 

cVector3 cVector3::Cross(cVector3& v1, cVector3& v2)
{
	cVector3 v;
	v.x = v1.y * v2.z - v1.z * v2.y;
	v.y = v1.z * v2.x - v1.x * v2.z;
	v.z = v1.x * v2.y - v1.y * v2.x;
	return v;
}

 

 

행렬

 

행렬이 한 개의 행이나 열 만을 갖는 행렬을 행 벡터 혹은 열 벡터라고 한다.

 

행렬의 표기

행렬은 굵은 대문자로 표기한다.

 

행렬의 곱

행렬의 곱은 3D 컴퓨터 그래픽에서 행렬을 이용하기 위한 연산이다.

 

* AB != BA 행렬은 항상 교환적이지는 않다.

 

항등 행렬

모든 항목이 0인 정방 행렬을 말하며, 중심 대각선의 항목들만 1인 행렬

 

역행렬

행렬에는 나누기와 비교할 수 있는 연산은 없으나, 곱하기와 반대의 의미를 갖는 연산은 있다.

정방 행렬만이 역행렬을 가질 수 있으나 모든 정방 행렬이 역행렬을 가지지는 않는다.

행렬과 역행렬을 곱하면 항등행렬을 얻는다.

 

행렬의 전치

행렬의 열과 행을 교환하면 행려르이 전치를 수행할 수 있다.

 

D3DX 행렬

Direct3D 애플리케이션을 프로그래밍할 때는 4x4 행렬과 1x4 행 벡터만을 이용한다.

Direct3D를 이용한 프로그래밍에서 변환을  표현하기 위해서 4x4 행렬을 이용하며

4x4 행렬 X의 각 항목을 특정한 변환을 나타내는 값으로 채운 다음, 1x4 행 벡터의 열에 포인트의 좌표나 벡터를 넣는다.

 

모르겠다

 

4x4 행렬

이동이나 투영, 반사 등과 같이 3x3행렬로 표현할 수 없는 변환들이 있기 때문에 4x4 행렬을 사용한다.

 

1 x 4 행벡터

모델링

좌표가 지정되고 좌표가 어떻게 연결되는지 값들이 있다.

네번째 성분은 일반적으로 1이나 0으로 취급된다. (1 : 포인트, 0 : 방향벡터)

 

 

이동 행렬

 

회전 행렬

 

크기 변형 행렬

 

변환 조합하기

* 여러 개의 변환을 하나의 변환으로 결합하는 능력은 성능에 영향을 준다.

 

 

 

렌더링 파이프라인 ( Rendering Pipeline )

폴리곤 : 세 개의 버텍스(꼭지점)으로 정의된 하난의 삼각형

 

삼각형

삼각형은 물체를 구성하기 위해서는 물체의 모양과 외형을 묘사하는 삼각형 리스트를 만들어야 한다.

 

Winding Order : 삼각형의 버텍스를 지정하는 순서(winding order)는 중요하다,

 

인덱스

3D 물체를 구성하기 위해서는 동일한 버텍스를 공유하는 경우가 많다.

사각형은 두 개의 삼각형으로 만들어지며 두 개의 버텍스가 중복된다.

삼각형1 = [v0, v1, v2]

삼각형2 = [v0, v2, v3]

 

가상 카메라

 

렌더링 파이프라인

 

로컬 스페이스

모델링 스페이스라고 불리며 모델러가 관여하는 공간이래요.

 

월드 스페이스

자체의 로컬 좌표 시스템 내에 다수의 모델을 구성한 다음 월드 좌표 시스템으로 옮겨 하나의 장면을 구성

 

뷰 스페이스

카메라가 임의의 위치나 방위를 가진다면, 투영이나 그 외의 작업이 어렵거나 비효율적이다.

그렇기 때문에 카메라가 보고 있는 기준을 월드좌표 기준으로 변환한다.

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

	cMatrix matRet = cMatrix::Identity(4);
	matRet[0][0] = r.x; matRet[0][1] = u.x; matRet[0][2] = l.x;		/// : [0]
	matRet[1][0] = r.y; matRet[1][1] = u.y; matRet[1][2] = l.y;
	matRet[2][0] = r.z; matRet[2][1] = u.z; matRet[2][2] = l.z;

	matRet[3][0] = -cVector3::Dot(r, vEye);
	matRet[3][1] = -cVector3::Dot(u, vEye);
	matRet[3][2] = -cVector3::Dot(l, vEye);

	return matRet;
}

 

투영

n 차원에서 n-1 차원을 얻는 과정

cMatrix cMatrix::Projection(float fFovY, float fAspect, float fNearZ, float fFarZ)
{
	cMatrix matRet = cMatrix::Identity(4);

	float fScaleY = 1.0f / tanf(fFovY / 2.0f);
	float fScaleX = fScaleY / fAspect;

	matRet[0][0] = fScaleX;
	matRet[1][1] = fScaleY;
	matRet[2][2] = fFarZ / (fFarZ - fNearZ);
	matRet[2][3] = 1.0f;
	matRet[3][2] = -fFarZ * fNearZ / (fFarZ - fNearZ);
	matRet[3][3] = 0.0f;

	return matRet;
}

 

뷰 포트 전환

cMatrix cMatrix::Viewport(float x, float y, float w, float h, float minz, float maxz)
{
	cMatrix matRet = cMatrix::Identity(4);
	matRet[0][0] = w / 2.0f;
	matRet[1][1] = -h / 2.0f;
	matRet[2][2] = maxz - minz;
	matRet[3][0] = x + w / 2.0f;
	matRet[3][1] = y + h / 2.0f;
	matRet[3][2] = minz;
	return matRet;
}
728x90

'Program > Program' 카테고리의 다른 글

드로우 콜(Draw call)과 최적화  (0) 2023.02.09
컴퓨터 동작 원리  (0) 2022.04.21
컴퓨터 언어 체계  (0) 2022.04.19
프로그래밍 개념  (0) 2022.04.06

+ Recent posts