Från data till stadsmodell – Så skapade Malmö en 3D-modell i Unreal Engine

Vi har i Malmö Stad tagit fram en heltäckande visuell representation av kommunen i Unreal Engine 5. Underlaget till modellen är skapat automatiskt via FME med hjälp av data från olika källor. Att bygga på funktionalitet till modellen i Unreal Engine kommer inte att beskrivas av detta dokument.
Följande data har använts och/eller tagits fram för ändamålet:
- Terrängmodell över kommunen. Vi valde att använda ASCII GRID med 1m upplösning för snabbare framtagning men andra källor går lika bra.
- 3D-byggnadsmodeller. Någon form av 3D representation av byggnader som kan exporteras i ett format kompatibelt med Unreal Engine.
- Yt-data (polygoner) över kommunen, gärna så heltäckande som möjligt. Används för att dela upp terrängmodell och tilldela texturer i Unreal Engine enligt användningen av marken. (Valfritt).
- Koordinater för positionen på träd och/eller andra stadsobjekt. Räcker med position i plan då höjd kan tas fram från terrängmodellen.
- Någon form av områdesindelning (t.ex. delområden, stadsdelar). Används för att dela in resterande data i mindre delar. Fördelaktigt för prestanda och för lättare hantering av enskilda områden.
Terräng och byggnader
Kortfattat så har ovanstående data använts för att först skapa en TIN-modell över terrängen som sedan skurits i FME enligt områdesindelningen och slutligen med yt-/polygondata. Det vi nu har är mesh-modeller som vi, i vårat fall, vet t.ex. tillhörande beläggning och funktion. Vi kan exportera i lämpligt 3D-format på områdesnivå.
3D-byggnaderna hade vi redan för befintlig bebyggelse, indelat enligt områdesindelningen vi valde att använda. Om 3D-byggnader finns tillgängliga på annat sätt så bör dessa också delas enligt samma områden som ovan.

Exporten av ovanstående (förutom i lämpligt format) kan göras i större grupperingar t.ex alla byggnader i ett område eller alla vägar i ett område som har ett visst material, för enklare hantering och färre filer. Om man vill koppla attribut/data till enskilda meshar/objekt i Unreal Engine bör dessa skrivas som en fil för varje mesh/objekt enligt den struktur man vill visa data för t.ex. på byggnadsnivå eller fastighetsnivå.
Träd och andra stadsobjekt
Positionen för träd eller andra objekt som kan representeras som punkter i datan, men som behöver visualiseras i 3D, kan exporteras som en .CSV-fil med en tabellstruktur som är kompatibel med Unreal Engine. Om positionen endast är angiven i två dimensioner (plan), bör en höjdkoordinat läggas till baserat på den använda terrängmodellen.

Om ytterligare information, som exempelvis trädart, är tillgänglig, kan även denna inkluderas för att utnyttjas i visualiseringen. För mer information om hur detta tillämpas i praktiken, se dokumentationen om Data Tables i Unreal Engine.
Insättningspunkt och lokala koordinater
Viktigt för all ovanstående data är att det exporteras i lokala koordinater på ett sådant sätt att noll-koordinaten är densamma för allt dvs. insättningspunkten. Detta gör att alla objekt kan placeras på t.ex. (0,0,0) i Unreal och allt kommer vara korrekt placerat relativt till varandra. Underlättar även om redigering skulle behövas göras i annan 3D-mjukvara. Enkelt sätt att göra detta är genom att använda centrumpunkten för ett utsnittsområde som täcker hela kommunen för offset.

Sammanslagning i Unreal Engine
Nu när framtagning av underlag är färdigt kan allt importeras till Unreal Engine. Rekommenderad version är 5.2 eller högre och att ha en enkel filstruktur uppsatt.
Starta ett nytt projekt och se till att en relativt kraftfull dator används (gör ej detta med en dator utan ett dedikerat grafikkort). Vid import av byggnader och den uppklippta terrängen kan det vara fördelaktigt att göra detta lite åt gången och att vid import se till att ”Nanite” är bockad i rutan för import och att material/texturer bara importeras om det finns tillhörande sådana.
CSV-filerna för träd och andra objekt importeras separat men innan import bör en Tabellstruktur skapas i Unreal Engine så att den blir läst korrekt. Detta kan behöva lite försök fram och tillbaka för att få det att fungera.
När alla filer är tillgängliga kan allt som är 3D-meshar börja placeras i scenen. Enklast är att direkt efter varje gång något läggs till i scenen att skriva in insättningspunkten i (x,y,z) innan man importerar nästa fil.

För att visualisera träden i modellen och utnyttja koordinaterna från CSV-filen krävs det att vi först och främst har en 3D-modell av ett, eller flera, träd som ska stå på koordinaten. De importeras som ett vanliga 3D-objekt. Vi behöver sedan läsa vår CSV-fil i ett Blueprint (i Unreal) och i detta koda upp att ett träd ska placeras på varje position. Information kring hur detta görs bör vara enkelt att hitta.
Det vi har nu är en grundläggande samlad modell över kommunen utan funktioner eller data kopplat till specifika objekt. Nästa steg skulle rimligtvis var att tilldela material/texturer till alla objekt (använd texturer som är i power-by-two t.ex. 1024x1024px eller 2048x2048px etc.), lägga till enkel ljussättning och grundläggande funktioner såsom kamera och kontroller som sedan går att bygga på med mer funktionalitet.
Användning
I detta steget kan modellen användas i stor utsträckning för visualiseringar för olika ändamål med lite manuell bearbetning där det behövs. För att gå mot något mer interaktivt med en tillgänglighet till data och mer funktioner behöver detta implementeras i modellen.
Några exempel på funktionalitet hittas nedan:
- Solposition enligt tid, månad och dag samt förinställda ljusinställningar för olika årstider eller väderförhållanden.
- Få upp datatabeller (attribut) när man klickar på ett objekt som har kopplad data. (Unika namn rekommenderas)
- Byte mellan olika kamera lägen. Flyga, tredje person och första person. (VR rekommenderas som ett eget projekt)
- Ladda in/ut visuell data t.ex. draperade detaljplaner eller planerade byggnader.
- Visa analysresultat t.ex. buller, havsnivåhöjningar och trafik.
Reflektion
Att skapa en modell som kan användas för visuella syften i Unreal Engine är rimligt och erbjuder stor flexibilitet då man kan hålla hög kvalité med lite möda och för att funktionaliteten alltid kan utökas. Dock så ökar inlärningskurvan skarpt och kompetens inom programmering, systemdesign och 3D-grafik kan behövas för att inte framstå som överväldigande då det finns många system och inbyggda funktioner.