일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 한빛미디어
- 멀티스레드
- 스레드
- static
- 독학
- 컴퓨터 구조
- 컴퓨터구조
- Transform
- dfs
- 혼자 공부하는
- 그래프
- 렌더링 파이프라인
- DirectX
- DDR SDRAM
- 보조기억장치
- CPU 스케줄링
- 풀이
- BFS
- 131701
- 장치컨트롤러
- 혼자공부하는
- C++
- 138477
- 프로세스
- 운영체제
- 인터럽트
- 지역변수
- 코딩테스트
- 입출력장치
- 프로그래머스
- Today
- Total
빼미의 개발일기
[DirectX] - 01. 변환(Transform) (2) 본문
1) 기본 변환
1.5) 변환의 결합 (Concatenation of Transforms)
- 변환 연산에서 행렬을 곱하는 순서는 중요하다.
- 결론적으로 결합 행렬 C = TRS, TRSp = (T(R(Sp))) 이다.
- 예를 들어 스케일 행렬 $S = (2,0.5,1)$ 와 z축 회전 행렬 $R_{z}(\pi / 6)$ 이 있다고 가정한다.
- 한 오브젝트에 대해서 RSp 순서와 SRp 순서로 행렬 연산을 해본다면 결과는 이렇게 달리진다.
- 또한 행렬 결합은 순서 의존적이기 때문에 행렬을 원하는 대로 결합할 수 있다. 예를 들어 TRSp에서 TR를 한번 계산하고 두 행렬을 (TR)(Sp)로 묶어서 연산하는게 가능하다 (순서가 바뀌면 불가능 Ex : (TS)(Rp))
1.6) 강체 변환(The Rigid - Body Transform)
- 강체(Rigid - Body)는 오브젝트의 형태가 변하지 않는 것을 말한다.
- 평행 이동과 회전의 결합으로 이뤄진 변환을 강체 변환이라 하며, 주요 특징은 길이, 각도, 손 좌표계 방향이 보존 된다.
- 임의 강체 행렬 X는 이동 행렬 T(t)와 회전 R의 결합으로 이렇게 표현할 수 있다.
$$ X = T(t)R = \begin{bmatrix} r_{00} & r_{01} & r_{02} & t_{x} \\ r_{10} & r_{11} & r_{12} & t_{y} \\ r_{20} & r_{21} & r_{22} & t_{z} \\ 0 & 0 & 0 & 1 \\ \end{bmatrix} $$
- X의 역행렬은 $X^{-1} = (T(t)R)^{-1} = R^{-1}T(t)^{-1} = R^{T}T(-t)$ 와 같다.
1.7) 법선 변환(Normal Transform)
- 단일행렬(Single Matrix)는 점, 선, 삼각형, 다른 지오메트리 구조를 변환할 수 있지만, 표면 법선(그리고 정점 조명 법선)을 변환하는데는 사용할 수 없다.
- 법선 변환의 전통적인 해결책은 역의 전치를 계산하는 것이나. 종종 생성이 불가능할 때가 있는데, 행렬식이 0이면 해당 행렬을 특이 행렬(Singular Matrix)이라 하며, 이 경우는 역이 존재하지 않는다.
- 법선 변환에 필요한 것은 왼쪽 상단의 3 x 3 성분의 수반 계산하면 된다.
- 하지만 변환 행렬이 이동, 회전, 균등 크기 연산으로 이뤄질 때, 이동 변환은 법선에 영향을 주지 않으며 균등 크기 연산도 길이만 변화할 뿐, 다시 크기의 값으로 나눠서 정규화면 동일해진다. 회전에는 영향이 있지만, 회전 행렬은 역행렬의 전치행렬, 회전행렬 자기 자신이기 때문에 굳이 수반 계산을 할 필요는 없다. (비균등 크기는 다름 - 이땐 수반행렬을 구해봐야 한다.)
- 종합적으로 법선 변환은 대부분의 경우 본래 행렬을 그냥 곱해도 크게 상관이 없다.
1.8) 역의 계산(Computation of Inverses)
- 역은 좌표계 사이를 변경하거나 본래의 위치 혹은 회전으로 돌아가는 등 많은 경우에 필요한데, 다음 3가지중 하나를 사용할 수 있다.
- 행렬이 단일 변환이거나 단순 변환의 연속이라면 매개변수와 행렬의 순서를 역으로 해서 얻을 수 있다.
Ex) $M = T(t)R(\phi)$ 일 때 $M^{-1} = R(-\phi)T(-t)$
이는 단순하며 행렬의 정확도를 보존한다 - 행렬이 직교라면 $M^{-1} = M^{T}$ 이며, 전치가 역이다.
Ex) 회전 행렬의 역 $R^{-1} = R^{T} = R$ - 수반 방식, 크레이머의 법칙, LU 분해나 가우스 소거법으로 역을 계산할 수도 있다. 일반적으로 더 적은 분기 연산을 갖는 크레이머의 법칙과 수반 방식을 주로 사용하나, 현대 아키텍처에서는 되도록 사용하지 않는게 좋다.
- 역의 계산 목적은 최적화를 할 때 고려될 수 있다.
'프로그래밍 > 게임그래픽' 카테고리의 다른 글
[DirectX] - 01. 변환(Transform) (3) (1) | 2023.12.26 |
---|---|
[DirectX] - 01. 변환 (Transform) (1) (2) | 2023.12.19 |
[DirectX] - 00. 렌더링 파이프라인 개요 (3) (1) | 2023.12.18 |
[DirectX] - 00. 렌더링 파이프라인 개요 (2) (1) | 2023.11.28 |
[DirectX] - 00. 렌더링 파이프라인 개요 (1) (2) | 2023.11.25 |