[DirectX11] 행렬의 연산순서

jh Seo·2024년 1월 12일
0

directX공부

목록 보기
1/1

개요

예전 directx sdk (june 10)의 sample들의 tutorial이 공부하기 좋다고
검색중에 봐서 연습중이였다.

Tutorial 5: 3D Transformation을 진행 중이였다.
큐브 하나를 생성 후, 나머지 하나도 생성하고 공전시키는 게 목표였다.

여기서 궁금했던 건, document에

    // 2nd Cube:  Rotate around origin
    XMMATRIX mSpin = XMMatrixRotationZ( -t );
    XMMATRIX mOrbit = XMMatrixRotationY( -t * 2.0f );
    XMMATRIX mTranslate = XMMatrixTranslation( -4.0f, 0.0f, 0.0f );
    XMMATRIX mScale = XMMatrixScaling( 0.3f, 0.3f, 0.3f );
    
    g_World2 = mScale * mSpin * mTranslate * mOrbit;

An important point to note is that these operations are not commutative. The order in which the transformations are applied matter. Experiment with the order of transformation and observe the results.

순서가 아주 중요하니 바꾸면서 변화 관측하라고 적혀있었다.

왜 저 순서가 나오는지 이해가 안 갔다.
scale을 하고 z축 회전을 하고 이동을 하고 y축 회전을 하라는 데,
아무리 생각해도 왜 결과가 공전인지 모르겠어서 정리해봤다.

정리

검색을 해보니 directX뿐만아니라 대부분의 그래픽 라이브러리에서
오른쪽에서 왼쪽으로 연산을 한다고 한다.

따라서 위 코드같은 경우에는 mOrbit, y축으로 회전을 먼저 한 후, 회전한 좌표계에서 x축으로
-4만큼 이동한다. 그 후 z축으로 회전 하고 0.3배 스케일링을 한다.

따라서 y축으로 회전후 회전한 좌표계의 x축으로 이동하므로 결과적으로 y축을 기준으로
4만큼 떨어져서 공전하는 것처럼 보이는 것이다.

실험으로

g_World2 = mScale * mSpin * mOrbit*mTranslate;

이런식으로 작성하면 먼저 이동후 회전,회전,스케일링을 하게 되므로 공전하지 않고 자전하겠다 싶어서
변경 후 실행해봤더니 예상대로 원점에서 -4만큼 떨어진 곳에서 뒤틀리며 자전을 한다

profile
코딩 창고!

0개의 댓글