2016-11-18 10 views
1

또는 파이 게임의 폴리곤을 이미지로 채우는 방법은 무엇입니까?파이 게임 (Pygame)에서 어떻게 이미지를 폴리곤 모양으로 늘릴 수 있습니까?

설명서를 검색해 보았지만 많이 돌아 가지 않았으므로 여기에 무엇이든 놓친 것인지 묻습니다. 필요한 경우 변환 행렬을 사용할 수 있습니다. Example

+0

PyGame에서 이미지가있는 폴리곤은 어디에서 발견 되었습니까 ??? 아니면 OpenGL을 의미 할 수도 있습니다. – furas

+0

@furas 응? 아니요, 저는 파이 게임을 의미한다고 확신합니다. –

+0

업데이트 및 이미지보기 **는 파이 게임에서만 혼자 할 수 있습니다. PIL을 사용하여 [this] (http://stackoverflow.com/a/14178717/2588654) 대답을 살펴볼 수도 있습니다. PIL/pillow로 이미지를로드하고 거기에서 변환을 수행 한 다음 PIL 이미지를 파이 게임 이미지로 변환 할 수 있습니다. 또는 Pygame과 함께 PyOpenGL을 사용할 수 있습니다. 그러나 임의의 변환 행렬을 전달하여 이미지를 회전시킬 수는 있지만, 이는 pygame의 SDL 렌더링 모델의 많은 다른 점을 잃어 버릴 수 있습니다. 이것이 도움이되는지 또는 여전히 불분명한지 알려주십시오. – CodeSurgeon

답변

0

나는 당신이 찾고있는 개념이 비트 맵 마스크 생각 :

는 여기에 내가 무엇을 달성하고자하는의 예입니다. 특수 블렌딩 모드 인 pygame.BLEND_RGBA_MULT을 사용하면 을 혼합 할 수 있습니다. 두 표면의 내용물을 함께 사용합니다. 여기서 블렌딩이란 두 개의 해당 픽셀의 색상 값을 단순히 곱하여 새로운 색상 값을 얻는 것입니다. 이 곱셈은 정규화 된 RGB 색상에서 이루어 지므로 흰색 ((255, 255, 255)은 실제로 (1.0, 1.0, 1.0)으로 변환 된 다음 마스킹 표면과 마스크 된 표면 픽셀 간의 곱셈이 수행 된 후 정규화되지 않은 RGB 색상으로 다시 변환됩니다. .

이 경우 모든 것은 폴리곤을 한면에 그려야하고, 관심있는 이미지를 다른면에 그리고, 두면을 결합하여 최종 결과를 화면에 렌더링해야한다는 것입니다. .

import pygame 
import sys 

(width, height) = (800, 600) 
pygame.init() 
screen = pygame.display.set_mode((width, height)) 
image = pygame.image.load("test.png").convert_alpha() 
masked_result = image.copy() 

white_color = (255, 255, 255) 
polygon = [(0, 0), (800, 600), (0, 600)] 

mask_surface = pygame.Surface((width, height)) 
pygame.draw.polygon(mask_surface, white_color, polygon) 
pygame.draw.aalines(mask_surface, white_color, True, polygon)#moderately helps with ugly aliasing 
masked_result.blit(mask_surface, (0, 0), None, pygame.BLEND_RGBA_MULT) 

while True: 
    for event in pygame.event.get(): 
     if event.type == pygame.QUIT: 
      sys.exit() 
    screen.blit(masked_result, (0, 0)) 
    pygame.display.update() 

이 마스크 같은 간단한 삼각형을 이용하여 같은 결과는 보이는: 그냥 수행하는 코드 0 Polygonally-masked Image

몇 가지 참고 사항 :

  • 이 답변은 당신이 (예 : 꽤 비트 맵 마스크 등) 다각형보다 복잡 마스크를 원하는 경우에 관심이있을 수 this의 기반으로한다.
  • 이 솔루션은 pygame.mask 모듈을 사용하지 않습니다!
  • 아직이 코드를 완전히 테스트하지는 않았지만이 코드는 convex 다각형에서만 사용할 수 있다고 생각됩니다. 이는 중요한 제한 사항입니다. Pygame이 오목한 폴리곤을 그릴 수 있는지 확실하지 않지만 PyOpenGL이 스텐실 버퍼 트릭이나 테셀레이션을 사용할 수 있다는 것을 알고 있습니다. 그 접근 방식에 관심이 있다면 알려주십시오.
  • 앨리어싱 제거를 시도했지만 그 결과는 아직 완전히 만족스럽지 않습니다.
+0

답변을 주셔서 감사합니다. 앞으로는 유용 할 것으로 생각됩니다. 그러나 그것은 제가 묻고있는 것이 아닙니다. 나는 이미지를 펴고, 잘라 내지 않는 것을 의미했습니다. 제 질문이 불분명하면 사과드립니다. 내가 의미하는 것을 설명하기 위해 그림을 추가 할 것입니다. –

+0

예 그림이 1000 단어이므로 확실히 하나 추가하십시오!나는 당신이 당신의 초기 질문에서 의미하는 바를 완전히 확신하지 못했습니다. – CodeSurgeon