1 분 소요

벡터

이미 이전에 3D 관련으로 정의한 적이 있으나 좀 더 심층적으로 알아보려 한다

벡터의 길이와 단위벡터

벡터에는 ‘크기’와 ‘방향’이 존재한다
(크기를 벡터의 ‘길이’라고도 표현한다)

이때 크기가 1인 벡터를 ‘단위벡터’(unit vector)라 하고
임의의 벡터를 ‘크기’가 1인 벡터로 만드는 것을 ‘정규화’(normalize)라 한다

벡터의 길이는
l = sqrt(v.x * v.x + v.y * v.y + v.z * v.z) 로 정의하며
단위벡터는
uV = (v.x / l, v.y / l, v.z / l) 로 정의된다

  • 단위벡터를 사용하는 이유?
    벡터의 ‘방향’만이 필요한 경우를 위해 사용
    (ex : 회전, 법선벡터의 표현)
    단위벡터가 아니라도 계산 자체는 가능하나
    불필요한 ‘크기’로 인하여 값이 커질 수 있음
    (일반적으로 단위벡터에 필요한 만큼의 ‘크기’를 곱하여 사용한다)
    (‘적의 방향’을 단위벡터로 구하고, ‘사정거리’를 곱하여 공격 가능한지 판별한다던가)

두 점으로 정의한 벡터

점 p 에서 점 q로부터의 벡터 v는 다음과 같이 표시

Image


벡터 연산

두 벡터 p 와 q, 그리고 상수 c 가 존재할 때,
다음과 같은 벡터 연산을 정의할 수 있으

  1. 덧셈
    p + q = (p.x + q.x,p.y + q.y,p.z + q.z)
    (뺄셈은 사실상 덧셈과 유사)

  2. 스칼라 곱셈
    c * p = (p.x * c,p.y * c,p.z * c)

  3. 내적(dot product)
    p * q = p.x * q.x + p.y * q.y + p.z * q.z = len(p) * len(q) * cos(theta)
    (이 때, theta는 두 벡터의 각도)

  4. 외적(cross product)
    p x q = (p.y * q.z - p.z * q.y, p.z * q.x - p.x * q.z, p.x * q.y - p.y * q.x)

벡터의 내적

내적은 ‘두 벡터’사이의 각도를 판별하는데 자주 쓰이는 중요한 값
아래의 cos 그래프를 보면 알 수 있듯이

cos(theta)는 0~90, 270~360 사이에서 양의 값을 갖는다
이런 방식을 이용해 ‘카메라 방향’ 좌표와
물체의 면에 직교하는 ‘법선벡터’(normal)을
내적하여 그 값이 양수인 경우에만 화면에 표시하는
은면제거(backface-culling)에 사용 가능하다
(이전에 언리얼 머티리얼에 나온 fresnel도 내적을 이용)

Image

내적은 3D 그래픽 전반에 걸쳐 많이 사용되는데
특히 좌표 변환과 ‘조명 계산’에 자주 사용된다

조명을 계산할 때, 광원과 법선 벡터의 내적만으로도
괜찮은 조명 효과를 줄 수 있기 때문

Image

이미지는 간단한 조명모델인 ‘램버트 조명모델’
(광원의 방향과 법선 벡터간의 각도 차이를 내적하여
해당 ‘면’에 빛이 얼마나 ‘잘 받을 수 있는지’를
간략히 계산할 수 있음)


벡터의 외적

외적 연산의 결과 벡터는
두 벡터와 ‘직교’하는 벡터가 나온다는 점도 기억해두자
(직교 : 90도 만나는)

Image

3차원 공간에서 3개의 점이나 2개의 벡터에 의해 ‘면’이 생성되는데
이 때, 2개의 벡터를 ‘외적’함으로서 해당 면의 ‘법선벡터’를
구할 수 있음
(다만 그림과 같이 연산 순서가 반대인 경우, 방향이 정반대가 된다)


댓글남기기