-
보간 회전 - cocos2D 활용Algorithm with C/Math 2021. 4. 6. 11:21
개발환경 : cocos2d-1.0.0-x-0.9.0 와 Visual Studio 2008
Win API와 cocos2d는 좌표계가 서로 다르다.
API는 좌측상단이 원점인데, cocos2d는 왼쪽하단이 원점이다.
즉, cocos2d의 좌표계가 우리가 보편적으로 많이 사용하는 좌표계이다.
아래의 영상을 보도록 하자. 우리가 여기에서 구현할 내용이다.
파란색 도형을 미사일로, 붉은 원을 퍽(아이스하키 공)이라고 가정하자.
우선은 마시일을 중심으로 퍽을 회전 시켜보도록 하자.
쉽게 설명하면, 퍽은 미사일을 중심으로 공전을 한다.
<삼각비>를 복습해보자. 자세한 내용은 아래를 참고하자.
designatedroom87.tistory.com/101?category=887656
위 그림을 이용하면, 아래의 결과가 나온다는 것을 알고 있다.
위 그림을 이용해서, 아래의 그림을 보자.
x_1 = x + Width
y_1 = y + Height
보간 회전을 쓰는 이유는 마치 달이 지구를 도는 것처럼 만들기 위해서 쓴다.
즉, 지구의 좌표와 지구와 달의 거리 그리고, 지구와 달이 이루는 각도만 주면
달을 지구 주위로 빙글빙글 돌게 만들 수 있다.
삼각비를 숙지한 상태라면, 위의 그림을 금방 이해할 수 있다.
즉, 위와 같이 달의 좌표는 아래와 같이 쓸 수 있다.
달의 x좌표인 x_1은,
로 쓸 수 있다.
달의 y좌표인 y_1은,
로 쓸 수 있다.
아무래도 엔진이다보니, 기본적인 설정이 필요하다. 우선 아래는 그냥 보고 지나치도록 하자.
아래의 Init함수는 초기화를 진행하는 함수이다.
아래의 함수는 업데이트를 처리하는 함수로, 주기적으로 호출되는 함수이다.
매개변수 dt는 일정하게 들어오는 어떤 시간 값이라고 보도록 하자.
아래의 함수가 미사일을 기준으로 퍽이 회전하는 함수이다.
설명은 밑에서 하도록 한다.
위에서 변수 MissilePos 와 PuckPos가 있는데 이들 변수의 의미는 다음과 같다.
MissilePos는 지구좌표, PuckPos는 달의 좌표로 보자.
m_fDistance는 위에서 정의한 d이고, θ는 m_fAngle변수와 같은 의미이다.
각도를 계속 값을 누적시켜서, 달의 좌표인 PuckPos를 변경해주면 된다.
RotateSpeed는 회전 속도로 시간 dt와의 곱으로 어떤 회전량을 나타내는데,
각도 값과의 합으로 표현해서 각도를 증가시키는 역할을 한다.
프로그램 실행영상
이번에는 지구가 제자리에서 달(지구주위로 공전하는)을 바라보도록 자전하는 기능을 만들어 볼 것이다.
자전 기능을 만들기 위해서는 가장 핵심적으로 알아야 할 것이 바로 각도이다.
앞장에서 한 내용을 이해하고 있으면 바로 각도를 구할 수 있다.
바로 핵심은 tangent이다.
각도는 지구와 달과의 사이의 각도로 하자.
Width와 Height값은 아래와 같이 구할 수 있다.
Width = x_1 - x
Height = y_1 - y
그리고, 각도를 알아내기 위해서는 tangent의 역함수를 이용하면 각도를 알아 낼 수 있다.
그리고, 이 각도만을 이용해서 어떻게 지구를 자전시키느냐가 문제인데,
cocos2d 에서는 setRotation함수를 제공해주고 있어서, 지구를 회전시킬수 있다.
위에서와 같이,
지구라 칭한 m_pMissile의 좌표를 얻어오고
달이라 칭한 _pDest의 좌표를 좌표를 얻어와서
Width와 Height를 구한다음에
Radian값을 얻어와서 각도값으로 변환해줘야 한다.
그리고, setRotation함수에 각도를 적용해주면 된다.
위의 함수는 아래의 Update함수에서 호출하면 된다.
프로그램 실행영상
소스 파일 및 이미지 파일
'Algorithm with C > Math' 카테고리의 다른 글
포물선(벡터)을 이용한 미사일 날리기 - Cocos2D 활용 (0) 2021.04.07 벡터를 활용한 미사일을 날리기 - Cocos2D를 활용 (0) 2021.04.06 평면의 방정식을 활용한 마인크래프트 블록 붙이기(Unity 활용) (0) 2020.11.30 세 점을 입력받아 삼각형의 성립 조건 구하기 (0) 2020.10.14 API를 활용한 파티고라스의 정리를 이용한 거리 구하기 (0) 2020.10.10