Загальна модель для масштабування «реальних одиниць» до пікселів?


10

Це додаткове запитання до цього іншого .

Мені хотілося б знати, чи є загальна / типова / найкраща картина для масштабування мого представлення світу (на даний момент 160Kmx160Km), щоб вона підходила до області малювання (на даний момент 800x600 пікселів).

Я можу придумати щонайменше чотири різні підходи:

Наївна одна (як я це робила досі). Я реалізував глобальну функцію, sc(vector)яка просто поверне зменшену копію переданого вектора. Це, звичайно, працює, але зобов'язує мене написати код на зразок:

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

Функції обгортання . Я міг визначити кілька функцій, кожна з яких обертала оригінальну проміжну програму. Наприклад, я міг би визначити, myDrawCircleщо спочатку буде масштабувати аргументи, які потребують масштабування, а потім викликати drawCircleостанні. Це зробить мій код, можливо, більш читабельним і простішим у обслуговуванні, але я повинен написати багато функцій обгортання, які звучать нерозумно.

Функція декоратор . Я міг би просто прикрасити існуючі функції середнього програмного забезпечення, забезпечуючи автоматичне масштабування всіх параметрів, які є екземпляром класу Vector3D, але проблема полягає в тому, що ці функції також працюють з тими ж параметрами, які є listабо Vector2Dзанадто, і декоратор не міг би знати які списки потрібно масштабувати (наприклад, радіус), а які ні (значення RGB).

Поверхнева ініціалізація . Визначаючи поверхню, яку я буду малювати, я міг би визначити коефіцієнт масштабування (щоб я потім використовував метри, а не пікселі як параметри). Це працювало б прозоро для мене і було б моїм рішенням вибору, але, звичайно, його слід реалізовувати в середньому програмному забезпеченні, тому це не реальний варіант.

... так чи інакше: оскільки це дуже поширена проблема, мені цікаво, чи існує усталений зразок, який елегантно вирішує цю проблему, яку мені не вдалося знайти.

PS: Для цього проекту я використовую python (з pygame ), але - хоча відповідь, що стосується python / pygame, дуже цінується, мене більше цікавить загальний / вищий опис шаблону, а не його конкретна реалізація.

Заздалегідь дякую за ваш час та досвід.

Відповіді:


6

Стандартний спосіб зробити це - встановити матрицю перетворення для перетворення під час візуалізації. Для 3D-рендерінгу це матриця перетворення перегляду для камери, яка це робить.

У більшості 2D API також можна вказати перетворення перегляду як матрицю 2x3 або як окрему шкалу, переклад та обертання.

Швидкий огляд документації на пігаме говорить про те, що вам доведеться самостійно реалізувати матрицю перетворення подання. Чи дозволяє вам отримати свій власний клас з його поверхневого класу, щоб дозволити вам додати цю функціональність?


Ви відповідаєте дуже корисно (+1). Я можу підкласирувати свій поверхневий клас, але мені потрібно більше часу, щоб вивчити, чи зможу я досягти того, що вказано у вашій посаді. Я дуже новачок в ігровому програмуванні та графіці взагалі, чи є у вас якесь посилання, яке б рекомендувало пояснити цей матричний підхід (або навіть лише математику, яка використовується за допомогою матриці для масштабування поверхні?). Дякую!
мак

1
Оскільки це 2D, а обертання не стосується @mac, це в основному говорить про завершення функцій, і ви можете використовувати ваш простий поділ за шкалою в цих обгортках. Причиною, що зазвичай використовується повна матриця, є те, що у більшості API є матриця, що управляє оглядовим вікном, але виявляється, що пігама це не так, що вам доведеться робити це самостійно в один шар.
Патрік Х'юз

2

Оскільки це дуже поширена проблема, мені цікаво, чи існує усталений зразок, який елегантно вирішує цю проблему, яку мені не вдалося знайти.

Зазвичай люди не намагаються виконати масштабування під час виконання в 2D іграх. Я не згоден, що це звичайна проблема. Якщо люди хочуть міні-карти чи іншої фіксованої шкали, часто для цього є новий набір графіки. Дуже рідко вам потрібна будь-яка єдина рутина для запуску з двома різними рівнями масштабування у 2D грі.

Якщо ви використовуєте 3D API, ви можете отримати цю функціональність безкоштовно - просто змініть параметри камери / вікна перегляду.

PyGame - це дуже старий API і, на жаль, дійсно підходить лише для 2D. Навіть якщо ви могли б розробити адекватні системи масштабування для різних рівнів збільшення, продуктивність буде недостатньо хорошою, а зовнішній вигляд, ймовірно, буде неприйнятно поганим.

Я б радив, що якщо ви хочете значно збільшити чи зменшити масштаб, ви якнайшвидше перейдете до сучасного 3D-API. Я б рекомендував pyglet, але, ймовірно, будуть і інші.


Дякую за вашу відповідь (+1). Я вже використовував pygletsраніше для 3D-моделювання. Це, безумовно, більш здібне pygame, але підтримка 2D досить нижчого рівня, ніж у pygame. Доступна документація / приклади також менш деталізовані, що для мене є складнішим, оскільки я початківець у розробці ігор, і мені дійсно потрібно зрозуміти основу найбільш часто виконуваних операцій. :) Щодо "віку" пігами: ви праві. Однак модернізація триває! :)
мак

Щодо: "Рідко вам потрібна будь-яка єдина рутина для запуску з двома різними рівнями масштабування" ... Я думав, що саме це буде використано при зміні розміру вікна / роздільної здатності повноекранної гри. З вашого коментаря я зрозумів, що це не так: будь-який вказівник на те, що натомість є "загальним"?
мак

Які 2D операції ви виконуєте там, де pyglet є нижчим рівнем, ніж pygame? Обидва дозволяють намалювати спрайт з 1 рядком коду. Коли ви змінюєте розмір вікна двовимірної гри, відношення пікселів до світу-одиниці майже завжди залишається незмінним. Тож ви просто закінчите малювати більше спрайтів: ви не малюєте їх по-іншому.
Kylotan

З боку низького рівня: я справді не знаю жодного з двох ліфтів, але в pyglets я не міг повторити поза рамкою групову поведінку, що надається пігеймом (як, pygame.sprite.LayeredUpdatesнаприклад,). Що стосується незмінного співвідношення: я зрозумів, що ти маєш на увазі. Поведінка, яку ви описуєте, не та, яку я хочу повторити, але я зрозумів, що ви маєте на увазі, дякую за роз’яснення! :)
mac

pyglet має OrdersGroup об’єкти - документи тут, якщо ви або хтось інший зацікавлений: pyglet.org/doc/programming_guide/displaying_images.html#sprites
Kylotan
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.