on my way

3D 게임 프로그래밍 기초 수학 4 :: 벡터의 외적 본문

Computer Science/IT MATH

3D 게임 프로그래밍 기초 수학 4 :: 벡터의 외적

wingbeat 2021. 9. 26. 10:07
반응형

벡터의 외적

> 벡터의 외적은 두 벡터 a,b 사이의 각을 θ라 하면 a·b sin θ라는 크기, 즉 a,b를 두 변으로 하는 평행사변형의 넓이와 같은 크기를 가지고 a,b를 포함하는 평면에 수직이고 a에서 b로 시계방향과 같은 진행방향을 가지는 벡터를 a,b의 외적 또는 벡터곱이라 하고 이것을 내적과 구별하여 [a,b] 또는 a×b로 표시한다   [네이버 지식백과] 벡터의 내적과 외적 

 

내적의 결과값은 벡터가 아닌 스칼라 값이 나온다.

외적의 결과값또 다른 벡터가 하나 생기는데, 이 벡터는 두 벡터에 모두 수직인 벡터가 된다.

주의할 점은, 벡터의 외적은 3차원 벡터에서만 적용이 된다는 것이다.

 

내적을 설명할 때, 법선 벡터라는 것을 언급했는데, 이 법선 벡터를 구할 때 벡터의 외적을 사용하게 된다.

법선 벡터란 어떤 평면에 수직인 벡터를 의미하므로, 위의 외적의 정의와 일치하게 된다.

 

 

두 벡터의 외적을 구하는 수식은 다음과 같다.

a x b = [(ay·bz – az·by), (az·bx – ax·bz), (ax·by – ay·bx)]

이를 프로그래밍 코드로 보면 다음과 같다.

Vector3 vector_cross(Vector3 a, Vector3 b)  {  
    return new Vector3(  
        a.y * b.z - a.z * b.y,  
        a.z * b.x - a.x * b.z,  
        a.x * b.y - a.y * b.x);  
}

위 수식을 보면, 새로운 벡터의 x성분은

두 벡터의 y, z값을 각각 교차해서 곱한 뒤 서로를 뺀 값이라는 것을 알 수 있다.

새로운 벡터의 y, z 성분도 동한 규칙으로 계산을 한 것이다.

 

이런 계산을 통해 나온 새로운 벡터는

두 벡터를 통해 만들어진 평면에 수직인 벡터라는 것이다.

그것을 평면의 법선 벡터, 또는 노말 벡터라고 부른다.

 

 

 

평행사변형의 넓이

A x B = |A|∙|B|∙sinθ∙n

이 공식을 풀어 설명하자면

두 벡터 A와 B의 외적은 두 벡터가 이루는 각도의 sin값에

두 벡터의 길이(|A|, |B|)를 곱해서,

두 벡터의 수직인 단위벡터 n을 곱한 값이라는 뜻이다.

 

두 벡터 a와 b가 있고, 이루는 각을 θ(세타)라고 했을 때,

그림에서 보이는 빨간선(벡터 b에 수직인 선)의 길이는 sinθ에 a의 길이(|a|)를 곱한 값이 된다.

 

그리고 a와 b에 모두 수직이면서, 길이가 1인 벡터 n이 있다고 할 때 (n은 다른 차원으로 보면 된다.)

sinθ에 a의 길이와 b의 길이를 곱한 값을 n에 곱해주면, 최종적으로 벡터 n을 길게 늘려준 꼴이 된다.왜냐하면 sinθ에 a의 길이와 b의 길이를 곱하면 하나의 스칼라 값이 나오는데,여기에 벡터 n을 곱하면 벡터와 스칼라를 곱하는 것이기 때문에 결국 벡터 n이 확장된 모습이 되기 때문이다.

 

결국 a와 b의 외적은 |a|∙|b|∙sinθ∙n으로 구할 수 있다.하지만, 이 방법은 두 벡터 사이의 각도와 수직인 벡터 n을 알아야 하며 삼각함수까지 있어 계산이 복잡해진다.따라서 실무에서는 이 방법보다 벡터의 각 성분을 곱해서 빼는 방법을 사용한다.

 

그리고 이 계산 결과로 알 수 있는 사실이 있는데 바로벡터의 외적을 이용하면 두 벡터가 만드는 평행사변형의 넓이를 구할 수 있다는 것이다.

 

평행사변형의 넓이 = 밑변 x 높이

높이를 구하려면 벡터 a와 b가 이루는 각도를 sin으로 계산한 값에 a의 길이를 곱한 것과 같다.

결국 높이 = |a|∙sinθ가 되며, 밑변=b의 길이이므로

벡터 외적의 공식인 |a|∙|b|∙sinθ∙n에서 벡터 n만 제외한 것과 같다.

결국 외적으로 구해진 벡터의 길이는 평행사변형의 넓이와 같다는 것을 알 수 있다.

 

또한 평생사변형을 둘로 나누면 삼각형 두 개가 생기기 때문에외적을 통해 생긴 벡터의 길이를 2로 나누면 두 벡터가 만드는 삼각형의 넓이와 같게 된다.

 

 

 

개발할 때 벡터의 외적이 적용되는 예

 

 

 

1. 평면의 법선 벡터를 구할 때

삼각형의 세 점을 알 때, 벡터 2개를 구할 수 있게 되고

그 벡터의 외적을 구하면 삼각형이 속한 평면의 법선 벡터를 구할 수 있게 된다.

보통 Modeling Data의 Polygon Normal 벡터를 구할 때 사용한다.

 

2. 적이 캐릭터의 오른쪽에 있는지, 왼쪽에 있는지 판별할 때

캐릭터와 적 간에 생기는 벡터를 A백터라고 하고,

월드 좌표 계의 Up 방향 벡터를 Up, 캐릭터의 Forward 방향 벡터를 F라고 하면,

Up · (A × F) 값, 즉 Det(Up, A, F)값이 0보다 크면 캐릭터의 오른쪽,

0보다 작으면 캐릭터의 왼쪽에 있음을 판별 할 수 있다.

 

이는 외적으로 생긴 벡터의 방향이 Up 벡터의 방향과 -90~90도, 즉 예각을 이루면

cos값이 0보다 큰 원리를 이용한 것이다.

 

3. 벽에 부딪쳐서 미끄러지는 캐릭터의 방향을 계산할 때

 

 

 

 

 

출처:

http://rapapa.net/?p=2974 

 

게임에서 내적과 외적(Dot Product and Cross Product in Game) – Rapapa Dev Story

게임 개발에서는 벡터 연산(Vector Operation)을 자주 사용한다. 이는 벡터로서의 접근이 직관적이며, 방정식이나 복잡한 계산을 피하고 문제를 훨씬 쉽고 간단하며 효율적으로 해결하게 해주기 때

rapapa.net

http://lab.gamecodi.com/board/zboard.php?id=GAMECODILAB_Lecture_series&page=1&sn1=&divpage=1&sn=off&ss=on&sc=on&select_arrange=headnum&desc=asc&no=126 

 

3D 기초 수학 강좌 - 5. 벡터의 외적

3D 게임 프로그래밍을 위한 ...

lab.gamecodi.com

https://thrillfighter.tistory.com/190

 

벡터의 개념과 벡터의 내적,외적 - 게임 수학(3)

벡터는 크기만 가진 스칼라의 진화형으로 방향과 크기를 가집니다.  게임 프로그래밍에 필수적인 요소기 때문에 벡터에 관한 내용은 자세히 공부할 수록 좋다고 생각됩니다. 물리계에서 사용

thrillfighter.tistory.com

 

반응형