평면의 scaling, rotation, translation 할 때마다 평면의 normal vector도 그에 따라 변환을 해줘야 한다.
rotation, translation은 normal vector에도 같은 변환행렬을 곱해주면 되지만,
scaling의 경우 그대로 곱해줄 경우 normal vector의 잘못된 변환이 일어날 수 있다.
정확히는 non-uniform scaling에서 normal vector에 scaling 행렬을 그대로 곱해주면 잘못된 변환이 일어난다.
uniform scaling이란 모든 축이 같은 크기로 scaling 하는 것이고 non-uniform scaling은 그게 아닌 거다.

위 그림의 경우 y축은 그대로인데 x축만 scaling이 되었다. 즉, non-uniform scaling이 일어났다.
scaling 행렬을 normal vector에 곱해주면 (b)와 같이 잘못된 변환이 일어난다. 그래서 이럴 때는 그대로 곱해주는
게 아니라 (c) 처럼 scaling 행렬의 역행렬의 전치 행렬을 곱해줘야 한다.

식의 유도 과정이다. dot(u,n)에서 n을 전치행렬로 바꾸면 u와 n이 (1*3)행렬과 (3*1)행렬의 형태가 된다.
그렇게 벡터*벡터를 행렬*행렬의 형태로 만들어 준다. 그리고 유도 과정을 거치다 보면 u에 A를 곱한 행렬과
n에 A의 역행렬의 전치행렬을 곱한 것을 내적했을 때 0, 즉 수직이 된다. 이렇게 non-uniform scaling일 때
normal vector을 변환하는 법은 scaling 행렬의 역행렬의 전치행렬을 곱해주면 된다는 걸 알 수 있다.
'그래픽스' 카테고리의 다른 글
| [그래픽스] 렌더링 파이프라인 (0) | 2023.07.18 |
|---|---|
| [그래픽스] DirectX 초기화 (0) | 2023.07.18 |
| [그래픽스] Row-Major vs Column-Major (0) | 2023.05.30 |
| [그래픽스] Blinn Phong으로 lighting 계산하기(halfway vector) (0) | 2023.05.29 |
| [그래픽스] Perspective Projection 비율 문제 해결 (0) | 2023.05.28 |