Opdracht / Eindresultaat
Photogrammetry is de techniek van het aan de hand van fotodata creeren van een in 3D bestaand object. Photogrammetry word veel gebruikt voor het creeren van terrein en kaarten vanuit luchtfoto’s. De laatste paar jaar is het gebruik van Photogrammetry voor 3D models van objecten en personen hard aan het groeien. Het principe word vooral toegepast in CGI voor films. Simpel beschreven creeert de software aan de hand van het verschil per foto ankerpunten (Floating points) in 3D space. Uiteindelijk worden deze ankerpunten gebruikt voor het generen van een 3D mesh. De foto word gebruikt om een texture te generen door de foto’s te combineren. Photogrammetry heeft een aantal voordelen en nadelen tegenover conventioneel 3D modelen. De grootste voordelen van Photogrammetry is een hele hoge mate van fotorealisme. Deze techniek zorgt voor een bijna 1 op 1 kopie van de werkelijkheid met heel veel detail. Dat zorgt ook voor een van de nadelen van de techniek. De models die gecreert worden doormiddel van photogrammetry zijn heel groot en zwaar om te renderen. Een hedendaagse game engine kan het niet aan om models van dit detail te renderen. Een ander voordeel van photogrammetry is de snelheid waarmee een model gemaakt kan worden. Het modellen van een object met dezelfde mate van detail en realisme vergt een ongeloflijk getalenteerd 3D modeler en heel veel van zijn tijd. De models worden weliswaar nog aangepast maar de basis ligt er al. Er zitten ook een aantal nadelen aan het gebruik van photogrammetry. Het opzetten van een photogrammetry opstelling vergt precisie en heel veel camera’s. In het professionele circuit wordt er gewerkt met 80 camera’s. Maar het kan ook gedaan worden met aanzienlijk minder camera’s. Verder zijn texture maps die gebakken worden vanuit foto’s vaak vervuilt met schaduwen en moeten die handmatig in photoshop verwijderd worden, of moet er een lichtopstelling gemaakt worden waarbij vrijwel alle schaduwen op het subject wegvallen. Als men dit niet doet is het bijna onmogelijk om realistisch andere belichting over het bestaande object te leggen. Als een texture map mooi zonder schaduwen gemaakt word kan hij in bijna elk soort belichting gemaakt worden. Ik heb mij doormiddel van verscheidene bronnen ingelezen over het onderwerp en denk er voldoende kennis over te hebben om zelf een opstelling te maken en een proof of concept op te zetten om op een laag budget deze techniek toe te passen. Als prototype wil ik een 3D representatie van een mens creeeren doormiddel van photogrammetry. Mijn beperkt aantal geld zal ervoor zorgen dat ik moet gebeuren met een beperkt budget. De kunst zal hem gaan zitten in het zo fotorealistisch maken van de scan en het maken van een pipeline die met beperkte middelen doorlopen kan worden.
Programmatuur
Voor het bereiken van mijn doel moest ik op zoek naar een programma die mij daarbij ging helpen. Vanwege van kennis met Autodek Mudbox en Maya word dit sowieso toegepast in het proces. Voor het berekenen van de floating point maps en deze omzetten naar 3D meshes zou ik een ander programma moeten gaan gebruiken. Mijn interesse voor fotogrammetrie stamt uit een CGI trailer voor een game
genaamd Cyberpunk 2077. Bij het lezen van post mortums kwam het gebruik van fotogrammetrie voor het scannen van personen ter sprake en hoe ze dit hadden toegepast om het realisme te verhogen. Na onderzoek bleek dat men gebruik had gemaakt van een programma genaamd PhotoScan gemaakt door een Agisoft. Vanwege het gezien hebben van de behaalde resultaten heb ik besloten Agisoft PhotoScan te gebruiken.
Het proces Poging 0 Object Camera’s Type’s Lens
3D model Eifel toren 1 Nikon D600 Nikkor 50mm 1.8AF-S
Na wat ingelezen te hebben over het onderwerp en de werking van de programmatuur dacht ik dat het een goed idee zou zijn om de feel te krijgen voor het echte werk. Ik pakte mijn camera en ging aan de slag met een 3D geprint model van de Eifel toren. Ik zette het object op een tafel en begon er wat foto’s rond te schieten. Na dit voor een paar minuten gedaan te hebben was het tijd om de software te testen. De gemaakte foto’s moesten eerst correct gepositioneerd worden en de informatie in de foto’s die niet nodig waren moesten eruit gemasked worden. Gelukkig had de software voor dat eerst een handige functie, “Align Cameras”. Helaas had hij niets voor het masken van foto’s. Dus moest er in Photoshop het een en ander van de foto’s gehaald worden. Doordat ik niet gebruik had gemaakt van een even achtergrond of een studio was de achtergrond bezaaid met rotzooi. Na alle foto’s (+/- 30) gemasked te hebben voerde ik ze in. Toen liep ik tegen een ander probleem aan. Het model van de Eifel toren is aan 4 zijden identiek, hierdoor was het voor het programma niet mogelijk om uit te vogelen welke camera waar hoorde. Deze eerste poging liep dus uit op een behoorlijke leerervaring (mislukking). Geleerd: Zorg dat de achtergrond vrij is van zooi Zorg voor een object dat niet symmetrisch is over meerdere assen. Plaats de camera op een statief om het beeld mooi recht te houden.
Poging 1 Shoot / Opstelling Voor deze shoot heb ik mij beter ingelezen over verschillende tips en tricks om tot een beter resultaat te komen. Verder heb ik mijn bevindingen uit de vorige sessie meegenomen om de resultaten van deze sessie te verbeteren. Ik heb ervoor gekozen om complexere modellen te gebruiken (mensen) en dit in een fotostudio uit te voeren. Gedurende de sessie heb ik gewerkt met zowel wit doek als groen doek om verschillende zaken te proberen. Verder maak ik nu gebruik van een statief om de positie van de camera vast te hebben staan.
Object Camera’s Type’s Lens
Sander Saelmans, Jos van de Manakker 1 Nikon D600 Nikkor 85mm F5
Omdat ik maar 1 camera ter beschikking had en er een 360graden beeld van het onderwerp gemaakt moet worden heb ik het object op een bureaustoel gezet zodat hij om zijn as kon draaien. De focus heb ik gelegd op het hoofd omdat deze de meeste detail bevat. Omdat er goed beeld gevormd moet worden van zowel de bovenkant van het hoofd als de onderkant van de kin heb ik ervoor gekozen om het proefpersoon 3 omwentelingen te laten maken. Ik zal elke omwenteling een ander perspectief pakken zodat zowel de voorkant als de bovenkant als de onderkant van het gezicht goed in beeld was. De onderstaande reel is een voorbeeld van 1 perspectief die die middag gemaakt was. Zoals te zien is heb ik gebruikgemaakt van een wit scherm wat door slechte whitebalance bruinig overkomt.
Verder hebben wij die middag nog geëxperimenteerd met verschillende methoden, technieken, perspectieven, schermen en lenzen. Wij hebben gekeken naar de T-pose voor een full body shot geëxperimenteerd met mensen met haar of met pet op. Welke kleur background het beste gaat werken. Er zijn deze middag 285foto’s gemaakt.
Verwerking
De grote hoeveelheid foto data die die middag was vergaard moest natuurlijk verwerkt worden. Hier liep ik tegen een aantal interessante technische obstakels. Het programma kreeg voortdurend sets van +/- 85 foto’s voor de kiezen. Dit vergde een ongelofelijke hoeveelheid RAM geheugen. Hiervoor heb ik mijn systeem moeten upgraden van 16GB RAM naar 32GB DDR3 2011mhz RAM. Samen met de Intel hexacore processor wat mijn pc een van de snelste consumenten pc’s maakt gingen de berekeningen nog gestaag. De verwerking van zo een set foto’s doorloopt 3 stappen. Align Camera’s Deze berekening heeft een aantal parameters. Hoe preciezer hoe meer tijd de berekening vergt. Wat er gebeurd is hier worden alle foto’s met elkaar vergeleken om een schatting te maken van de positie van de camera tegenover het object. Deze stap kan overgeslagen worden door de precieze locatie van de camera in te voeren in het systeem. Dit betekend voor 80 foto’s, 80 waardes die in tabellen moet worden ingevuld. Deze stap herhaal je een aantal keer om te zorgen dat er geen camera’s op plekken staan waar ze niet horen. Elke iteratie van deze stap neemt ongeveer 1.5uur in beslag. De camera alignment goed krijgen kan best een halve dag kosten.
Build Mesh Zodra de camera’s op de juiste locatie staan en de point cloud is aangemaakt word het tijd om de point cloud om te zetten in een 3D mesh. De stap duurt verreweg het langst van alle stappen. Er moet een afweging gemaakt worden tussen detail en tijd. Men kan aangeven dat het aantal polygonen dat het programma mag gebruiken oneindig is. Dit heeft in gevallen meshes gegenereerd van 2.2miljard polygonen. Meestal ging ik voor een veilig nummer tussen de 500.000 en 1.000.000 polygonen. Dit zorgt voor rendertijden van +/- 9uur. Na deze stap heb je een 3D mesh van de ingevoerde foto data. Alles wat nog overblijft is het aanmaken van textures. Build Textures Het builden van textures is net zoals elke andere stap een kwestie van trial and error geweest. Bij het bouwen van textures kijkt de software naar alle ingeschakelde camera’s om een gemiddelde orthografische map te maken. Het probleem is omdat wij onze foto’s niet op het zelfde moment maakten is elke foto minuscuul verschillend van elkaar. Dit geeft een soort van blur over het model.
Het model is nu gereed om gexporteerd te worden naar een programma naar keuze. Mijn voorkeur gaat uit naar Autodesk Maya. Je exporteerd het model naar .OBJ formaat en de texture map naar 2048x2048 TIFF formaat. Maya In maya was duidelijk te zien dat er problemen waren met de hoeveeldheid “smooth” die het model had. De huid leek over het algemeen op een behoorlijke korrel schuurpapier. Na wat onderzoek bleek het probleem te zitten in het overdrijven van de oneffenheden in de huid. Deze worden behoorlijk overdreven in het software pakket. Mijn idee om dit op te lossen was het model inladen in Autodesk Mudbox en de oneffenheden eruit sculpten. Helaas bleek dit geen optie, de reden hiervoor was dat de meshes die aangemaakt
worden van zichzelf ongelofelijk high resolution zijn. Dit zorgt ervoor dat Mudbox zijn eigen subdivision algoritme er niet overheen kan gooien. Een ander probleem waar ik tegen aangelopen ben is het probleem dat er geen clean meshes worden gemaakt. De output heeft Tshapes en non-geometrical faces. Daardoor heeft Mudbox problemen om te gaan met deze geometrie. De volgende image is een Maya mental ray render van het model dat ik van Sander Saelmans gemaakt heb.
Men kan zien dat er sinds de vorige iteratie behoorlijke stappen zijn gezet naar een werkend prototype. De hele pipeline is succesvol doorlopen en er is een eindresultaat om te laten zien.
Poging 2
Voor de 2e sessie wou ik meerdere camera’s gebruiken om alle data in 1 rotatie te creëren. De potentiele problemen waren verschillen tussen camera modellen.
Shoot / Opstelling Object Camera’s Type’s
Lens
Sander Saelmans, Richard Koster 6 Nikon D600 Nikon D5100 Canon EOS 550D Canon EOS 550D Canon EOS 650D Canon EOS 650D Nikkor 85mm F5 Nikkor 50mm F5 Canon 45mm F5
Gedrunde deze sessie wou ik proberen door meerdere camera’s te gebruiken een ongelofelijk grote hoeveelheid data te genereren. Dit is ook behoorlijk gelukt, ik heb 6 camera’s gebruikt die
samen 1500foto’s hebben gemaakt over 4 sets. Tijdens het schieten liep ik tegen een aantal problemen aan. Het triggeren van 6 camera’s tegelijk is toch een behoorlijke uitdaging, en elk merk en type camera heeft een uniek beeld. Hierdoor zijn de foto’s niet consistent. Dit bleek uiteindelijk in de verwerking een behoorlijk probleem. Ik heb dezelfde techniek gebruikt als ik heb gebruikt bij de vorige sessie. Het object op een bureaustoel gezet en hem laten ronddraaien op de stoel.
Verwerking
Het verwerken van deze sessie was werkelijk waar een pure hel. De 6 camera’s hadden allemaal hun eigen kleurbeeld en distorsie. De problemen met de ongelofelijke hoeveelheid data zorgde
ervoor dat ik geen pc’s meer had die krachtig genoeg waren om deze data set te verwerken. Ik heb hier behoorlijk wat uren in gestoken om er iets werkends uit te krijgen maar dat heeft helaas niet mogen baten. Mijn tip voor de volgende sessie zou dan ook zijn om back to te basics te gaan en kwantiteit niet voor kwaliteit te stellen.
Poging 3
3 keer is scheepsrecht zegt men. Ik ben bij mijn vorige sessie veel te ver gegaan met het creëren van data dat ik het zicht verloren ben op kwaliteit en mij focuste op kwantiteit. Deze sessie was dan ook back to the basics. Alles moest tot op de millimeter goed staan. Ik moest voor deze poging ook een aantal problemen oplossen. De grootste was het triggeren van meerdere camera’s. Ik heb de keuze gemaakt om uitsluitend Nikon camera’s te gaan gebruiken. Gelukkig hebben Nikon camera’s een IR ontvanger wat mij de mogelijkheid gaf om voor een paar tientjes een IR zendertje te kopen die de camera’s kon triggeren. In de winkel konden ze mij niet vertellen hoeveel camera’s ik ermee zou kunnen triggeren.
Shoot / Opstelling Object Camera’s Type’s
Lens
Erik Slaats, Martijn Ruissen, Samantha Schoonen 4 Nikon D600 Nikon D5100 Nikon D5000 Nikon D5000 Nikkor 50mm F5 Nikkor 50mm F5 Nikkor 50mm F5 Nikkor 70-200mm F5
Voor de laatste shoot moest alles perfect gaan. Alle gebruikte camara’s waren Nikons. De gebruikte lenzen hadden een effectieve lengte van 85mm. De D600 met een 70-200 op 85mm en de recht vanwege de cropfactor op 50mm wat resulteerd in een effectieve 75mm. Het triggeren werkte grotendeels goed, wat bleek was dat de IR remote een redelijk geconcentreerde burst signalen stuurde. Hierdoor moest je goed richten om alle 4 de camera’s tegelijk te triggeren. Zoals ik vroeger een stoel gebruikte heb ik er nu voor gekozen om de testpersoon te laten staan en zelf om zijn eigen as te draaien. Dit zorgt ervoor dat de situatie een stuk controleerbaarder was. De testpersonen werden geïnstrueerd om met 20graden tegelijk te draaien wat resulteerde in 13 foto’s met volledige cirkel. Persoonlijk had ik liever iets in de richting van de 30 foto’s gehad, maarja je kan niet alles hebben.
Verwerking
In de verwerking van de laatste set is de meeste tijd van het hele project gaan zitten. Ik heb uren besteed met het zorgvuldig uitkiezen van de juiste foto’s en duplicates eruit te halen wat uiteindelijk resulteerde in 3 sets van +/- 78 foto’s. Na het doorlopen van de 3 stappen met alle 3 de sets was al snel te zien dat de set van Erik Slaats de meeste potentie had. Dit komt door het grote contrast met de achtergrond en het feit dat Erik weinig haar heeft. Haar is iets wat bijna niet te doen is via photogrammetry. De 1ste poging resulteerde in een accurate mesh van 500.000 polygonen. Ik wou zien hoe ver ik deze set kon optrekken en heb uiteindelijk een 0 render gemaakt (Ik geef geen polygonenlimiet op wat ervoor zorgt dat hij het maximale uit de foto data trekt). Dit resulteerde in een set van 2.200.000.000polygonen met een rendertijd van 72uur. Gelukkig had de software de mogelijkheid om de mesh te “decimaten” naar een gezonde 1.000.000 polygonen. Dit is de mesh geweest waarmee ik mijn prototype ben gaan uitbouwen.
Nu was het tijd om de texture te creëren. Ik heb behoorlijk wat tijd gestoken in op een trial and error manier uitzoeken wat de beste resultaten gaf. Wat bleek is de camera te pakken met de hoogste resolutie en alleen vanuit deze camera een texture te creëren . Dit geeft een consistent en hoogwaardig resultaat. Daarna heb ik in Mudbox geprobeerd om de textures te verbeteren maar er was niet genoeg non distorted data in de foto’s. Doordat de lenzen en het perspectief voor teveel vervorming van Erik zorgden moest ik roeien met de riemen die ik had. Ik heb de texture in Photoshop zitten oppoetsen tot ik blij was met het resultaat. De problemen die ik had met de texture was dat minimale hoeveelheden van de achtergrond toch waren gelekt naar de texture map. Ik heb dit enigszins op kunnen lossen in photoshop.
Eindresultaat
Bevindingen
Na een behoorlijke tijd rond deze techniek te hebben doorgebracht denk ik dat het goed mogelijk is om een professioneel resultaat te boeken. Helaas ben ik op dit moment nog niet zo ver met mijn research. Ik ben een heel eind gekomen en heb een naar mijn mening goed prototype afgeleverd van een waardig product. Mijn persoonlijk advies op dit moment zou zijn om deze techniek in te zetten om reference objecten te creëren waar je aan de hand daarvan clean geometry kan sculpten in Zbrush of Mudbox.
Aanbevelingen
Als laatst wil ik een opsomming maken van de punten die belangrijk zijn bij een goed resultaat Kwaliteit van de foto’s is belangrijker als de kwantiteit. 20 goede foto’s overtreffen 60 slecht geschoten foto’s in het eindresultaat. Zorg dat je foto’s een goed contrast hebben zodat het programma weet waar hij op moet alignen. Een kleine afstand tussen de foto’s zorgt voor een goed resultaat. Uit ervaring vind ik 10 graden per foto een goede spacing. Door het object te laten draaien rond zijn as heb je maar 1 set camera’s nodig in plaats van 30 sets rondom. Een zwarte achtergrond geeft de minste problemen bij het losmaken van je subject van de
achtergrond. Ook zorgt het zwart ervoor dat er niet veel achtergrond kleur in de uiteindelijke texture lekt. Zorg dat de camera’s in de verticale setup op exact hetzelfde punt staan scherp gesteld en dat de camera’s samenkomen op de image plane. In de verticale setup is het belangrijk dat de verschil in graden gelijk is en de afstand van camera gelijk. Zorg dat alle camera’s dezelfde whitebalance hebben anders krijgt men problemen met het builden van de textures. Elke camera moet een lens hebben met gelijke lengte. Preferabel dezelfde lens. Ik raad een 85mm aan op een 35mm sensor vanwege de kwaliteit van 85mm lenzen op het gebied van lensvervorming. Zorg dat het diafragma waar op geschoten word relatief groot is zodat het focusveld wat ruimte heeft voor het object om te bewegen zonder onscherp te raken. Het gebruiken van camera’s met dezelfde resolutie blijkt geen effect te hebben om het uiteindelijke resultaat. Zorg dat er naderhand een T-pose shot van voren / zijkant en achteren word genomen om eventueel textures te repareren in Mudbox of Photoshop. Het triggeren van alle camera’s op hetzelfde moment is essentieel. Mijn tip is om een goedkope IR remote te gebruiken. Als bepaalde camera’s niet goed aligned zijn is het handig om die camera’s te disablen of zelf te positioneren. De lichtopstelling die gebruikt word moet zoveel mogelijk schaduwbeeld elimineren om uiteindelijk een texture map te krijgen die gebruikt kan worden in elk mogelijk scenario zonder dat de texture zijn eigen schaduwen heeft.