유니티) 벡터의 외적을 이용한 회전
저번엔 내적을 두번하여서 회전을 했었다면
이번엔 내적 + 외적으로 회전을 만들어보았다
원래 Atan2를 다시한번 살펴볼겸 글을쓰며 보려했는데,
외적이 갑자기 해보고싶어졌다
일을 나가기전 시간이 얼마 없기도하고 그저 간단하게만 만들어보고싶어 업데이트문에 떄려박았다;;
_aim과 target은 같은것이다,
회전할 방향이 되어줄 씬에 배치된
오브젝트이다
회전할 캐릭터의 전방방향을 의미하는 forwardDir벡터와
바라볼 방향 , 회전방향이 되어주는 dir벡터 2개를 만들었다
dir벡터에 단위벡터(노말라이즈)를 한건, 벡터의 크기보다 방향이 중요해서였다
유니티제공함수로 Vector3.Cross를 쓰면 편하다!
외적은 내적과 달리 곱셈순서에 따라 값이 달라지니 주의해야한다
내적은 나의 앞뒤판별을 해주고, 외적은 좌우 판별을 해주는 경향이있다
위에서 보듯 cross값이 양수면 forward벡터기준 오른쪽(뒷편포함)
음수면 왼쪽으로 나왔다, 그래서 FdotD으로 바라볼물체와의 내적을 하여 구한 cos값을
Acos함수를 다시 사용하여 라디안값으로 반환후 *Mathf.Rad2Deg로 나에게 친숙한 각도법으로 또 바꾼다!
_destiny멤버변수는, 위에 선언해둔 쿼터니언멤버변수인데 캐싱해두며 비교하였다 회전계산을 필요할때만
하도록 하려 만들었다
그리고 물체가 움직이지 않았다면 회전해야할 방향의 지점역할이된다
내적의 결과로 얻은 angle은 회전할 각도의 양이되기에,
cross값이 양수인지 음수인지에 따라 음수회전 양수회전을 해주면 회전을 쉽게 표현이 가능하다!!
함수의 마지막 줄이다.
현재 나의 회전값에 위에서 구한 _destiny회전 값으로 Lerp보간으로 회전을 시키는데!
만약 회전값 차이가 (현재 회전값 과 목표회전값(_destiny)) Mathf.Epsilon보다 작다면!!!
매스엡실론은 정말 근사한 차이값을 의미해준다
그래서 회전값 차이가 미비하다면 그냥 현재 회전값을 목표회전값으로 강제 맞추어준다
끝으로 함수 시작 첫부분을 마지막에 적는 이유가 있다
현재 회전값이 목표회전값과 같다면 &&
목표물의 위치가 변함없다면 => 즉 회전을 다한 상태가 되기에
밑의 함수내용 실행 안하고 리턴으로 다시 돌아가게 만들었다 (불필요한 계산안하게!)
한번 돌려보았따
초반에 딸깍 거렸다 돌아가는모습은
플레이버튼이 마우스더블클릭되어서 그렇다(마우스 고장난듯)
이제 다음엔 atan2로 했던 회전처리와
키입력회전, 마우스 위치로 회전등등 응용도 해볼생각이다