메뉴 건너뛰기

OBG

Programming

MoA
조회 수 1010 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄 첨부
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄 첨부

먼저 간단한 삼각함수부터 생각하자. 아래 삼각형에서 각 A는 어떻게 구할까?

 

triangle.png

 

답은 간단하다 atan ( BC / AB ) 값을 구하면 된다. 그러므로 플레이어를 C로 바라보게 하려면 atan (BC / AB) 값 만큼 회전 시키면 된다. 선분 AB를 기준으로 하였을 때 점 C의 반대편으로 바라보게 하려면 atan (BC / AB) 의 마이너스 값만큼 회전 시키면 된다. 만약 A 위치를 원점으로 놓고 B는 (x, 0), C는 (x, y)로 놓는 다면 점 C'의 위치는 (x, -y)가 된다. atan ( y/x ) = - atan ( -y/x ) 이므로 플레이어를 회전할 각은 atan ( y/x )로 계산하면 될 것 같다.

 

하지만 다음 그림에서 점 C 방향으로 보게하려면 어떻게 계산해야할까?

 

triangle2.png

 

점 C의 좌표는 (-x, y)이다. 위에서처럼 atan ( y / (-x) )로 계산하면 atan ( -y / x ) 와 같은 값을 같게 된다. 예를 들어 x = 1, y = 1라면 두 경우 모두 atan ( -1 ) = -45도가 되어 버린다.

 

이를 위해 프로그래밍 언어에서는 보통 atan2 ( y, x ) 함수를 제공한다. 이는 x, y 각각의 부호를 판별하여 각도를 계산하게 해준다. 즉 atan2 ( -1, 1 )을 계산하면 -45도, atan2 ( 1, -1 )을 계산하면 135도가 된다.

 

이를 이용하여 플레이어를 회전시켜 보자. screen.blit(player, playerpos) 부분을 아래와 같이 바꾼다.

 

# 6.1 - 플레이어를 회전시킨다.
    mousepos= pygame.mouse.get_pos()
    angle = math.atan2(-mousepos[1]+(playerpos[1]),mousepos[0]-(playerpos[0]))
    rotPlayer = pygame.transform.rotate(player, angle*57.29)
    screen.blit(rotPlayer, playerpos)

mousepos에는 mouse.get_pos() 함수로 마우스의 좌표가 얻어진다. 두 번째 줄은 atan2( y, x )를 계산하는데 플레이어 좌표를 기준으로 계산해야 하므로 atan2 ( mouse y좌표 - player y좌표 , mouse x좌표 - player x 좌표 ) 를 계산한 것이다. 그런데 화면의 좌표는 아래 방향으로 y값이 증가하므로 (mouse y좌표 - player y좌표) 부호가 반대로 바뀌어야 한다.

 

이렇게 하여 계산된 angle값은 라디안 값이므로 degree (도)로 바꾸려면 angle * 180.0 / 3.14 = angle * 57.29를 계산하면 된다. 세 번째 줄은 이 값을 계산하여 player를 회전시킨 것이다. 그리고 회전된 player 이미지는 rotPlayer 이미지로 바뀌고 이를 playerpos 위치에 그렸다.

 

여기서 한가지 더 문제가 있다. 플레이어를 회전시키면 아래와 같이 이미지 크기가 변한다.

 

rotPlayer.png

 

회전 시켰더니 이미지 크기가 커졌다. 그리고 이미지는 왼쪽 위 좌표를 기준으로 그려지는데 이 또한 바뀌었다. 그런데 왼쪽 위 좌표를 항상 (100, 100) 위치시키면 player 위치가 이상하게 변한다. (직접 실행해서 확인해보라) 플레이어를 자연스럽게 회전시키려면 이미지의 중심 좌표를 기준으로 회전시켜야 한다. 이를 반대로 하여 회전시킨 후 중심 좌표를 똑같게 만들어도 된다. 이미지의 중심 좌표는 왼쪽 위 꼭지점에서 (이미지 가로크기/2 , 이미지 세로크기/2 ) 만큼 이동한 위치이므로 이 중심좌표를 왼쪽위 꼭지점으로 옮기게 하려면 다음과 같이 하면 된다.

 

    # 6.1 - 플레이어를 회전시킨다.
    mousepos = pygame.mouse.get_pos()
    angle = math.atan2(-mousepos[1]+(playerpos[1]),mousepos[0]-(playerpos[0]))
    rotPlayer = pygame.transform.rotate(player, angle*57.29)
    playerRotPos = (playerpos[0]-rotPlayer.get_rect().width/2, playerpos[1]-rotPlayer.get_rect().height/2)
    screen.blit(rotPlayer, playerRotPos)

직접 실행해보고 결과를 확인해 보길 바란다.

 

덧1 : 나의 경우엔 y좌표 부호를 반대로 하여 계산하였는데 취향에 따라 y 부호는 그대로 하고 rotation 시킬 때 반대로 회전시킬 수도 있다. 하지만 수학 공부 좀 한 사람에게는 계산이 많아지면 더 헷갈릴 수도 있다.

덧2 : 13살짜리가 탄젠트 역함수, 라디안도 암 ㄷㄷㄷ

 

 

?

List of Articles
번호 분류 제목 글쓴이 날짜 조회 수
공지 Tool/etc Programming 게시판 관련 2 MoA 2014.11.01 1714
286 LLM PEFT: Parameter-Efficient Fine-Tuning of Billion-Scale Models on Low-Resource Hardware OBG 2024.04.15 15
285 LLM [VESSL AI] 뉴욕주민의 프로젝트플루토 — LLM, LLMOps를 활용한 금융 미디어의 혁신 OBG 2024.04.21 17
284 LLM Anthropic, LLM의 내부를 이해하는데 있어 상당한 진전을 보임 OBG 2024.06.03 17
283 LLM A Beginner's Guide to Prompt Engineering with GitHub Copilot OBG 2024.04.04 19
282 LLM How LLMs Work ? Explained in 9 Steps — Transformer Architecture OBG 2024.04.11 21
281 LLM ChatGPT의 강력한 경쟁 언어모델 등장!, Mixtral 8x7B OBG 2024.04.14 22
280 LLM Mixture of Experts - Part 2 OBG 2024.04.14 22
279 LLM The difference between quantization methods for the same bits OBG 2024.04.14 25
278 LLM llama3 implemented from scratch OBG 2024.05.24 25
277 Graphic ASCII 3D 렌더러 만들기 OBG 2024.06.03 25
276 LLM 만능 프롬프트 OBG 2024.04.07 26
275 LLM Getting Started with Sentiment Analysis using Python OBG 2024.04.11 28
274 LLM Real-Time Stock News Sentiment Prediction with Python OBG 2024.04.11 29
273 Deeplearning [ifkakao] 추천 시스템: 맥락과 취향 사이 줄타 OBG 2024.01.10 30
272 Tool/etc HuggingFace 공동창업자가 추천하는 AI 분야 입문 서적 OBG 2024.05.24 31
271 LLM [12월 1주] 떠오르는 '미스트랄 7B'...'라마 2' 이어 한국어 모델 세대교체 주도 OBG 2024.03.05 34
270 Deeplearning Using Machine Learning to Predict Customers’ Next Purchase Day OBG 2024.02.27 39
269 서버 멀티-플레이어 게임 서버와 레이턴시 보상 테크닉 OBG 2024.01.16 41
268 Deeplearning 마이크로소프트가 공개한 무료 AI 코스들 OBG 2023.11.28 56
267 LLM LLM 출력 속도 24배 높여주는 라이브러리 등장했다 OBG 2023.06.30 65
Board Pagination Prev 1 2 3 4 5 6 7 8 9 10 ... 15 Next
/ 15
위로