"실제 단위"를 픽셀로 스케일링하는 일반적인 패턴?


10

이것은 이 다른 질문에 대한 후속 질문 입니다.

세계의 표현 (현재 160Kmx160Km) 을 그림 영역 (현재 800x600 픽셀) 에 맞게 스케일링하는 공통 / 일반 / 최상의 패턴이 있는지 알고 싶습니다 .

적어도 네 가지 접근법을 생각할 수 있습니다.

순진한 사람 (내가 지금까지 한 방식). sc(vector)전달 된 벡터의 축소 된 복사본을 반환 하는 전역 함수 를 구현 했습니다. 물론 작동하지만 다음과 같은 코드를 작성해야합니다.

drawCircle(sc(radius), sc(position))

랩핑 기능 . 여러 기능을 정의 할 수 있는데, 각각의 기능은 원래 미들웨어를 랩핑합니다. 예를 들어, myDrawCircle먼저 스케일링이 필요한 인수를 스케일링 drawCircle하고 후자 를 호출 하도록 정의 할 수 있습니다. 이렇게하면 코드를 더 읽기 쉽고 유지 관리하기가 쉬워 지지만 어리석게 들리는 많은 줄 바꿈 기능을 작성해야합니다.

함수 데코레이터 . 기존 미들웨어 함수를 간단히 장식하여 클래스의 인스턴스화되는 모든 매개 변수에 대한 자동 스케일링을 제공 할 수는 Vector3D있지만 문제는 해당 함수가 동일한 매개 변수와 함께 작동 list하거나 해당 매개 변수와도 작동 Vector2D하므로 데코레이터는 알 방법이 없다는 것입니다 어떤 목록은 축척이 필요한지 (예 : 반지름) 어떤 목록이 아닌지 (RGB 값)

표면 초기화 . 그릴 표면을 정의 할 때 스케일링 팩터를 정의 할 수 있습니다 (그래서 픽셀이 아닌 미터를 매개 변수로 사용하도록). 이것은 나를 위해 투명하게 작동하고 선택하는 솔루션 일 것입니다. 물론 미들웨어로 구현해야하므로 실제 옵션이 아닙니다.

... 어쨌든 : 이것은 매우 일반적인 문제이므로 찾지 못한이 문제를 우아하게 해결하는 확립 된 패턴이 있는지 궁금합니다.

추신 :이 프로젝트에서는 python ( pygame )을 사용하고 있지만 Python / pygame 관련 답변은 높이 평가되지만 구체적인 구현보다는 패턴의 일반적인 / 높은 수준의 설명에 더 관심이 있습니다.

시간과 전문 지식을 미리 감사드립니다.

답변:


6

이를 수행하는 표준 방법은 렌더링 중에 변환을 수행 할 변환 매트릭스를 설정하는 것입니다. 3D 렌더링의 경우 카메라를위한 뷰 변환 매트릭스입니다.

대부분의 2D API에는 뷰 변환도 2x3 매트릭스 또는 별도의 스케일, 변환 및 회전으로 지정하는 방법이 있습니다.

파이 게임 문서를 간단히 살펴보면 뷰 변환 매트릭스를 직접 구현해야합니다. 표면 클래스에서 자신의 클래스를 파생시켜 해당 기능을 추가 할 수 있습니까?


대답은 매우 유용합니다 (+1). Surface 클래스를 서브 클래 싱 할 수 있지만 게시물에 표시된 내용을 달성 할 수 있는지 더 많은 시간이 필요합니다. 나는 일반적으로 게임 프로그래밍과 그래픽에 익숙하지 않다.이 매트릭스 접근법 (또는 표면을 스케일링하기 위해 매트릭스를 사용하는 것과 관련된 수학 만)을 설명하는 링크가 있습니까? 감사합니다!

1
@mac은 2D이고 회전 이 없기 때문에 @mac은 기본적으로 함수를 래핑한다고 말하고 그 래퍼에서 간단한 스케일 나누기를 사용할 수 있습니다. 풀 매트릭스가 일반적으로 사용되는 이유는 대부분의 API에 뷰포트를 제어하는 ​​매트릭스가 있기 때문입니다. 그러나 파이 게임에서는 그렇게하지 않아도됩니다.
Patrick Hughes

2

이것은 매우 일반적인 문제이므로 찾지 못한이 문제를 우아하게 해결하는 기존 패턴이 있는지 궁금합니다.

일반적으로 사람들은 2D 게임에서 런타임 스케일링을 시도하지 않습니다. 나는 그것이 일반적인 문제라는 것에 동의하지 않습니다. 사람들이 미니 맵이나 다른 고정 크기 조정을 원한다면,이 목적을 위해 새로운 그래픽 세트가 종종 있습니다. 2D 게임에서 2 가지 확대 / 축소 수준으로 실행하려면 단일 루틴이 필요한 경우는 거의 없습니다.

3D API를 사용하는 경우 카메라 / 뷰포트 매개 변수를 변경하기 만하면이 기능을 무료로 사용할 수 있습니다.

PyGame은 매우 오래된 API이며 불행히도 2D에만 적합합니다. 다른 줌 레벨에 적합한 스케일링 시스템을 개발할 수 있어도 성능이 충분하지 않으며 외관이 용납 될 수 없을 정도로 나빠질 수 있습니다.

확대 / 축소를 많이하려면 최대한 빨리 최신 3D API로 전환하는 것이 좋습니다. 나는 피그렛 을 추천 하지만 다른 것들도있을 것입니다.


답변 주셔서 감사합니다 (+1). pyglets과거에는 이미 3D 시뮬레이션에 사용했습니다. 확실히보다 능력이 pygame있지만 2D에 대한 지원은 의 것보다 상당히 낮은 수준입니다 pygame. 사용 가능한 문서 / 예제도 자세하지 않으므로 게임 개발 초보자이기 때문에 가장 번거롭고 가장 일반적으로 수행되는 작업의 기초를 이해해야합니다. :) 파이 게임의 "나이"는 당신이 옳습니다. 현대화 그러나 진행 중입니다! :)
mac

"2 가지 확대 / 축소 수준에서 실행하기 위해 단일 루틴이 필요한 경우는 거의 없습니다." 귀하의 의견에서 나는 그것이 아니라는 것을 이해했습니다 : 대신 "일반적인"것에 대한 포인터?

피그 릿이 파이 게임보다 낮은 수준에서 어떤 2D 작업을 수행하고 있습니까? 둘 다 한 줄의 코드로 스프라이트를 그릴 수 있습니다. 2D 게임의 창 크기를 변경하면 픽셀 대 세계 단위 비율은 거의 항상 일정하게 유지됩니다. 그래서 당신은 더 많은 스프라이트를 그리게됩니다 : 당신은 그것들을 다르게 그리지 않습니다.
Kylotan

저수준 측면에서 : 나는 실제로 두 라이브러리 중 하나에 대한 전문가는 아니지만 피 글릿에서는 파이 게임에서 제공하는 그룹 렌더링 동작을 즉시 복제 할 수 없었습니다 (예 :) pygame.sprite.LayeredUpdates. 변하지 않는 비율에 관해서는 : 나는 당신이 의미하는 것을 얻었습니다. 당신이 묘사하는 행동은 내가 복제하고 싶은 행동이 아니지만 설명을 해주셔서 감사합니다. :)
mac

pyglet은 OrderedGroup 객체를 가지고 있습니다-당신이나 다른 누군가가 관심이 있다면 문서는 여기 있습니다 : pyglet.org/doc/programming_guide/displaying_images.html#sprites
Kylotan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.