Game Development, 게임개발/게임 수학,물리

벡터(Vector) - 3(외적, Cross product) [게임수학]

게임이 더 좋아 2021. 3. 10. 04:51
반응형
728x170

이번에는 외적에 대해서 조금 알아보려고 한다.

내적이랑 비슷하겠지 생각하면 

정답 

 

다를 거 없다. 알아보자

 

** Outer Product라고도 부르는데 이는 벡터곱이 아닌 텐서곱을 의미한다. 결과값이 행렬로 나온다.

 


 

벡터의 외적은 두 벡터를 가지고 다른 벡터를 만드는 연산이다.

다만 그 벡터가 두 벡터에 대해 수직인 벡터일 뿐...

 

아래 그림이 바로 외적 그림이다.

u가 v,w가 만드는 평면에 대한 법선벡터가 되는 것이다.

 

 

 

** 법선벡터 2개 아닌가요? 위 아래 2개? 라고 할 수 있다.

맞다!! 2개가 나온다.. 그래서 외적이 교환법칙이 성립하지 않는 이유다.

곱하는 순서에 따라 벡터의 방향이 반대로 나와서 그렇다.

 

 

왼손 좌표계를 쓸 것이냐 아니면 오른손 좌표계를 쓸 것이냐? 에 따라 달라진다.

3D 그래픽 라이브러리 마다 쓰는 좌표계가 다른데

DirectX의 경우 왼손 좌표계를 기본으로 쓴다고 하고

OpenGL의 경우 오른손 좌표계를 쓴다고 한다.

 

딱히 외울 필요도 없다. 그냥 받아들이면 된다.

 

실제로 유니티에서는 외적을 이렇게 표현한다.

Vector3.Cross(VectorA, VectorB)

 

 


 

과연 외적의 연산은 무엇을 의미할까?

 

 

 

외적의 결과는 결국 평행사변형의 넓이가 된다.

이것은 연산의 의미이다. 

내적과 비슷하게 성분으로도 외적을 구할 수 있는데

우리가 알고 있는 신발끈 공식이 이거다.

 

외적의 수식자체의 의미가 그렇게 큰 것은 아니지만

외적의 연산에는  곱셈, 뺄셈 포함해서 9번의 연산이 이루어졌다는 것을 알고 가자.

-> 연산횟수가 성능을 결정한다.

 

 

 


 

연산의 의미 말고 어디에 쓰일까?

 

대표적으로는 평면의 법선 벡터, normal vector 를 구할 때 쓴다.

고등학교 때도 교육과정이 아님에도 신발끈 공식이라며 쓰고는 했다.

 

왜 법선벡터를 구하느냐?

++고등학교 땐.. 많이 했었지... 다 까먹음 ㅎ

 

일반적으로 3차원에서 평면을 표현할 때는 평면상의 한 점과 평면에 수직인 벡터를 사용해서 표현한다.

++ 일반적으로 평면 위의 세 점을 알면 외적을 이용할 수 있다.

 

결국 평면을 표현하기 위해 법선벡터를 구한다, 외적을 한다.

 

 


 

그리고 두 벡터의 평행 여부를 판단할 때 외적을 이용할 수도 있다고 했다.

 

++언제?? 단위벡터가 아닌 벡터들의 평행여부를 알고싶을 때!

즉, 여기서는 외적의 수식에서 봤다시피 내적과 다르게 sin을 이용한다. 

sin 그래프 특성상 0도와 180도에서 값이 0이 된다.

 

외적을 했을 때 0이 나온다면?

그것은 평행한 벡터끼리의 외적을 했기 때문이라고 볼 수 있다.

 

왜 내적이 아닌 외적을 이용해서 평행 여부를 조사하느냐?

내적에서 연산횟수가 적으려면 단위벡터들 끼리의 연산이어야 한다고 말했다.

정규화하는 연산 자체가 많아져서 차라리 외적으로 구하는 것이 효율적으로 되기 때문이다.

 

 

 

 


 

또 다른 쓰임새는 카메라 행렬을 구할 때!

즉, 카메라가 보는 평면이라고 생각하면 되겠다.

 

카메라 행렬을 구하기 위해선 카메라를 원점으로 카메라가 보는 방향 벡터와 게임 세계에서 천장이나 하늘을 가리키는 상향 벡터를 가지고 카메라 좌표계를 만들어야 한다.

 

그래서 이 때 2개의 벡터를 가지고 2번의 외적을 통해 카메라 좌표계의 세 축을 구할 수 있는 것이다.

 

게임 속에서 이를 예로 들어보면

 

플레이어가 A, 적이 B 라고 하자.

플레이어의 전방 벡터를 v, 플레이어에서 적을 향하는 벡터를 w, 게임 속의 상향 벡터를 up이라고 하자.

**(오른손 좌표계일 경우임)

 

판별식을 만들어 적용할 수 있다.

 

 

??? 이게 무슨 뜻이지?? 왜 외적한 것을 다시 내적하는 거야??

 

 

 

그니까 v와 w가 만드는 평면의 법선벡터를 구하고 그것을 게임 세상의 상향 벡터와 내적하는 것인데

그것이 무엇을 의미하느냐? 

 

적이 왼쪽에 있다면 상향벡터와 거의 방향이 같아질 것이고 사이각이 90도 보다 작을 것으로 예상된다.

즉, 내적을 하면 양수가 된다.

적이 오른쪽에 있다면 상향벡터와 거의 90도 보다 클 것으로 예상된다.

즉, 내적을 하면 음수가 된다.

 

사실 처음부터 이 식이 위치를 알게 하려고 만들어진 식은 아니고 이렇게 이용할 수 있다는 것이다.

 

사실 오른손 법칙을 쓰면 알다시피 왼쪽에 있다는 것은 반시계 반향으로 돌려서 법선벡터를 찾는 것과 같다.

반대로 오른쪽에 있는 것은 시계 방향으로 돌려서 법선벡터를 찾는 것이다.

 

다만 우리가 왼쪽에 있는지, 오른쪽에 있는지, 좌표가 달라지더라도 하늘에서도 지하에서도, 게임 세상 속 상향벡터를 기준으로 왼쪽인지 오른쪽인지 알 수 있다는 것에 의의가 있을 것으로 생각된다.

미니맵을 만들 때 쓰지 않을까? 생각해본다.

 

개인적인 생각이다. 

 

 

사실 위의 식은 스칼라 삼중곱이라고 (scalar triple product)라고 해서 따로 쓰이는 식인데..?

게임에선 위와 같이 적용될 것이라고 나는 생각한다.

 

그리고 행렬식이 사실 스칼라 삼중곱이다. 

 

사실 기하학적으로 이 식의 의미는

 

평행 사변형의 부피라는 것에 의미가 있다. 

 

이정도로 외적을 끝마친다.

 

 

728x90
반응형
그리드형