내적

Woogie_·2025년 5월 22일

게임 수학

목록 보기
10/15

벡터의 내적 (Dot Product)

  • 벡터의 연산
    • 기본 연산
    • 유용한 연산
  • 기본 연산이란?
    • 벡터 생성에 관여하는 중요한 연산
  • 유용한 연산의 종류
    • 벡터와 벡터의 곱 (a,b,c)(d,e,f)=(ad,be,cf)(a, b, c) \cdot (d, e, f) = (ad, be, cf)
    • 벡터의 내적
    • 벡터의 외적 (3차원에서만 성립)

벡터의 내적 (Dot Product)

(a,b)(c,d)=ac+bd(a, b) \cdot (c, d) = ac + bd
  • 벡터 내적의 성질

    • 교환 법칙 : uv=vu\vec{u}\cdot \vec{v}=\vec{v}\cdot \vec{u}
    (a,b)(c,d)=ac+bd(c,d)(a,b)=ca+db(a,b)(c,d)=(c,d)(a,b)(a,b)\cdot (c,d)=ac+bd \\ (c,d)\cdot (a,b)=ca+db \\ \therefore (a,b)\cdot (c,d)=(c,d)\cdot (a,b)
    • 결합 법칙 : (uv)wu(vw)(\vec{u}\cdot \vec{v})\cdot \vec{w}\ne\vec{u}\cdot (\vec{v}\cdot \vec{w})
    • 분배 법칙 : u(v+w)=uv+uw\vec{u}\cdot (\vec{v}+\vec{w})=\vec{u}\cdot \vec{v} + \vec{u}\cdot \vec{w}
  • 유용한 벡터 내적의 식

(u+v)(u+v)=uu+vv+2(uv)(x,y)(x,y)=x2+y2(u+v)(u+v)=uu+vv+2(uv)=u2+v2+2(uv)(u+v)\cdot (u+v)=u\cdot u+v\cdot v+2(u\cdot v)\\ (x,y)\cdot (x,y)=x^2+y^2\\ (u+v)\cdot (u+v)=u\cdot u+v\cdot v+2(u\cdot v)=|u|^2+|v|^2+2(u\cdot v)
  • v=(x,y)\vec{v}=(x,y) 의 크기는 v=x2+y2|v|=\sqrt{x^2+y^2} 노름(Norm)

  • vv=v2\vec{v}\cdot \vec{v} = |v|^2

벡터 내적의 코사인 공식

  • 벡터 내적에서 가장 중요한 공식
ab=abcosθa\cdot b=|a||b|cos\theta
  • 코사인 공식의 유도

  • 점 B를 원점에 두고 변을 벡터로 설정할 때 각 점의 위치
B=(0,0)C=(a,0)A=(ccosβ,csinβ)B=(0,0)\\ C=(|\vec{a}|,0)\\ A=(|\vec{c}|cos\beta, |\vec{c}|sin\beta)
  • 벡터 b\vec{b}의 계산
b=(CA)=(accosβ,csinβ)\vec{b}=(C-A)=(|\vec{a}|-|\vec{c}|cos\beta, |\vec{c}|sin\beta)
  • 벡터 b\vec{b}의 크기를 제곱한 결과는 벡터를 내적한 결과와 동일
b2=(accosβ)2+csinβ2=a22accosβ+ccosβ2+csinβ2=a2+c22accosβ=bb|\vec{b}|^2=(|\vec{a}|-|\vec{c}|cos\beta)^2+ |\vec{c}|sin\beta^2\\ =|\vec{a}|^2-2|\vec{a}||\vec{c}|cos\beta+|\vec{c}|cos\beta^2+|\vec{c}|sin\beta^2\\ =|\vec{a}|^2+|\vec{c}|^2-2|\vec{a}||\vec{c}|cos\beta\\ =\vec{b}\cdot \vec{b}
  • 벡터 b\vec{b}를 벡터 a,c\vec{a}, \vec{c}로 바꾸어 표현
bb=(ac)(ac)=(a+(c))(a+(c))=a2+c22ac\vec{b}\cdot \vec{b}=(\vec{a}-\vec{c})\cdot (\vec{a}-\vec{c})= (\vec{a}+(-\vec{c}))\cdot (\vec{a}+(-\vec{c}))\\ =|\vec{a}|^2+|\vec{c}|^2-2\vec{a}\cdot \vec{c}
  • 두 식을 비교하면 다음과 같은 결과
2accosβ=2acac=accosβ-2|\vec{a}||\vec{c}|cos\beta=-2\vec{a}\cdot \vec{c} \\ \therefore \vec{a}\cdot \vec{c}=|\vec{a}||\vec{c}|cos\beta
  • 두 벡터의 크기가 1인 경우
ab=cosθ\vec{a}\cdot \vec{b}=cos\theta

벡터 내적의 직교성 판별

  • 벡터의 크기가 0이 아닐 때 내적이 0이 나오는 경우는 코사인 함수가 0 일 때

  • 이는 두 벡터가 서로 직각을 이룰 때만 성립

  • 이러한 두 벡터가 90°90\degree 를 이루고 있는 성질을 직교성

    • 예)

  • (cosθ,sinθ)(cos\theta, sin\theta)

  • (sinθ,cosθ)(-sin\theta, cos\theta)

  • 두 벡터가 직교한다는 것을 직접 그림으로 확인하지 않아도 내적으로 증명 가능

(cosθ,sinθ)(sinθ,cosθ)=0(cos\theta, sin\theta)\cdot (-sin\theta, cos\theta)=0

리지드 트랜스포메이션 ( Rigid Transformation )

  • 물체의 형태가 변하지 않는 변환의 조건은 무엇인가?
    • 공간을 구성하는 모든 기저 벡터의 크기가 1
    • 모든 기저 벡터가 서로 직교하고 있어야 함
    • 선형 변환의 행렬식 값이 1
  • 이를 만족하는 변환은 회전 변환
[cosθsinθsinθcosθ]\begin{bmatrix} cos\theta & -sin\theta \\ sin\theta & cos\theta \end{bmatrix}
  • 따라서 회전 변환은 물체의 형태를 변형시키지 않음

벡터 내적의 활용

앞뒤 판별

  • 벡터 내적의 코사인 공식을 활용해 목표물이 앞에 있는지 뒤에 있는지 파악 가능
  • 사잇각이 (90°,90°)(-90\degree, 90\degree) 범위에 있으면 앞에 있음을 의미하고 코사인 함수는 해당 범위에서 항상 양의 값을 가짐

  • 두 벡터를 내적한 결과 값이 양수면 앞에 있고, 음수면 뒤에 있음을 바로 파악이 가능

시야 판별

  • 아래와 같은 상황을 가정

  • 캐릭터에 시야각을 설정하고 목표물이 시야각 내에 있는지 확인

α\alpha가 시야각의 절반 값 β2\frac{\beta}{2} 보다 작다면 목표물은 시야각 내에 위치한다고 볼 수 있다.

그렇다면 이를 어떻게 파악할 수 있을까?

  1. cosβ2cos\frac{\beta}{2} 값을 미리 구해 저장
  2. 시선벡터와 목표물로 향하는 벡터의 크기를 1로 조정한다. 그렇다면 두 벡터의 내적은 cosαcos\alpha
  3. 코사인 함수는 (0°,180°)(0\degree, 180\degree) 범위에서 각이 증가할수록 값이 감소
  4. 따라서 두 코사인 함수 값을 비교해 cosαcos\alpha 값이 더 크면 시야범위 내에 있다고 파악

음영 계산

  • 램버트 코사인 법칙 : 물체 표면이 반사하는 빛의 휘도(Luminance)는 표면 방향과 광원 방향의 사잇각의 코사인 값에 비례

투영 벡터 공식

  • 벡터 uu의 투영 벡터 벡터 벡터 vv'vv 는 크기만 다를 뿐 같은 방향을 가짐

업로드중..

  • 벡터 v^\hat{v}는 다음과 같이 구할 수 있음
v^=vv\hat{v}=\frac{v}{|v|}
  • 벡터 vv'의 크기는 코사인 함수를 사용해 구할 수 있음
v=ucosθ|v'|=|u|cos\theta
  • 이를 위해서는 사잇각 θ\theta를 알아야 한다. 이는 내적으로 구할 수 있음
uv=uvcosθcosθ=uvuvu\cdot v=|u||v|cos\theta \\ \therefore cos\theta=\frac{u\cdot v}{|u||v|}
  • 이를 대입하면 투영 벡터의 최종 식을 구할 수 있음
v=(uv)vv2=(uv)v(vv)v'=\frac{(u\cdot v)\cdot v}{|v|^2}=\frac{(u\cdot v)\cdot v}{(v\cdot v)}

여기서 투영 하려는 벡터의 크기가 1이라면 이 식은 다음과 같이 단순해짐

v=(uv)vv'=(u\cdot v)\cdot v
profile
상상을 구현하는 개발자

0개의 댓글