벡터의 내적과 외적


Dot Product & Cross Product


내적


내적

게임 프로그래밍에서 정말 중요한 수학 중 하나이기에 꼭 알아야 하는 개념이다.

dot product 혹은 scalar product라고 불린다.

보통 내적을 하는 벡터 간의 거리, 벡터의 크기, 벡터의 방향등을 알기 위해 사용한다.

A벡터 B벡터 내적


게임 프로그래밍에서는 각 벡터를 정규화 하여 내적하는 경우가 더 많기 때문에 각 벡터를 정규화 과정을 거친 뒤 식을 보자.

normalized A벡터 B벡터 내적


이 과정을 통해 정규화된 벡터 A와 B의 내적은 cosθ 라는 것을 알 수 있다.

게임 프로그래밍에서는 보통 한 위치를 기준으로 다른 위치와의 관계를 알아내기 위해 사용된다.

내적을 사용하면 플레이어를 기준으로 적이 어디에 위치하는지(앞, 뒤)를 판별할 수 있다.

내적 그래프

위의 그래프에서 x축이 좌/우, y축이 전/후를 나타낸다고 했을 때,

cosθ의 값이 양수인 경우 플레이어[좌표(0,0)]을 기준으로 전방에 위치하고,

cosθ의 값이 음수인 경우에 플레이어를 기준으로 후방에 위치한다는 것을 알 수 있다.



외적


외적은 내적과는 또 다른 벡터간의 곱이고, 두 벡터 모두에 수직인 벡터가 결과값이 된다.

내적의 결과 값은 스칼라(크기)였지만, 외적의 결과 값은 벡터로 나온다. 즉, 크기와 방향을 모두 가진다는 이야기이다.

우리가 외적 하면 가장 많이 떠올릴만한 이미지는 이것이다.

Cross Product

보통은 u벡터와 v벡터가 반대로 작성된 것이 아닌가?하는 의문을 가질 수 있지만, 해당 그림은 언리얼 엔진과 DirectX가 기반으로 하는 왼손 좌표계를 기준으로 그린 것이다. 그렇기에 왼손좌표계 기준으로 저 그림이 맞다.

외적에서는 곱하는 순서가 매우 중요하다. 왜냐하면 순서가 바뀌면 결과값도 뒤집어지기 때문이다.

외적의 크기는 각 벡터에 절대값을 적용하고 sinθ를 곱해주면 된다.

왜 저런 식이 나오는지 궁금할 수도 있으니 간략하게 정리해보았다.

Cross Extent

노란 삼각형 부분을 떼어 초록 부분에 붙일 수 있는데, 이러면 직사각형이 된다. 이때 직사각형의 세로 길이는 절대값 u에 sinθ를 곱한 값이 되므로, u와 v에 각각 절대값을 곱한 후 sinθ를 곱한 값이 나오게 된다.


다시 본론으로 돌아와서 외적을 게임 프로그래밍의 어떤 부분에서 쓸까를 생각해보자.

첫번째로, 어떤 한 물체를 기준으로 다른 물체가 좌측에 있는지 우측에 있는지를 판별할 수 있다.

A라는 물체가 있고, 이 물체의 전방 벡터를 안다. 그리고 A에서 B라는 물체를 향하는 벡터를 알고 있다고 해보자. 이 때 외적을 수행하면 이 외적의 결과가 위를 향하는지, 아래를 향하는지에 따라 좌/우 판별을 할 수 있는 것이다.

두번째로, 삼각형의 Normal(법선) 벡터를 구할 수 있다.

삼각형의 노말 벡터는 중요한 역할을 한다. 이 노말 벡터를 통해 백페이스 컬링이 수행되기도 하고, 해당 지면과 위치관계를 파악하여 IK를 수행할 수도 있다.

삼각형을 그린다는 것은, 삼각형의 정점의 좌표를 아는 것이기에, 이를 통해 벡터를 구하고, 삼각형의 노말 벡터를 구할 수 있다.


앞,뒤/좌,우 판별을 하는 등 게임 프로그래밍에서 내적과 외적은 정말 중요하니 꼭 알아두는 것이 좋다.