관리 메뉴

드럼치는 프로그래머

[DirectX] 행렬 / 행렬의 연산 본문

★─Programing/☆─DirectX

[DirectX] 행렬 / 행렬의 연산

드럼치는한동이 2010. 2. 17. 14:02

행렬의 표현

Direct3D에서는 4 X 4 크기의 행렬만 지원한다.

4 X 4 행렬의 표현을 위해서 C++ 구조체 타입인 D3DXMATRIX를 제공한다.

행렬에 대한 연산자 겹지정(operator overloading)

타입 변환(type casting)의 장점을 지원한다.

 

D3DXMATRIX에서는 먼저 변수만 선언하고, 이후에 행렬을 채우는 식의 작업이 일반적이다.

 

D3DXMATRIX mat; // Direct3D에서 4 X 4행렬의 표현을 위한 D3DXMATRIX타입 변수선언

 

ZeroMemory (&mat, sizeof(D3DXMATRIX)); // 0으로 초기화

 

위와같이 0으로 초기화 한후 아래와 같이 값을 대입할 수 있다.

mat._11 = 0.64f;

mat._22 = 0.48f;

  

겹지정 연산자를 통한 행렬 연산

이항연산으로 행렬간의 덧셈, 뺄셈, 곱셈 연산이 정의되어 있다.

또한 행렬과 스칼라와의 곱셈, 나눗셈 연산이 정의되어 있다.

단항연산으로 '+'와 '-'가 정의되어 있다.

 

D3DXMATRIX A, B, C;

C = A * B;

 

원소를 접근하는 연산이 정의되어 있다. A(0, 1)은 첫 번째 행의 두번째 열을 의미한다.

또한 A._01 도 같은 의미이다.

 

A(0, 1) = -1.1f;

A._12 = 1.1f;

 

행렬 변수에 대해 (FLOAT*)로 타입변환을 하면 float형 배열을 되돌려 준다.

아래와 같이 실행하면, f[0], f[1], f[2], .... , f[15]는 A(0,0), A(0,1), ... , A(3, 3)에 해당한다.

 

float* f = (FLOAT*)A;

 

두 행렬의 비교를 위한 == 와 != 연산이 정의되어 있다. 두 행렬의 모든 원소가 동일한지를 판단한다.

 

 

행렬 연산 함수를 통한 행렬 연산

행렬과 관련된 여러 연산 함수가 정의되어 있다.

 

D3DXMatrixIdentity(&A); // 행렬 A가 항등행렬(identity matrix)이 되도록 한다.

 

D3DXMatrixTranspose(&B, &A); // 행렬 A의 전치행렬을 계산해서 B에 저장한다.

 

D3DXMatrixInverse(&B, 0, &A); // 행렬 A의 역행렬(inverse matrix)를 계산해서 B에 넣는다.

  - 두번째 인자는 행렬식(determinant) 값을 얻기 위한 용도이며 필요하지 않으면 0을 지정한다.

  - 만약 행렬 A의 행렬식 값도 필요하다면 다음과 같이 하면 된다.

  ->  FLOAT determinant;

        D3DXMatrixInverse(&B, &determinant, &A);


Comments