Quick Reference
법선은 표면의 모든 접선에 수직이어야 합니다. 접선이 At로 바뀌면 새 법선은 (A⁻¹)ᵀn으로 잡아 수직 관계를 보존합니다. A는 가역인 선형 부분이고, 방향만 쓸 때는 마지막에 정규화합니다.
원래: nᵀt=0
n′=(A⁻¹)ᵀn, t′=At
n′ᵀt′ = nᵀA⁻¹At = nᵀt = 0같은 행렬을 쓰면 틀리는 예
2차원 접선 t=(1,1), 법선 n=(1,-1)은 내적이 0입니다. x축만 2배로 늘리는 A=diag(2,1)을 적용합니다.
t′=At=(2,1)
잘못된 후보: An=(2,-1)
(2,-1)·(2,1)=3 → 수직이 아님
역전치 적용: n′=(1/2,-1)
(1/2,-1)·(2,1)=0
정규화한 법선: (1,-2)/√5길이를 1로 만드는 것만으로 잘못된 방향을 고칠 수는 없습니다. An을 정규화해도 위 접선과의 내적이 0으로 바뀌지 않습니다. 먼저 수직 관계에 맞는 변환을 적용하고 길이를 정리합니다.
접선과 법선이 다른 이유
접선은 표면을 따라 변하는 위치 차이이므로 선형 부분 A로 옮깁니다. 법선은 그 접선에 내적했을 때 0이 되는 조건을 표현합니다. 모든 접선에 대한 조건을 유지하려면 역변환과 전치가 필요합니다.
법선 방향은 0이 아닌 배수를 곱해도 같은 수직 평면을 나타낼 수 있습니다. 따라서 위 식은 한 가지 표준 선택이며, 조명 계산에서는 이를 정규화합니다. 원래 법선 n도 영벡터가 아니어야 합니다.
평행이동과 평면 식
아핀 변환 y=Ax+b에서 방향에는 b가 적용되지 않습니다. 원래 평면 식이 nᵀx=d이면 x=A⁻¹(y−b)를 넣어 다음 관계를 얻습니다.
n′ = (A⁻¹)ᵀn
d′ = d + n′ᵀb
변환된 평면: n′ᵀy = d′법선만 정규화해 평면 식에 넣으려면 d′도 같은 길이로 나눠야 합니다. n′만 나누고 상수는 유지하면 평면의 위치가 달라집니다. 셰이딩에 필요한 단위 법선과 거리·교차 판정에 쓰는 평면 전체 계수를 구분합니다.
회전·반사·특이변환
| 선형 부분 A | 법선 처리 |
|---|---|
| 직교행렬 | (A⁻¹)ᵀ=A이므로 같은 행렬 사용 가능 |
| 0이 아닌 균일 스케일과 직교변환 | 같은 A를 곱한 뒤 정규화해도 같은 방향 |
| 비균일 스케일·기울임 | 일반적으로 역전치 필요 |
| 특이행렬 | 역전치 공식 사용 불가 |
3차원의 두 접선 u와 v를 변환해 외적으로 법선을 만들면 다음 항등식이 성립합니다. A는 가역입니다.
(Au)×(Av) = det(A)(A⁻¹)ᵀ(u×v)det(A)<0인 반사에서는 외적으로 얻은 정점 순서 기반 방향이 역전치 법선과 반대가 될 수 있습니다. 법선 필드의 방향, 메시 winding, 컬링 설정을 함께 맞춥니다. 어느 경우에나 determinant 부호를 무조건 한 번 더 곱하는 규칙으로 단순화하지 않습니다.
A가 특이해도 변환된 두 접선이 독립이면 그 외적으로 새 표면의 법선을 구할 수 있습니다. 다만 표면 자체가 선·점으로 붕괴하면 같은 방식으로 유일한 표면 법선을 얻지 못합니다.
그래픽스 연결
점의 w를 0으로 바꾸면 이동 영향은 제거할 수 있지만, 잘못된 선형 부분을 법선에 곱하는 문제까지 해결되지는 않습니다. 실제 shader 입력·CPU 계산 위치·uniform 연결은 OpenGL 법선과 조명, 역행렬의 존재 조건은 역행렬에 있습니다.
참고 링크
2 sources