본문 바로가기

언리얼엔진

37. Dot, Cross Product / 삼각함수 atan2

Dot / Cross

 

Dot

벡터 u (a, b ,c)와 벡터 v (x, y, z)가 존재할 때, = ax + by + cz의 결과가 나오게 된다.

여기서 나오는 연산 결과 = |벡터 u의 크기| * |벡터 v의 크기| * cos Θ 와 같다.

그래서 Θ는 두 벡터의 사이값을 말하고 있다.

 

벡터가 0이 아닌 이상 크기를 가지고 있다면 acos을 통해 Θ값을 알아낼 수 있다는 것이다.


삼각함수의 sin, cos, tan는 변들의 비율을 말한다. 따라서 각도만 알고 있다면 비율을 알아낼 수 있었다.

 

보통 함수는 f(x) = y 처럼 함수에 x값을 넣는다면 y가 나오는 것이다.

어떠한 값을 넣었을 때, 하나의 값만 나올 수 있어야 한다.

 

그런데 역함수 g(y) = x는 반대로 y값을 넣어 x가 나오는 것을 말한다.(f -1(x) = y 로 표현한다.)

 

이를 삼각함수에 대입해보면 각도을 대입하면 비율이 나오던 것이 역함수로 인해 비율을 대입하여 각도를 뽑아낸다.

따라서 해당 비율을 가지고 있는 sin의 Θ는 몇도인지 알 수 있는 것이다.

그래서 우리는 삼각함수의 역함수를 asin acos atan(아크)로 부르게 된다.


위의 삼각함수 그래프를 보았을 때, 역함수의 특정 비율을 대입 시 나오는 값이 여러개가 되는 문제가 있다.

따라서 나올 수 있는 값의 범위를 제한하게 되었다.

 

sin의 역함수 asin의 중복된 값이 나오지 않게 하기 위하여 -90˚ ~ 90˚까지의 제한을 두었다.

 

cos의 역함수 acos는 0˚ ~ 180˚까지의 제한을 두었다.

 

tan의 역함수 atan는 -90˚ ~ 90˚ 제한을 두었다.


atan2

atan은 두 벡터 사이의 탄젠트값을 받아 절대각을 -π/2 ~ π/2의 라디안 값으로 반환한다. (-90 ~ 90도)

하지만 atan2는 두 벡터 사이의 상대좌표(x, y)를 받아 절대각을 -π ~ π의 라디안 값으로 반환한다. (-180 ~ 180도)

 

이를 통해 x축과 Forword벡터를 기준으로 atan2를 이용하여 회전한 각도(Yaw)를 구하여 사용하였다.

 

* 따라서 굳이 atan2를 사용하지 않아도 ControllerRotation에서 Yaw값을 angle에 세팅하여 사용하여도 됬다.


Cross

3차원 벡터에서 적용이 된다.

두 벡터가 평면을 이루고 있을 때, 해당 면의 수직 법선벡터를 알아낸다.

 

벡터 (a, b, c, a)

벡터 (x, y, z, x)

(bz - cy), - (cx - az), (ay - bx)의 연산 결과가 나오게 된다. 다시 3차원 벡터가 나오게 되는 것을 볼 수 있다.

 

두 벡터의 곱 순서가 바뀌게 된다면 위 아래( + / - )가 바뀌게 된다.