3D i olika sammanhang är väldigt användbart, men till skillnad från Esri ”plattformen” så är integrationen av 3D lite si och så i system med öppen källkod. I ArcGIS Pro är det möjligt att hantera kartor och data i 2D, växla till 3D och fortsätta arbeta med samma typ av verktyg där. När man skapat sina 3D modeller kan man enkelt publicera en scen till en Enterprise server som en 3D webb scen…
Riktigt såhär enkelt är det dock inte och att redigera modeller i 3D är inte helt problemfritt, men det finns ett systemtänk där 3D är helt integrerat på ett sätt som inte förekommer i exempelvis QGIS. Visst, det går att visa data i en 3D vy, men det går inte att redigera där. Det är heller inte så smidigt att inkludera 3D objekt annat än som punktsymbolobjekt. Den modellering jag tänkte visa här går exempelvis inte att lägga till i QGIS.
Utgångspunkten är ett punktmoln. Det kan vara laserskanningar eller beräknat från RPAS/drönare men i mitt exempel så är det fotogrammetri med en handhållen kamera.
Startläget är CloudCompare, men modelleringen kommer att göras i Blender (version 3.4). Att hantera punktmoln i Blender är inte problemfritt, så det gäller att skapa så goda förutsättningar som möjligt. Detta handlar i huvudsak om att reducera antalet punkter så mycket som möjligt. Ju ”sämre” grafikkort man har desto mer måste punktmolnet reduceras.
Ett annat problem är att Blender lagrar koordinater som 32-bitars tal, vilket inte räcker när det gäller koordinater projicerade i SWEREF99TM eller UTM. Därför så bör punktmolnen öppnas i CloudCompare med alternativet Preserve global shift on save avstängt.
Jag börjar med att ”klippa” punktmolnet så att det bara innehåller de referenser jag behöver för att modellera det aktuella huset.
Därefter sub-samplas punktmolnet med en lämplig punkttäthet. I det här fallet väljer jag 5 cm, vilket säkert räcker.
För att kunna öppna punktmolnet i Blender så måste det sparas i *.PLY format. Det går även att använda ett add-on i Blender kallat Point Cloud Visualizer som kan köpas på Blendermarket. Med detta går det att importera även LAS/LAZ och E57 (m.fl.).
Det reducerade punktmolnet sparas som PLY i ASCII format. Därefter är det dags för Blender.
I ett nytt projekt raderas alla default-objekt (A, X) och sedan importeras PLY filen (File, Import…). Om man inte tagit bort koordinaterna i CloudCompare så kommer ingenting att visas, eftersom punktmolnet är georefererat lång ifrån koordinaterna 0,0,0 som Blender utgår ifrån. Det går att panorera till punktmolnet genom att välja View, Frame Selected (numpad .).
Det går att jobba här, men det är otroligt struligt då Blender inte beter sig speciellt förutsägbart. Dessutom är storleken på koordinatsiffrorna en begränsning som gör att punkternas position blir väldigt oprecisa eftersom de är avrundade till just 32 bitar. Se i stället till att redan i CloudCompare slå av Global Shift vid importen, så kommer punktmolnet att visas mitt i 3D vyn i Blender.
Som standard vid importen följer inte färger men om man vill så går det att fixa med ”shading” och ”geometry nodes”, men för det här exemplet så nöjer jag mig med punkterna som dom är. Om man använder Point Cloud Visualizer så löser tillägget allt detta så om man skall jobba mycket med punktmoln så kan det vara värt 75$.
Börja med att identifiera en bra startpunkt, exempelvis ett hushörn. Placera 3D markören där (shift höger-klick). Infoga därefter en lämplig geometri att börja med. I mitt fall är det en kub. Objekt läggs till med tangentbordskombinationen shift+A där sedan önskad geometri väljs.
Objektet placeras med centrum där 3D cursor finns, och den första åtgärden blir att flytta kuben så att motsvarande hörn sammanfaller med byggnadens hörn. Flytta bara ”1” meter (kuben är 2x2x2 meter) i X, Y och Z med kombinationen ”G” ”X|Y|Z” ”1|-1”, bekräfta varje flytt med Enter. Om kuben rör sig i oönskad riktning så använd Backspace eller Esc.
För att underlätta för mig så flyttas sedan kubens geometricentrum (lilla punkten ovan) till 3D cursor via högerklick och Set Origin och Geometry to 3D cursor (som tidigare). Nu kan jag skala och rotera kuben utan att det aktuella hörnet rör på sig.
Jag börjar med att skala upp kuben med ”S” något, samt ”R” för att rotera. Det går att ”låsa” skalningen i X, Y eller Z led genom att trycka två gånger på X, Y eller Z. Det första trycket låser i 3D vyns referenssystem och det andra i objektets. Detta behövs om man roterar kuben från den initiala placeringen. Det går även att låsa rotation runt objektets interna axlar med ”R” och dubbla tryck på X, Y och Z.
Nu är inte detta en instruktion i hur man använder Blender, så du får modellera så mycket du kan, men i stort räcker det att skapa en rimlig kub i överensstämmelse med punktmolnet för att testa principerna.
När modellen är klar så skall den exporteras till OBJ. Det går att exportera till andra format också, men jag har haft ganska lyckade resultat med just OBJ.
Se till att ditt 3D objekt är det enda som är valt i programmet. Gå därefter till File, Export… och välj Wavefront (obj). I dialogen är det några saker som är viktiga att kontrollera.
Se till att endast det valda objektet exporteras och att Forward Axis är Y, samt Up är Z. Därefter är det dags att återplacera objektet på rätt plats i koordinatsystemet i CloudCompare.
I CloudCompare läses det ursprungliga punktmolnet in tillsammans med obj-modellen. De bör hamna på ungefär samma plats, med den stora skillnaden att punktmolnet har ”Global Shift” och modellen inte har det. Om modellen inte är riktigt på rätt ställe så kan den flyttas med Rotate/Translate verktyget och när den är på rätt ställe så skall punktmolnets ”Global Shift” appliceras. Detta görs via Edit och Edit Global Shift and Scale.
Här går det att välja ”Previous input” så att det blir samma shift som punktmolnet. Se även till att Keep original position fixed inte är ikryssat. Efter detta är det bara att spara objektet igen. Det nya objektet har korrekta koordinater i det valda koordinatsystemet.
Det går att testa i CloudCompare genom att stänga alla filer och sedan från en filhanterare markera, dra och släppa punktmoln och den refererade obj-filen samtidigt i CloudCompare och välja Yes to All för att applicera samma global shift till båda objekten. Detta skall förhoppningsvis visa båda med god överensstämmelse i 3D vyn.
Det går även att visa punktmoln och modellfil tillsammans i Potree viewer.
Det krävs lite modifieringar av html- och javascript-koden, och beroende på hur man vill att objektet skall visas så behöver man göra mer eller mindre omfattande redigeringar. Jag har skrivit om detta tidigare som du kan läsa om här. Skillnaden är att i det här fallet behöver man inte justera objektets position, då alla koordinater är i samma koordinatsystem som punktmolnet. Sedan är inte Potree heller speciellt bra på att hantera koordinater större än 32-bitar, så räkna med att modellen hoppar runt lite när positioner avrundas… Vill man slippa detta så blir alternativet att spara modellen utan korrekta koordinater och ”placera” den i det program man vill lägga till den i. Jag får undersöka detta lite närmare. Det kanske går att använda en och samma referenspunkt för allt detta. Samma referenspunkt som skapades för 3D cursor i Blender.
Det GÅR med andra ord att använda program med öppen källkod för att samla in grunddata, redigera 3D modeller, se till att dessa är geografiskt korrekt placerade och sedan visualisera det i en webbläsare via ett nätverk. Men om jag vill använda 3D modellen i QGIS… då blir det mer problem. När eller ”om” QGIS får stöd för georefererade ”äkta” 3D format av den här typen så kanske situationen förändras, men det är även lite si och så med standarder för 3D. Esri använder sina egna ägda format för allt detta, även om de också börjar stödja exempelvis OBJ i ArcGIS Earth (osäker på Pro). Om GLTF kan vara ett 3D format för framtiden och 3D GIS är inte säkert, men det kanske är en bra kandidat att starta med?