벡터 내적

여기서 말하는 벡터는 C++std::vector가 아니라 수학에서의 벡터입니다.

게임, 특히 클라이언트 개발에서 질리도록 쓰게 될텐데요,

???: 벡터 내적에 대해 아는대로 말해보세요.

면접 중에 이런 질문을 받는다면 어떻게 대답하실 건가요?

벡터 내적의 3가지 활용법에 대해 아주 간단히 알아보겠습니다.

램버트 코사인 법칙

램버트 코사인 법칙이란?

$$ v_1 \cdot v_2 = |v_1| \times |v_2| \times cos(사잇각) $$

두 벡터의 내적은 각 두 벡터 길이, 그 사잇각의 코사인을 곱한 것과 같다는 법칙입니다.

어떻게 활용하는지에 대한 글이므로 왜 그렇게 되는지는 다루지 않겠습니다.

이 글에서 소개할 세 가지 방법은 모두 램버트 코사인 법칙을 이용합니다.

모두 단위벡터 → $cos(사잇각)$

램버트 코사인 법칙을 활용하라면 가장 먼저 떠올릴 수 있을 방법입니다.

$v_1 \cdot v_2 = cos(사잇각)$이 되기 때문에 acos를 통해 각도를 구할 수 있습니다.

코사인을 구할 때 방향벡터가 있다면 초월함수라서 엄청 느린 코사인을 대신할 수도 있죠.

길이를 모름 → 앞뒷면 판별

코사인은 -90°에서 90°까지는 양수, 그 외에는 음수가 됩니다.

벡터의 길이는 음수가 될 수 없기 때문에 내적에서 부호는 코사인만이 결정할 수 있습니다.

어떤 면의 접선과 뷰 벡터를 내적한 결과가 음수라면 그 면은 뒷면입니다.

하나만 단위벡터 → 수선의 발 길이

위의 두 경우보다는 활용이 드문 경우입니다.

특정 벡터의 주어진 방향에 대한 수선의 발의 길이를 구할 때에도 활용할 수 있습니다.

설명은 사진으로 대체하겠습니다. 다크모드 쓰시는 분들께는 눈뽕 죄송

벡터 내적으로 $v_1$ 방향에 내린 $v_2$의 수선의 발을 구하는 과정 (램버트 코사인 법칙, 삼각형의 닮음 활용)

벡터 내적으로 $v_1$ 방향에 내린 $v_2$의 수선의 발을 구하는 과정 (램버트 코사인 법칙, 삼각형의 닮음 활용)