내적 (Dot Product)

Woogle·2023년 2월 14일
0

C++ 공부

목록 보기
15/28

📄 내적 (Dot Product)

  • A⋅B = |A||B|cosθ
  • A⋅B = AxBx + AyBy + AzBz
  • θ == 0일 때, 내적은 스칼라(절대값)의 곱이다.
    • A⋅A = |A|²

✏️ 끼인각

  • 게임에서 시야각, 백어택 등 구현에 이용 가능.
  • 단, sin과 cos으로 대표되는 초월함수는 Cost가 비싸기 때문에 스칼라 곱으로 변형해서 사용해야함.
    • cosθ = A⋅B / |A||B|

✏️ 수직 판별

  • A벡터와 B벡터가 비슷한 방향이면(θ < 90°), 내적 결과가 양수.
  • A벡터와 B벡터의 반대 방향이면(θ > 90°), 내적 결과가 음수.
  • A벡터와 B벡터의 수직이면(θ == 90°), 내적 결과가 0.
if ((Mathf.Dot(A, B)) == 0)
{
execute MyFunc();
}

✏️ 셰이더

  • Diffuse Shading
    • 라이트 백터와 노말 백터의 끼인각이 0에 가까울 수록 해당 버텍스는 밝아진다.

✏️ 3D 렌더링 최적화

  • Occlusion Culling
    • 카메라에 보이지 않는 뒷면은 렌더링하지 않는다.
    • 카메라의 Forward vector평면의 Normal vector 사이의 내적을 계산
    • 내적 결과가 양수인(끼인각이 90° 이하) 평면은 렌더링 한다 : A, B
    • 내적 결과가 음수인(끼인각이 90° 초과) 평면은 렌더링 안한다 : C, D

✏️ 직교 투영 (Vector Projection)

  • 빛이 닿았을 때 바닥에 투영된 그림자 형태

✏️ 반사 벡터 (Reflection Vector)

  • reflect = p + 2n(-p⋅n)
  • Vector3 reflect = velocity + 2 normal * Vector3.Dot(-velocity, normal)
  • p는 쏘는 벡터(velocity), n은 노말 벡터(normal)

자료 출처

profile
노력하는 게임 개발자

0개의 댓글