KoreanFoodie's Study

DirectX 11 2D 게임 프로그래밍 - 12. 행렬 결합 : 이동과 회전 본문

Game Dev/DirectX

DirectX 11 2D 게임 프로그래밍 - 12. 행렬 결합 : 이동과 회전

GoldGiver 2021. 10. 31. 08:06


DirectX 11 2D 게임 프로그래밍 - 12. 행렬 결합 : 이동과 회전

 

행렬 결합하기

- 스케일 행렬에는 0이 들어가면 절대 안 된다

- 행렬은 교환 법칙이 성립하지 않는다

- 행렬 결합 순서는 스! 자! 이! 공! 부! (스케일, 자전, 이동, 공전, 부모)

 

Execute.cpp

D3DXMATRIX를 이용해서 행렬 연산을 통해 공간의 크기와 위치를 바꾸고, 회전을 시켜보자!

		// World : Scaling은 공간의 크기를 바꿀 수 있다.
		D3DXMATRIX S;
		D3DXMatrixScaling(&S, 100, 100, 1);

		std::cout << "Scale Matrix" << std::endl;
		std::cout << S._11 << " " << S._12 << " " << S._13 << " " << S._14 << std::endl;
		std::cout << S._21 << " " << S._22 << " " << S._23 << " " << S._24 << std::endl;
		std::cout << S._31 << " " << S._32 << " " << S._33 << " " << S._34 << std::endl;
		std::cout << S._41 << " " << S._42 << " " << S._43 << " " << S._44 << std::endl;

		std::cout << std::endl;
		
		// Translation : 공간을 이동시켜줌. 이전 공간의 정보를 계승하지 않음
		D3DXMATRIX T;
		D3DXMatrixTranslation(&T, 100, 100, 0);

		std::cout << "Translation Matrix" << std::endl;
		std::cout << T._11 << " " << T._12 << " " << T._13 << " " << T._14 << std::endl;
		std::cout << T._21 << " " << T._22 << " " << T._23 << " " << T._24 << std::endl;
		std::cout << T._31 << " " << T._32 << " " << T._33 << " " << T._34 << std::endl;
		std::cout << T._41 << " " << T._42 << " " << T._43 << " " << T._44 << std::endl;

		std::cout << std::endl;

		D3DXMATRIX R;
		// 회전의 중심이 되는 축은 고정이다!
		D3DXMatrixRotationZ(&R, static_cast<float>D3DXToRadian(45));

		std::cout << "Rotation Matrix" << std::endl;
		std::cout << R._11 << " " << R._12 << " " << R._13 << " " << R._14 << std::endl;
		std::cout << R._21 << " " << R._22 << " " << R._23 << " " << R._24 << std::endl;
		std::cout << R._31 << " " << R._32 << " " << R._33 << " " << R._34 << std::endl;
		std::cout << R._41 << " " << R._42 << " " << R._43 << " " << R._44 << std::endl;

		std::cout << std::endl;

		// 스 * 자 * 이 * 공 * 부
		// S * R * T * R * P
		// 스케일 * 자전 * 이동 * 공전 * 부모
		world = S * R * T; // T * S와는 다르다! 행렬은 교환법칙이 성립하지 않음

 

만약 계속 회전을 시키고 싶다면, Update( )에서 해당 조작을 해 주면 된다.

	static float radian = 0.0f;
	radian += 0.01f;
	
	D3DXMATRIX P;
	D3DXMatrixRotationZ(&P, radian);

	// 부모 행렬을 곱해주면 부모 행렬에 종속된다!
	world = world * P;

 

 


더 자세한 내용이 궁금하시다면 직접 들어보시는 걸 추천드립니다!

 
Comments