물체를 회전할 때에는 물체가 가지고 있는 노멀 벡터도 함께 회전을 시켜야 한다. 노멀 벡터는 물체의 표면이 어떤 방향을 바라보고 있는지를 나타내는 데이터로 사용된다. 따라서 노멀 벡터는 물체의 표면과 항상 직교를 이루고 있어야 하는데, 물체의 model
변환 그대로 노멀 벡터를 변환하면 상황에 따라 직교를 이루지 않는 경우가 있어 노멀 벡터의 변환은 물체의 model
변환 행렬과 다른 별도의 행렬을 이용해야 한다.
물체의 원래 상태를 a
라고 하고, 물체의 스케일링을 x축으로 2배, y축으로 1배 적용한 상태를 b
라고 해보자. b
상태에서 노멀 벡터는 더 이상 물체의 표면에 직교하지 않게 된다. 이런 non-uniform
한 스케일링이 발생할 때, 직교 상태를 유지하기 위해서는 model
행렬의 역행렬의 전치 행렬을 곱해줘야 c
상태로 만들 수 있다.
c
상태를 유도하는 과정은 다음과 같다. 우선 알아야 할 내용들이다.
- $u$ 는 물체의 표면을 나타내는 벡터다.
- $n$ 은 물체의 표면에 수직인 노멀 벡터다.
- $A$ 는 물체의 변환 행렬이다.
- 어떤 행렬과 그 행렬의 역행렬의 곱은 단위 행렬이다.($AA^{-1} = I$)
- 어떤 행렬의 전치 행렬의 전치 행렬은 원래 행렬이다.($(A^{T})^{T} = A$))
- $(AB^{T})^{T} = BA^{T}$
우선 변환 행렬이 적용되지 않았을 때의 상태를 살펴 본다. 물체의 표면을 나타내는 벡터와 노멀 벡터는 수직 상태일 것이고, 이 두 벡터의 내적은 0이 될 것이다.
$$ u \cdot n = 0 $$
여기에서 $n$ 을 행렬로 취급하고 $n$ 을 전치 행렬로 변환하면 column이 1인 행렬이 되므로, 다음과 같이 표현할 수 있을 것이다.
$$ un^{T} = 0 $$
어떤 행렬과 단위 행렬의 곱 연산의 결과는 원래의 행렬이 된다. 그리고 어떤 행렬과 그 행렬의 역행렬의 곱은 단위 행렬이 되므로, 식을 다음과 같이 변형할 수 있다.
$$ u(AA^{-1})n^{T} = 0 $$
행렬의 곱셈은 결합 법칙이 성립하기 때문에 괄호의 위치를 다음과 같이 조정해준다.
$$ (uA)(A^{-1}n^{T}) = 0 $$
여기에서 $(A^{-1}n^{T})$를 하나의 행렬이라 생각하고, 이 행렬의 전치 행렬의 전치 행렬을 구한다고 하면 다음과 같이 나타내볼 수 있다.
$$ (uA)((A^{-1}n^{T})^{T})^{T} = 0 $$
괄호 안의 전치 행렬 하나를 풀어준다.
$$ (uA)(n(A^{-1})^{T})^{T} = 0 $$
행렬의 곱으로 표현된 식을 다시 내적으로 바꿔준다.(전치 행렬을 다시 사용해주면 된다.)
$$ (uA)(n(A^{-1})^{T}) = 0 $$
결과적으로 노멀 벡터 $n$에 모델 행렬 $A$의 역행렬의 전치 행렬을 곱해주면 된다.
'그래픽스 > DirectX11' 카테고리의 다른 글
회전 행렬 유도 (0) | 2024.05.13 |
---|---|
조명 (0) | 2024.05.08 |
쉐이더 만들기(버텍스, 픽셀) (0) | 2024.04.22 |
버텍스 버퍼, 인덱스 버퍼, 컨스턴트 버퍼 (0) | 2024.04.22 |
RenderTargetView의 의미 (0) | 2024.04.19 |