티스토리 뷰
ACABERRY와 함께하는 프로그래밍 공부
캐릭터와 적과의 사이각
3D 기초인데, 평소 유니티로 쉽게 생각해서 사용하는 부분이지요.
Quaternion.LookRotation과 아카베리라이브러리유틸을 애용하다보니 이부분을 잊고있었네요.
막상 다이렉트X 라이브러리들로 각차를 구한다거나, 면접질문이 있을때 문득 생각이 안날 수 있다고 생각하게되어 포스팅을 시작합니다.
이 부분은 제 ACABattleShip 프로젝트의 포탑회전부에서 이들을 사용해 적을 바라봐야하는 각차를 구하고 있기도 합니다.
포탑구현부는 특히 [ 포신때문에 움직일 수 없는 MAX범위 ]를 가지고 있어서, 포신이 돌아가지 않는 각일경우, 포를 원래위치로 돌려놔야하는 상황이 발생합니다. ( 월쉽에서는 항상 타겟방향을 가지고있어서 그 방향을 향해 계속 포탑회전 )
이런저런 부분에서 사용했던 내용이지만, 막상 수학적 설명을 하자면 정확한 과정을 알고있어야 하기에 한번 정리해봅니다.
DOT~
Acos( Dot( 캐릭터의 방향, 노멀라이즈( 타겟위치 - 내위치 ) ) )
가 기본 공식입니다.
먼저, 영상을 보도록 합니다.
플레이어가 파랑색
적이 빨강색
물론, Angle()로 동일한 결과를 얻을 수 있습니다.
먼저, Dot을 활용해
1) 자신의 캐릭터의 방향벡터를 구합니다.
MyCharacterTransform의 .foward 면 충분하겠네요.
2) 내가 타겟을 바라보는 방향벡터를 구합니다.
타겟.포지션 - 나.포지션 을 하게되면, 내 위치에서 상대 위치까지에 해당하는 벡터를 구해옵니다.
하지만 사용할 벡터는 방향벡터이므로 노멀라이즈 해줍니다.
3) 1과 2를 내적해줍니다.
내적 결과는 아래와 같습니다.
이런 상태를 이해하고나면, 이를 삼각함수( 0~1~0~-1~0 to 각도 )를 활용해 '각도'로 전환이 가능합니다.
여기에 맞는게 아크코사인이고 이를 거치면 아래와 같은 결과가 나타납니다.
dot = acos
0 = 0
1 = 1.57
-1 = 3.14
Acos를 덮을경우 이렇게 적과의 각차를 Rad값으로 구할 수 있습니다.
이 라디안값은 유니티의 Mathf.Rad2Deg 에 있으며,
public const float Rad2Deg = 57.29578F
값은 57.29578F입니다.
이를 곱하게되면 최종적으로 우리가 원하는 Angle값이 나타납니다.
CROSS~
좌표계를 따지며 보통
오른손 엄지 - 검지 - 중지
순으로
결과값 - A - B
입니다.
이는, A 벡터와 B 벡터를 외적하게되면 나오는 결과값은 그 각차만큼의 Y값이 표기되어 나타납니다.
영상은 아래와 같습니다.
플레이어가 파랑색
적이 빨강색
이런식으로, 왼쪽의 경우 -결과값이, 오른쪽의 경우 +의 결과값이 나타납니다.
무슨일일까요...?! 이부분은 좀 더 봐야할 것 같네요 :P
왼손 / 오른손 좌표계의 외적
http://3dmpengines.tistory.com/755
내가 바라보는 방향(A)보다 적(B)이 오른쪽에 있을때 +값이 되는군요 (!)
A값은 플레이어의 정면값.
B값은 타겟까지의 방향벡터( 타겟 - 나 ) 값.
다음번엔 피타고라스 시리즈를 시뮬레이션해보도록 하겠습니다.
―――― ACABERRY's STUDY ―――― ACABERRY's STUDY ―――― ACABERRY's STUDY ――――
▶대부분 퍼온 내용이기에 출처를 꼭 명시합니다.
▶문제되는 부분이 있다면 요청주시면 언제든 수정 & 삭제합니다.
▶포스팅의 목적은 공부하시는 분들이 쉽게 접하고 정답을 찾아가는데 도움을 드리고자 함입니다.
―――― ACABERRY's STUDY ―――― ACABERRY's STUDY ―――― ACABERRY's STUDY ――――
'Logical' 카테고리의 다른 글
[잡공부] JOB STUDY (0) | 2018.07.28 |
---|---|
[LINK] 마샬링관련내용 (0) | 2016.10.07 |