🎮Unreal4/Blueprint

[UE4] 외적(Cross), Sign함수

공대 컴린이 2023. 2. 14. 17:54
728x90

🔝 외적 (Cross)

외적은 두 벡터에 직각이되는, 즉, 수직하는 벡터를 만들어주는 연산으로 연산 결과 수직 벡터(Vector3)를 반환한다.

(외적은 두 벡터에 수직하는 벡터가 나오므로 2D 공간에서는 외적이 없고, 3D 공간에서만 외적이 있다)

 

외적은  A Cross B 로 외적할 때 A와 B의 순서에 따라 수직하는 벡터의 방향이 반대로 나오기 때문에 외적 순서가 매우 중요하다.

외적 결과로 나온 수직축의 길이(z축)가 양의 값이면 A 위치로부터 B위치가 오른쪽에 위치한 것이고, 수직축의 길이가 음의 값이면 왼쪽에 위치한 것이다.

 

2D공간에서 자주 사용해왔던 내적은 특정 범위 내에 위치값이 존재하는지만 판단할 수 있고, 좌우를 판단할 수는 없다. 

그러나 외적은 좌우를 판단할 수 있기에 3D 프로그래밍에서 자주 사용되는 연산이다.

 

외적의 특이점은 외적 연산에 사용되는 X축의 길이만큼 외적 결과 벡터의 길이가 결정된다는 점이다.

X와 Y를 외적하면 외적 결과 Z는 X의 길이와 같다. 예를 들어, X가 절반만큼 작아지면 외적 결과 Z도 절반만큼 작아진다.

 

(이러한 외적의 특성을 이용하여 렌더링 파이프라인의 RS 과정에서 Back-face culling 기능을 구현하기도 하였다. 삼각형의 Normal 벡터가 외적해서 음수값이 되면 삼각형을 그리지 않는다!)


외적의 특성을 눈으로 보며 이해하기 위해 예제를 작성해보았다.

원점(0, 0, 0)에 위치하는 파란색 스피어 액터를 배치하고, 그로부터 y값이 500만큼 떨어진 위치에 빨간 스피어를 놓았다.

플레이어를 파란액터로 설정하고, Enemy를 빨간액터로 설정하여, 예제 블루프린트가 실행되면 플레이어와 Enemy의 외적 결과를 벡터 라인으로 출력하게 하였다.

 

Cross 예제 BP

플레이어의 Forward 벡터와 플레이어 위치에서 Enemy 위치로 향하는 방향벡터를 외적한 결과를 파란색 Arrow로 출력하였다.

🚩결과

그 결과, 파란색 화살표가 두 벡터에 수직하는 방향으로 출력되는것을 확인할 수 있었고, 플레이어와 Enemy사이의 길이가, 외적값의 길이와 동일한 특성도 파악할 수 있었다.

 

또한 외적을 통해 나온 결과를 Up 벡터로 내적하면, 결과의 Z값만 뽑아낼 수 있다.

이런 z값이 음수냐 양수냐에 따라 외적 대상이 왼쪽에 있는지 오른쪽에 있는지를 구분할 수 있는것이고,

Sign 함수를 이용하면 더 손쉽게 음수와 양수를 판별할 수 있다.

Sign 함수는 값이 음수일 때 -1를 반환하고, 양수일 때 1를 반환한다.

728x90