Miasto jest rekurencyjnie podzielonym prostokątem
Usunąć budynki i plan miasta staje się drzewem. Zaczynamy od jednego dużego prostokąta — całości mapy — i dzielimy go na dwa proste przejechania drogi. Podzielmy każdy z nich ponownie, aż do momentu, gdy część jest wystarczająco mała, aby stanowić pojedyncze bloki. To jest podział przestrzeni binarny, taka sama idea używana do układania planów dzwinów i renderowania kanałów, zastosowana do bloków miasta zamiast tego. Każda kropka staje się sekcją drogowej, a każdy liść drzewa staje się budowlany parcel, który już ma na co najmniej jednym boku granicę z drogą — co jest dokładnie właściwością, której losowe umieszczanie nigdy nie gwarantuje.
Orientacja i przesunięcie kropki są nieustalone — są one wylosowane z generatora liczb pseudolosowych z siedzeniem, dlatego ta sama siedzaba zawsze tworzy tę samą podział na tym samym węźle drzewa. To jedno właściwość jest to, co sprawia, że generowanie proceduralne jest powtarzalne: 32-bitowy całkowity wystarcza do odnowienia całego miasta, bajt po bajcie, na innym komputerze.
Dwie rodziny sieci drog
Prawdziwe miasta mieszczą dwie bardzo różne logiki generowania, tak jak i ich model proceduralny. Sieć siatkowa — większość downtownów amerykańskich, Eixample w Barcelonie — pochodzi z rekurencyjnej podziału osiowego: każda krotna podział jest pionowy lub poziomy, tworząc bloki kwadratowe o dość jednolitej wielkości. Sieć organiczna — stary jezioro europejskie, doliny obrzeża górskiego — pochodzi z rozrostu drog na zewnątrz w pojedynczych sekcjach wzdłuż ścieżki najmniejszego oporu, bliżej do systemu L niż drzewa podziału: każda kreska drogi rozszerza się, rozbija lub zatrzymuje na podstawie lokalnych zasad i małej ilości szumu, tak że żadne dwa gałęzie nie wyglądają tak samo.
subdivide(rect, głębokość): if rect.area < MIN_BLOCK or głębokość > MAX_DEPTH: emit_parcel(rect); return osia = choose_axis(rect) // preferuje dłuższą stronę podział = rect.size(osia) * jitter(0.35, 0.65) drogaA, drogaB = rect.cut(osia, podział, Szerokość_Drogi) subdivide(drogaA, głębokość + 1) subdivide(drogaB, głębokość + 1) Najbardziej przekonujące generatorzy łączą oba: organiczny szkielet arteriowy rosnie najpierw między kilkoma punktami ziarnowymi, a nieprawidłowe komórki, które zostają zalasseny tym skletem, są następnie wypełniane rekurencyjną podziałą siatkową — co jest blisko to, jak wielu prawdziwych miast rzeczywiście rosnęło, arterie najpierw, a następnie wypełnienie później.
subdivide(rect, depth):
if rect.area < MIN_BLOCK or depth > MAX_DEPTH:
emit_parcel(rect); return
axis = choose_axis(rect) // prefers the longer side
split = rect.size(axis) * jitter(0.35, 0.65)
roadA, roadB = rect.cut(axis, split, ROAD_WIDTH)
subdivide(roadA, depth + 1)
subdivide(roadB, depth + 1)
Zoning jako pole gęstości, nie regułka
Miasto nie wygląda jednorodnie, a generator powinien go traktować takim, jakim jest. Pole gęstości centrum miasta — najwyższe w punkcie seminatorycznym i malejące z odległością, z drugimi wzgórzami może być przy przestronnościach transportowych — steruje trzy decyzje naraz: jak głęboko rekursja podziału powtarza się (głęboka blisko centrum oznacza mniejsze bloki), jak duża jest część powierzchni bloku zajmowana przez budowlę (wyższa blisko centrum) i jak wysokie może być budowa na tym terenie. Wynikiem jest linią horyzontalną, która zanika od gęstej korei do niskich podmiejskich obszarów bez jednej ręcznie umieszczonej reguły o miejscu „centrum miasta” — to wynika z pola.
Z rynsztoku do budynku
Po utworzeniu rynsztoku, zamiana go na budynek jest znacznie prostsza: wprowadź granicę rynsztoku o mały przesunięty teren (setback), wyprostuj uzyskany rynsztok w górę o wysokość zaniesioną z pola intensywności lokalnej, a następnie opcjonalnie podziel wyprostowanie na piętra za pomocą powtarzalnego wzoru fasady. Niektóre generatorzy zmieniają sam rynsztok za pomocą drugiej, mniejszej podziału — L-shapowy budynek na terenie rogu lub blok dworski w centrum miasta — ale pole wysokości już wykonuje większość pracy koniecznej do stworzenia lini profilu budynków jako linię profilu zamiast pola identycznych szablonów.
Dlaczego determinizm ma więcej znaczenia niż realistyzm
Nie każdy generator proceduralnego miasta próbuje po prostu powtórzyć istniejącego miejsca blok za blokiem — wartość polega na nieskończonej, na żądanie dostarczanej i powtarzalnej treści. Ponieważ każda losowa decyzja jest wybrana ze strumienia zaszyfrowanego kluczowanego położeniem, miasto może być generowane w kafelkach na żądanie podczas przesuwny się kamery, bez potrzeby przechowywania więcej niż tylko siedmiotkanowego klucza i kilka parametrów, a każdy kafelek może być powtórnie wygenerowany identycznie w przyszłości. To jest ta sama technika użyta przez teren w Minecraft i planety w Nieznanej Ziemi (No Man's Sky), zastosowana do ulic i lini widoków zamiast jaskiń i biome'ów.
Często zadawane pytania
Czy wygenerowana miasto kiedykolwiek jest dokładnie takie samo dwukrotnie?
Tak, jeśli ponownie użyjesz tej samej ziarno. Cała struktura — drzewo ulic, podział bloków, zasprawdzanie i wysokości budynków — pochodzi z jednego strumienia pseudolosowych liczb całkowitych, więc jedno ziarno ponownie tworzy miasto dokładnie takie samo. Zmiana ziarna spowoduje, że każda dalsza decyzja prowadzi do innej miejscowości.
Dlaczego proceduralne miasta zwykle wyglądają jak siatkę w centrum i labirynt na krawędziach?
To jest świadomie zastosowana gradient gęstości: blisko punktu ziarnka, podział jest skierowany ku małym, regularnym prostokątne blokom, ponieważ rzeczywiste centra miast są pomiarowe i regularne; dalej pozwolono na większe i bardziej niezwykłe bloki, co symuluje sposób, w jaki okolicznościowe ulice powstają organicznie.
Dlaczego nie można tylko umieszczać budynków losowo zamiast rekurencyjnie podzielić?
Bo losowe umieszczanie nie ma pojęcia o sieci ulic, więc budynki by wLOATYWAŁY w przestrzeni lub nadmiernie się nakładały. Rekurencyjne podział gwarantuje, że każda działka, którą tworzy, już graniczy z ulicą co najmniej po jednym boku, co sprawia, że wynik jest budowniczy i przechodni, a nie tylko dekoracyjna szum.
Wypróbuj na żywo
Wszystko powyżej działa bezpośrednio w Twojej przeglądarce — otwórz Procedural City Generation Simulator i zmieniaj parametry podczas działania. Nic nie jest instalowane ani przesyłane na serwer, cały model działa w jednej karcie.
▶ Otwórz symulację Procedural City Generation Simulator