점과 벡터, 표면의 방향
점은 ‘어디에 있는가’, 벡터는 ‘어느 방향으로 얼마나 가는가’를 나타냅니다. A=(1,2)에서 B=(4,6)으로 향하는 벡터는 B-A=(3,4)입니다. 길이는 √(3²+4²)=5입니다.
길이를 1로 맞추기
벡터를 길이로 나누면 방향은 같고 길이는 1인 단위 벡터가 됩니다. 이를 정규화라고 합니다. 길이가 0인 벡터는 나눌 수 없으므로 따로 처리해야 합니다.
import math
v = (3, 4)
length = math.sqrt(v[0] ** 2 + v[1] ** 2)
unit = (v[0] / length, v[1] / length)
print(unit)
결과는 (0.6, 0.8)입니다. 방향만 비교하거나 조명 계산을 할 때 단위 벡터를 자주 씁니다.
내적과 법선
두 벡터의 내적은 대응 성분을 곱해 더합니다. (a,b)·(c,d) = ac+bd입니다. 단위 벡터끼리의 내적은 사이 각도의 코사인입니다. 같은 방향이면 1, 수직이면 0, 반대면 -1입니다.
**법선(normal)**은 표면에 수직인 방향입니다. 빛이 표면을 얼마나 정면으로 비추는지 보려면 법선과 빛 방향의 내적을 계산합니다. 세 점으로 만든 삼각형에서는 두 변의 외적으로 법선을 구할 수 있습니다. 변의 순서를 바꾸면 법선 방향도 반대로 바뀝니다.
확인 문제
(10,0)과 (1,0)은 같은 방향입니다. 정규화하지 않고 조명 내적에 넣으면 어떤 문제가 생길 수 있을까요?
해설 보기
방향이 같아도 벡터 길이 때문에 결과가 10배 달라질 수 있습니다. 방향의 각도만 쓰는 계산이라면 먼저 정규화해야 합니다. 위치, 길이, 방향 중 어떤 정보가 필요한지 구분하세요.