DirectX

10. SRT 변환 행렬

devRiripong 2023. 12. 18.
반응형

가장 기본인 T 부터 다뤄본다. 

1. Translation 

1x4 4x4 배열이 아니라 
벡터가 3개니 1x3 배열을 사용하면 뭐가 문제일까? 
X = x+a,

Y = y+b,

Z = z+c

를 만들어 줘야 하는데 [x y z] 배열과 3x3배열의 곱으론 a, b, c를 만들어 줄 수가 없다.
그래서 이렇게

특정 좌표에 M 행렬을 곱해주면 x+a, y+b, z+c 형태가 되어 위치를 이동하게 된다 .

 

2. Scale

X=ax, 

Y=by,

Z=cz

를 만들어 줘야 하는데 

벡터 [x,y,z,1]에 M 행렬을 곱해주면 ax, by, cz 형태가 되어 스케일을 조절하게 된다. 

주의해야 할 부분

모델링 할 때 캐릭터 중심이 어디로 잡혀있는지가 관건이다.
발로 잡혀 있으면 수치 늘리면 키가 커지고 늘어난다. 
하지만 배꼽을 기준으로 한다면 캐릭터가 늘어날 때 어색하게 된다. 그래서 특별한 이유가 아니면 캐릭을 만들 때 발을 기준으로 만든다. 

 

3. Rotation

T, S에 비해 조금 더 복잡하다.
회전식 구하는 과정은 강의를 참조한다. Sin, Cos을 이용해 구한다.

X = xcosB - ysinB,

Y = xsinB + ycosB,

Z = z

를 만들어야 하는데 

 

DirectX9 에서는 좌표 벡터를 행 벡터로 간주하고, 행렬을 그 왼쪽에 곱하고 있는데
DirectX11로 오면서 좌표 벡터를 열 벡터로 간주하고, 행렬을 오른쪽에서 곱하고 있는 듯 하다.  

이렇게 곱해주면 z축으로 회전을 시키게 된다. 

z 축 뿐만 아니라 

X축을 중심으로 한 회전, Y축을 중심으로 한 회전 각각의 행렬을 만들어서 곱해주면 된다. 

 

 

 

만약 캐릭터가 원점이 아니라 엉뚱한 곳에 있는데 z축 회전을 한다면 어떻게 될까? 
회전에도 자전과 공전이 있는데, 공전과 비슷해 진다.
보통 게임에서 원하는 건 자전일 때가 많다. 그럴 때 원점을 기준을 삼아서 만들어야 한다. 

 

4. 순서 지켜서 스자이공부 행렬 

3가지 핵심 SRT에 대해 알아 봤다.
이걸 합해서 하나의 행렬로 만들어 줄 것이다.
따로 만들면 연산을 3번에 걸쳐 해야 하기 때문이다.
공식들의 행렬을 곱해서 최종 행렬을 만들어서 그걸 곱해주면 된다. 
순서를 기억해야 한다. 
Scale, Rotation(자전), Translation, Rotation(공전), Parent
스자이공부
순서를 지켜서 곱해줘야 한다.

왜 순서 지켜야 하나? 
순서 바꿔서 하면 예를 들어 회전 후 스케일을 늘린다 하면, 원래는 x 축 기준이었던게, 엉뚱한 방향으로 늘어 날 수 있다. 또 움직이고 회전을 한다면 자전이 아니라 공전이 된다. 
순서 안지켜도 되지만 원하는 결과가 안나오게 되는거. 

 

5. 코드에서 적용 한다면

지난 번에 constant buffer를 만들어서 offset을 이용해서 이미지를 이동시킨 작업한 게 있었어. 
실제 게임 작업을 할 때는 SRT을 들고 있을 거고 그걸 이용해서 SRT 행렬을 만들어서, cbuffer TransformData의 offset을 행렬로 만들어야 한다. 
그걸 VS에서 곱해줘서 적용 시킨다고 하면 SRT 챙겨줄 수 있다. 

행렬이란 걸 곱해서 조작을 할 수 있는 거다. 

마이크로소프트에서 만들어준 라이브러리를 사용하는 경우도 있고, 행렬들을 사용해서 직접 만드는 경우도 있지만, 일단 여기선 라이브러리를 분석해 보고 사용하는 방향으로 해보자. 

행렬을 만들어야 한다면 어떻게 만들어야 할까? 
보통 4x4 행렬이고, 벡터는 x,y,z를 float로 만들고, 사칙연산 함수를 만들고, 내적, 외적 지원하게끔 만드는게 일반적일 것이다.
행렬도, 2차원 배열로 만들거나, 1차원 배열이라도 편하게 사용할 수 있게 만드는게 일반적일거야. 숫자 16개 받아주는 생성자도 만들어 줄 것이다.
매트릭스끼리 덧셈이 이루어져야 하면, 각 성분끼리 더해주다보니 숫자들이 하나씩 더해지게 만들어 주면 될 것이고, 
행렬의 곱을 해야 하면 곱하는 거 반복하게 짜면 된다. 
매트릭스에서 a,b,c에 따른 벡터를 제공하면 거기에 맞는 매트릭스가 만들어 진다거나, 
스케일도 CreateScaleMaterix 함수 호출하면, 인자로 a,b,c받아주고,  거기에 땨라 행렬 채우는 거 만들면 된다. 
로테이션도, CreateRotationX,Y,Z에 따라서 수치를 채워서 넣어주게끔 만드는 걸 고려할 수 있다. 

얼마든지 만들어 주면 된다. 

4차원 역행렬의 경우는 수학식 보고 코드 쳐주면 된다. 

SRT가 가장 핵심적인 변환이다. 

물체가 움직이는 건 알았으니, 
로컬영역, 월드, 카메라 영역으로 가는 작업들을 해 볼 것이다.
기본적으로 플레이어 움직이는 건 여기까지다.

다음 시간은 로컬, 월드 좌표계 변환에 대해 알아 볼 것이다.

반응형

'DirectX' 카테고리의 다른 글

12. World 변환 행렬  (0) 2023.12.20
11. 좌표계 변환  (0) 2023.12.19
9. 행렬기초  (0) 2023.12.18
8. 행렬 OT  (0) 2023.12.17
7. RasterizerState, SampleState, BlendState  (0) 2023.12.14

댓글