[게임 수학] 내적 활용
내적
\(\mathbf{A\cdot B=\left|A\right|\left|B\right|\cos\theta}\)
벡터의 내적은 같은 차원의 두 벡터가 주어졌을 때, 벡터를 구성하는 각 성분을 곱한 후 이들을 더해 스칼라를 만들어내는연산입니다. 즉, 두 벡터가 결국 스칼라로 됩니다.
게임에서는 물체를 랜더링 할 때 밝은 곳과 어두운 곳이 생기는데 이것을 계산 할 때 내적이 사용됩니다. 보이지 않는 곳을 제외 할 때도 사용합니다. 전투 판정에서도 앞뒤 판정이나 타겟이 얼마의 각도에 있는지를 알고자 할 때 사용합니다.
앞뒤 판별
\(\mathbf{A\cdot B > 0}\) : 두 벡터의 내적의 결과가 0보다 크면 두 벡터가 이루는 각이 예각이므로 캐릭터 앞에 목표물이 있다고 판별 할 수 있습니다.
\(\mathbf{A\cdot B = 0}\) : 두 벡터의 내적의 결과가 0이면 두 벡터가 이루는 각이 직각입니다.
\(\mathbf{A\cdot B < 0}\) : 두 벡터의 내적의 결과가 0보다 작으면 두 벡터가 이루는 각이 둔각이므로 캐릭터 뒤에 목표물이 있다고 판별 할 수 있습니다.
두 벡터의 사잇각
\(\mathbf{\theta = \arccos ( { A \cdot B \over \left|A\right|\left|B\right| } )}\)
A, B 벡터 모두 단위 벡터라면 내적의 결과에 arccos을 해주면 사잇각을 구할 수 있습니다.
\(\mathbf{\theta = \arccos ( A \cdot B )}\)
반사 벡터 구하기
\(\mathbf{반사 벡터 = p+2n(-p \cdot n)}\)
당구공이 벽에 충돌 후 반사되어 나가는 경우를 생각해 봅시다.
n는 벽에 수직인 법선 벡터(노멀 벡터)를 의미합니다. 여기서 n은 단위 벡터 상태입니다.(단위 벡터는 길이가 1인 벡터를 의미합니다.)
반사 벡터를 구하기 위해 p의 방향을 바꾸어 줍니다. \(\mathbf{-p \cdot n}\) 내적의 결과로 스칼라 값이 하나가 나옵니다.
내적의 결과에 법선 벡터 n을 두 배하여 곱합니다. 결과적으로 n을 길게 늘려준 벡터가 생겨납니다.
결국, 반사 벡터는 다음과 같이 \(\mathbf{p+2n(-p \cdot n)}\)가 됩니다.