pygame 에서 transform.rotate 를 사용해서 이미지를 회전시켜 보면 생각과는 달리 요상하게 회전합니다.
따라서 이를 해결해 보고자 검색해 보다 다음 링크를 찾았습니다.
위 링크를 보면 파이게임의 이미지 회전이 왜 그렇게 이상한지 알 수 있고 답변하신 분이 blitRotate 라는 함수를 만들어 놓아서 이용할 수 있습니다.
제 소스에 가져와서 테스트를 해 봤는데 제 생각대로 회전 하더군요.
def blitRotate(image, pos, originPos, angle):
#calcaulate the axis aligned bounding box of the rotated image
w, h = image.get_size()
box = [pygame.math.Vector2(p) for p in [(0, 0), (w, 0), (w, -h), (0, -h)]]
box_rotate = [p.rotate(angle) for p in box]
min_box = (min(box_rotate, key=lambda p: p[0])[0], min(box_rotate, key=lambda p: p[1])[1])
max_box = (max(box_rotate, key=lambda p: p[0])[0], max(box_rotate, key=lambda p: p[1])[1])
#calculate the translation of the pivot
pivot = pygame.math.Vector2(originPos[0], -originPos[1])
pivot_rotate = pivot.rotate(angle)
pivot_move = pivot_rotate - pivot
#calculate the upper left origin of the rotated image
origin = (pos[0] - originPos[0] + min_box[0] - pivot_move[0], pos[1] - originPos[1] - max_box[1] + pivot_move[1])
#get a rotated image
rotated_image = pygame.transform.rotate(image, angle)
return (rotated_image,origin)
원래 소스에서 제 경우는 회전된 이미지와 새로운 좌표를 리턴 하도록 아주 조금 수정했습니다.blit 를 이용해서 이미지를 표시하는 경우 다음과 같이 하면 됩니다.
background.blit(*rotate_image)
*rotate_image 는 위의 함수의 리턴값입니다.
위 함수를 이용하는 방법은 image 는 당연히 회전할 이미지고요. angle 은 회전 각도입니다.
가장 중요한 부분은 pos 와 originPos 입니다.
pos 는 전체 스크린 좌표로 이미지를 표시할 위치입니다.
originPos 는 이미지 내의 좌표인데 즉, 이미지의 어느 부분을 중심으로 회전 시킬것인가를 정하는 것입니다. 만일 이미지의 중심을 기준으로 회전시킨다면 이미지의 폭과 높이를 2로 나눈 값을 넣으면 됩니다.
위와 같이 입력을 해주면 이미지 내에서 정해 준 originPos 에 따라 이미지가 pos 좌표에 위치되고 그 좌표를 기준으로 이미지가 회전하게 됩니다.
간단히 말하면 originPos 는 회전의 중심이자 이미지의 중심이 되는 겁니다.
위 함수를 이용해서 회전시키면 다음과 같이 생각한대로 회전합니다.
위 함수는 이미지의 회전 시킬 위치를 마음대로 정할 수 있다는 장점이 있습니다. 제게는 꼭 필요한 거라서....
댓글
댓글 쓰기