Як виготовляються двигуни на місцевості для вокселів?


53

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

Після того, як я зроблю місцевість вокселів, як я можу взяти ці вокселі та зробити їх зруйнованими / легкорозбірними ?


Я підберу найкращу відповідь на основі:

  1. код та алгоритми. бажано базуючись на C #
  2. пояснення. Я початківець з алгоритмами, але дуже добре знайомий з об'єктно-орієнтованим програмуванням
  3. поетапні демонстрації. Не тільки концепція, але й напрям.
  4. діаграми / ілюстрації. Ні, не скріншоти інших двигунів.


Я знаю, що це складний предмет. Але, дякую за будь-яку допомогу!

Ні, я не намагаюся зробити клон Minecraft.


Редагувати

Дякуємо всім за велику допомогу (особливо Ніку Віггілу)! Це мені вдалося зробити (Незавершена робота).


[єдність] і С ? Це ... мало сенсу.
Мартін Сойка

Я розумію С.
Даніель Пендергаст

8
Ви маєте багато віри в громаду з таким сміливим проханням. Я маю на увазі, повний документ про повністю динамічний воксельний край для сьогоднішнього обладнання з хорошим FPS, це повинно бути легко, правда? Ну, тема настільки широка і складна, я сумніваюся, ви побачите загальне рішення, і навіть тоді воно може бути абсолютно марним для вашого випадку. Але хто знає, це може бути здійснено залежно від вашої рольової моделі. Ви хочете місцевість Crysis 2 з вокселями чи Delta Force ? Можливо, ви робите клон Minecraft або просто вам потрібна імітація піску для гри в копання? Визначте сферу, будь ласка.
ДоситьTea

2
Ознайомтеся з цим посередництвом : forum.unity3d.com/threads/… . Особливо демо
Тетрад

1
У GPU Gems 3 є розділ про місцевості вокселів: http.developer.nvidia.com/GPUGems3/gpugems3_ch01.html
Tamschi,

Відповіді:


58

Для формування воксельної місцевості

(a) Поширеним методом є створення карти висоти за допомогою шуму Перліна. Карта висоти - це, в основному, монохромне зображення, що представляє різні висоти за темністю або легкістю пікселів.

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

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

(b) Ви можете побудувати його поступово, створивши пейзаж з різних багатогранників. Створіть багатогранну векторну форму, яка наближається до потрібної вам форми вокселів. Використовуючи будь-який метод 3D-точка в поліедрі (найчастіше, «точково-опуклий корпус»), перевірте, які точки вашої світової сітки потрапляють під об'єм поліедра. Наприклад, визначте піраміду в просторі. Перевіривши кожну точку в місцевому просторі вашого світового простору на тому пірамідальному об'ємі, ви дізнаєтеся, які точки потрапляють до нього, і ви можете встановити ці клітинки як "теперішні", тобто вони стають вокселями, а не порожнім простором. Тепер у вашому просторі є воксельна піраміда. Ви можете продовжувати додавати фігури будь-якого типу разом, поки не сформуєте місцевість.

(c) (дійсно те саме, що і b ) Напишіть інструмент моделювання. Voxatron показують, як це виглядатиме. Це просто створення форм вокселів у світі підміни (редактор), а потім імпорт їх у ваш фактичний ігровий світ. Я вважаю, що у Voxlap був перший редактор з відкритим кодом для вокселів. Ви можете розміщувати окремі вокселі, а також можете використовувати «кисть» з різними формами / обсягами, щоб малювати вокселі у своєму світі.


Що вам знадобиться для створення власної гри на основі вокселів

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

Простота може бути проблемою, тому що динамічне побудова світу із сирих вокселів є процедурним підходом до світової побудови, і це не властиво просто . Тож вибачте, тут буде кілька технічних термінів. Написання двигуна вокселів є досить серйозним завданням і вимагає знань з різних областей розвитку ігрового двигуна, особливо з точки зору просторових концепцій, а це означає розуміння 3D векторної математики, матриць та базового обчислення до певного розумного рівня.

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

Вокселі - це основні будівельні блоки вашого світу. Їх позиції визначаються цілою 3D-індексованою сіткою (масивом), а не суцільним простором з плаваючою комою (як використовується у векторних 3D-іграх). Це будуть "атоми" вашого світу. Вони можуть бути висотою до 3 футів, як у таких іграх, як Minecraft, або вони можуть бути меншими, ніж насправді може побачити око вашого віртуального персонажа, якщо тільки вони не згрупуються у великій кількості - трохи більше схожі на молекули. Існує два види:

  • Кубічні сітчасті вокселі ( приклад ) - це новіший сорт, який використовується для простоти і легко використовується у поєднанні з сучасними графічними технологіями. Використовується в таких іграх, як MineCrat і Dungeon Keeper.
  • Точкові вокселі ( приклад , приклад ) - вихідний воксель. Кожен є індивідуальною, зібраною точкою у просторі, хоча він може бути оточений сферичним обмежувальним об'ємом. Вони простіші, тому ви можете мати їх багато більше у своєму світі, і ви можете, таким чином, зробити їх меншими, що, як правило, сприятливо. Дві ігри, які використовували їх, були «Команш» та рімейк «Господарів півночі» 1990-х років.

Так чи інакше, ваш підхід до маніпуляції з вокселями у вашому світі майже такий же, як і далі.

Для побудови та переміщення об’єктів у вашому світі вам знадобляться математичні засоби, згадані вище. Наприклад, для створення стіни: Побудуйте коробку відповідних розмірів у просторі 3D, використовуючи вектори. Використовуйте матричну математику, щоб перетворити свій ящик на обертання та положення, яке ви бажаєте у вашому 3d світі (у безперервному векторному просторі). Для двигуна вокселів додатковим кроком є ​​використання алгоритму 3D-введення в багатогранник для визначення того, хто з ваших вокселів потрапляє всередину обертового простору.

По суті, це спосіб побудови більшості об'єктів у вашому світі. Крім цього, ви можете написати власні інструменти для "моделювання" персонажа так, як ви можете сказати, Майя або 3DS Max. Але оскільки ви моделюєте персонаж із вокселів замість точок, країв та облич, ваші методи будуть суттєво відрізнятися. Якщо ви вирішили потім обертати ці об'єкти у вашому світі, вам знадобиться аналогічно використовувати матричні перетворення для цього.

Зруйнований рельєф настільки ж простий, як або видалення одного вокселя одночасно відповідно до обраного вами методу, або використання операцій CSG (Constructive Solid Geometry) на великих обсягах вокселів для видалення їх відповідно до певного заздалегідь визначеного обсягу; наприклад, якщо зйомка лазерного променя через скелю, ви можете використовувати циліндричний об'єм для віднімання вокселів, тут промінь стріляє через скелю. CSG - це відносно простий процес з використанням 3D-просторових сіток, які формують ваш світ вокселів, і перевірки кожної комірки в розділі базової сітки (в даному випадку скелі) проти іншої сітки (в цьому випадку лазерного променя)

Для того щоб мати матеріальні "потоки" (як натякав Вигіл у своєму коментарі про пісок), вам потрібно буде вивчити динаміку рідини та стільникові автомати. Їх використав автор "Карликової фортеці" Тарн Адамс у тому, що по суті є також воксельним світом (хоча вокселі в цьому випадку набагато більші, порівняно з "Dungeon Keeper", принцип залишається тим самим). Це передові теми, а не необхідність для воксельних двигунів, як визначено, тому я залишу це "заглушкою" для ваших власних досліджень.

CSG і динаміка рідини приводять мене, нарешті, до оптимізації. В даний час розробники Voxel майже виключно використовують рідкісні воксельні октриси (SVO), що є методом підрозділення воксельного простору на різні роздільні здатності, про що свідчить у цьому відео, що демонструє майбутній механізм Atomontage. Використання octrees / SVO - це скоріше необхідність, ніж вибір оптимізації, оскільки накладні витрати, пов'язані з обробкою однієї масивної рівномірної сітки. По суті, octree - це дерево (спрямований ациклічний графік), де кожен вузол має 8 або нульових дочірніх вузлів, залежно від того, чи містить у ньому простір фізичних об'ємів. Діаграми , що показують , як octrees поділяють простір для формування вокселей знаходяться тут .

Найкраща реалізація вокселів з відкритим кодом, про яку я знаю, - це Voxlap Engine Кен Сільвермана , який використовувався для Voxelstein3D. Він написаний на C ++ і реалізує операції CSG для деформації місцевості.


Зміна вікі спільноти є постійною, немає можливості її змінити. Вам потрібно буде видалити та відтворити свою відповідь (звичайно, жертвуючи наявними голосами)
Джессі Дорсі

meta.stackexchange.com/questions/2974/… модератори претензій можуть її видалити. Не знаю, чи все змінилося. Дякуємо, що в будь-якому випадку вивчили це
Інженер

1
Ідіть фігурою, будьте обережні наступного разу.
Джессі Дорсі

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

1
Текстурування неявне. Справжні вокселі, на основі сітки чи ні, кожен має чистий колір. Вищезазначені підходи просто створюють більш реалістичну деталізацію та дозволяють використовувати комбінований мережевий підхід (google Unity VoxelForm). Чим тонше ваші вокселі, тим вища деталізація текстури. Приклад: моделювати русло річки як скельне (сіре). Перетворіть кожен піксель на відстані x відстані від поверхні, в пісок, встановивши ці вокселі, щоб мати material = "sand"; вони можуть бути представлені у вигляді пісочного кольору. Крім того, це може вплинути і на їх фізичну інтерактивність, тому пісок може переміщуватися водою або викопуватися.
Інженер

33

Найкращий спосіб генерувати цікавий воксельний рельєф - це карта щільності шуму Перліна. Замість того, щоб використовувати 2D карту шуму Перліна, що визначає висоту 3D-світу, використовуйте 3D-шумову карту Перліна. Зважте карту так, що значення ближче до низу будуть більш імовірними, а значення ближче до вершини, безумовно, будуть повітряними. Це дає вашій світовій висоті, але також дозволяє виконувати надвіси та печери, подібні до місцевості Minecraft , як показує цей вид збоку фрагмента місцевості:

Світ з нависаннями

Звідси ви можете протестувати на плавучі острови або додати печерні системи, використовуючи фрактальний шум:

Світ із печерною системою

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


4

Інші відповіді тут чудові, але я взяв дещо інший підхід.

Я генерую середовище в інструменті моделювання (3DSMAX) і будую з нього рідкісний октрис. Кожен кубічний непустий листовий вузол - це воксель. У часі візуалізації я використовую радіомовлення (реалізований у HLSL), щоб знайти, який воксель займає піксель, і встановити піксель у кольорі, що зберігається у вузлі, який я обчислював при генерації дерева шляхом усереднення значень текстури з вихідної моделі.

Це дає багато приємних переваг - виявлення зіткнень для вільного, змінного LOD, вимкнення місця в огляді тощо - і, окрім райкостер, - його легко реалізувати.

На жаль, майже неможливо розмістити зразок коду з телефону.


+1 для альтернативи. Хоча це неможливо здійснити з розумною ефективністю, плюси значно переважають мінуси. Передача вокселів накладає величезні витрати на GPU. Арифметичні та умовні умови, необхідні для цього, коштують дуже дорого, коли ті самі цикли GPU можуть застосовувати ряд вражаючих ефектів екранного простору, наприклад. SSAO. Найбільша проблема полягає в тому, що радіомовлення виглядає найкраще з декількома відскаками, як виявлено в радіосистемності - нежиттєздатною ні для сцени, яка складається з мільйонів або мільярдів вокселів, і де кожен промінь сегменту потребує значних зусиль, щоб підстрибнути і скласти.
Інженер

... Ось чому я в своїй відповіді (VoxLap) згадував скалінове випромінювання лише в сторону - навіть це важко добре здійснити. Якщо ви можете працювати з вертикальним підходом до сканування, вартість - це на порядок менше, ніж за піксельним промінням, оскільки ви зменшили розмірність процесу візуалізації з 3D до 2D. Такий підхід я до сих пір стояв, хоча він не виключає можливих складних освітлювальних рішень із традиційним RTRT.
Інженер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.