법선 벡터를 행렬에 적용하기 위한 과정 - Whitmem
법선 벡터를 행렬에 적용하기 위한 과정
그래픽 개발
2025-12-25 15:28 게시 2040ac5d495acadd0911

0
0
5
이 페이지는 외부 공간에 무단 복제할 수 없으며 오직 있는 그대로 게시되며 부정확한 내용을 포함할 수 있습니다. 법률이 허용하는 한 가이드 라인에 맞춰 게시 내용을 인용하거나 출처로 표기할 수 있습니다.
This page is not to be distributed to external services; it is provided as is and may contain inaccuracies.
기본적으로 점을 특정 좌표계 공간으로 이동하기 위해서 해당 좌표 공간으로 이동하기 위한 행렬을 곱함으로써 이동할 수 있습니다.
이러한 행렬은 해당 좌표계의 회전 차이만큼 회전하는 행렬의 역행렬로, 기존 (X, Y) 좌표를 넣으면 새로운 좌표계의 (O, P) 가 나오기 때문입니다.
* 단순 좌표 기저 벡터를 세로로 넣은 행렬은 새로운 좌표계 (O, P)를 넣으면 기존 (X, Y)로 반환해주는데, 이를 역행렬을 곱하면 기존 (X, Y)를 넣으면 (O, P)가 나오는 좌표계 변환 행렬이 되기 때문입니다.
단순 행렬
보통 월드 행렬은 회전, 위치, 스케일 정보를 포함하고 있기 때문에 해당 행렬을 사용해서 곱하면 이동 된 새로운 좌표계 공간을 얻을 수 있습니다.
왼쪽 객체에서 오른쪽 객체로 변환하기 위해서 단순히 행렬을 곱하면 됩니다.
다만, 법선 벡터의 경우 이동 행렬을 제외하기 위해 (x, y, z, w) 에서 w를 0으로 기입한 뒤 행렬을 곱하면, 이동 행렬은 제외된 방향 벡터가 나옵니다. 방향 벡터는 표면의 수직의 발로부터의 방향을 가르키는 벡터이기 때문에 원점 (0, 0)으로부터의 방향을 가르킵니다.
그런데 행렬이 스케일을 가지고 있는 경우에는 말이 달라집니다.
스케일을 가지고 있는 행렬
비균등한 행렬의 경우, 방향 벡터도 같이 스케일링되면서 법선 벡터의 기준, 즉 표면으로부터의 수직이라는 조건에 부적합합니다. 즉 방향 벡터도 같이 어떤 처리 과정을 거치면서 표면에 더 이상 수직이지 않게 됩니다. 즉 비균등 행렬일 때는 법선 벡터가 변형되면서 법선의 의미를 잃게 될 수 있습니다.
따라서 법선 벡터를 특정 공간으로 이동하기 위해서는 특수한 연산을 부가적으로 사용해야하는데, inverse-transpose 행렬입니다. 기존 행렬을 M이라고 한다면, M-T 행렬을 곱해야 합니다. 코드로 보면 transpose(inverse(M)) 입니다. 이 행렬이 어떻게 유도됐는지는 다음을 참고하면 됩니다.
일단 평면의 법선 벡터이기 때문에, 법선 벡터와 평면위 벡터의 내적은 0이 됩니다.
위 계산식을 행렬 계산식으로 바꾸기 위해 n의 transpose 를 구한 뒤 t와 행렬 곱하면 0이 됩니다.
일반 법선 벡터는 어떤 행렬을 곱함으로써 변환된 법선 벡터를 얻고, 표면위의 벡터는 항상 표면위를 따라 다니기 때문에 기존 변환 행렬을 그대로 곱합니다. 여기서는 B가 기존 Model 좌표계에서 World 좌표계로 옮기는 World Matrix 라고 보면 됩니다.
위 예시를 보면 빨강 벡터는 표면위의 벡터입니다. 즉 위 식의 관계에서 n과 t는 각각 방향 벡터라고 가정합니다.
일반적으로 일반 방향 벡터는 World Matrix와 같이 변환 행렬을 곱하더라도 원래 형상을 그대로 따라가기 때문에 이는 행렬을 그대로 곱하더라도 문제가 없습니다. 다만 Normal 벡터는 표면에 수직인 벡터라는 특수한 방향 벡터이기 때문에 변환 과정에서 수직 관계가 깨질 뿐이지, 방향 벡터로 틀린 것은 아닙니다. 여기서 우리는 여전히 수직인 법선 벡터를 구해야하는 것이므로 특수한 관계 식을 하나 만들어 나가는 것입니다.
즉 An Bt 의 내적(법선 벡터의 특수 A 변환과 평면 벡터의 일반 변환의 내적) 은 0이고, 이를 행렬로 나타내면 아래와 같습니다.
이 때, 아까 본 식의 전제 조건에서 원본 접선과 노말의 각도는 90도 이므로, 내적은 0이라고 가정했습니다.
즉 이 내적이 0이므로, Transpose(A) * B 는 반드시 Identity Matrix 즉 단위 행렬이 돼야 모든 경우에 대해서 Transpose(N) * t 가 0이 됩니다. 이를 A = 꼴로 정리 해주면,
즉 A는 위와 같은 행렬이 완성됩니다. 이제 이 행렬을 Normal 에 곱해주면 표면에 수직인 변환된 행렬을 구할 수 있습니다.
댓글 0개
댓글을 작성하는 경우 댓글 처리 방침에 동의하는 것으로 간주됩니다. 댓글을 작성하면 일회용 인증키가 발급되며, 해당 키를 분실하는 경우 댓글을 제거할 수 없습니다. 댓글을 작성하면 사용자 IP가 영구적으로 기록 및 부분 공개됩니다.
확인
Whitmemit 개인 일지 블로그는 개인이 운영하는 정보 공유 공간으로 사용자의 민감한 개인 정보를 직접 요구하거나 요청하지 않습니다. 기본적인 사이트 방문시 처리되는 처리 정보에 대해서는 '사이트 처리 방침'을 참고하십시오. 추가적인 기능의 제공을 위하여 쿠키 정보를 사용하고 있습니다. Whitmemit 에서 처리하는 정보는 식별 용도로 사용되며 기타 글꼴 및 폰트 라이브러리에서 쿠키 정보를 사용할 수 있습니다.
이 자료는 모두 필수 자료로 간주되며, 사이트 이용을 하거나, 탐색하는 경우 동의로 간주합니다.