Тіньовий кастинг в реальному часі у двовимірній ізометричній грі


15

Я пишу невеликий 2d ізометричний двигун на C ++ і намагаюся реалізувати тіньовий кастинг у реальному часі. Я дотримувався простого підходу, описаного на цій сторінці, і ось результат (світло розташоване в тій же позиції, що і жовтий куб):

введіть тут опис зображення

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

введіть тут опис зображення

Усі намальовані кубики просто виготовлені з 3-х двомірних квадратиків, розташованих у положенні XY та із глибиною Z (z = x + y). Я використовую OpenGL з ортографічною матрицею (glOrtho). Тіні малюються за допомогою буфера трафарету.

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

Дуже дякую!


5
Ваше посилання на "цю сторінку" вказує на зображення, а не на сторінку. Також я просто здогадуюсь тут, але це може бути простіше вирішити цю проблему в 3D і просто проектувати камеру іометрично.
Тетрад

Ой, ви маєте рацію, я виправив посилання З 3D проекцією, звичайно, було б простіше, але в 2D є і свої переваги, і я впевнений, що в 2D це є рішення.
XPac27

Відповіді:


6

Для даху та стін ви можете спробувати визначити перехрестя між вашими сегментами стін та створеними ділянками тіней. Вам потрібні два пропускання ваших тіней. Спочатку ви зробите те, що робите сьогодні (у пам’яті пам’яті). Другий прохід обчислить перетини даху та стіни. Останній етап - реальна візуалізація. DeadMG помиляється, ви можете це зробити.

Примітка: для даху ви повинні перетинати тіньову зону та зону даху.


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

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

@ XPac27 це дивовижно. Дякую, що поділились.
ashes999

0

По суті, те, що ви шукаєте, не можна зробити. Ви хочете взяти купу двовимірних об'єктів і надати їм тіні, як якщо б вони були 3D-об'єктами. Якщо ви хочете мати повні 3D тіні, вам потрібно мати 3D-об’єкти.


1
Але це не 3D-тіньовий кастинг, як у питанні. Будь-яка стіна повністю блокує лінію зору в цьому напрямку, ви не можете мати об'єкти різної висоти.
юрікс

0

Описане рішення не є повним 3d, оскільки йому не потрібно повне 3d рішення. Це буде виглядати, але це не так. Створення тіньового лиття слід розглядати як перетин між об'ємом. Те, що йому потрібно, є менш складним. Пам’ятайте (якщо у вас є коун) приріки та приречі, як рендеринг. Вся обробка проводилася в двох вимірах.


0

Зважаючи на те, що ви хочете, щоб ця гра була маленькою, як же сказати, що поточна реалізація тіні досить хороша?

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

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.