Krijg je hoofd in het spel met Intel RealSense

Sinds 1999 werk ik via mijn bedrijf, The Game Creators, om het voor iedereen gemakkelijker te maken om games te maken. Vorig jaar ben ik begonnen met de ontwikkeling met de Intel RealSense SDK en camera, waarmee je 3D-beelden in realtime kunt vastleggen. (Ik won de RealSense App Challenge van Intel met mijn Virtual 3D Video Maker!) Het zou geen verrassing moeten zijn dat ik heb bekeken hoe RealSense kan worden gebruikt voor de ontwikkeling van spellen, en in deze tutorial zal ik een voorbeeld delen: hoe om het hoofd van je (of je speler) in je spel te scannen. 

Waarom RealSense gebruiken?

Veel 3D-gametekens bevatten een 2D-structuurafbeelding die wordt gebruikt als een "skin" voor het 3D-model, zoals bij Kila hieronder:

Links: Kila's textuur. Rechts: de 2D-textuur toegepast op het 3D-model. Van Game Character Creation Series: Kila.

Je ziet een ander gezicht in de textuur. Als u het gezicht van het personage wilt aanpassen aan het uwe, is het verleidelijk om een ​​platte 2D-foto op de textuur te plakken. Dit heeft echter niet de neiging om geweldige resultaten te geven, zoals hieronder aangetoond:

Het resultaat van het plakken van een platte foto van een gezicht op de textuur van een bestaand 3D-model.

Dat is behoorlijk gruwelijk. Het probleem is dat de textuur van het gezicht niet op de onderliggende "botstructuur" van het model wordt geplaatst.

RealSense-apparaten bevatten een infraroodprojector en een camera, zodat ze een 3D-projectiekaart en een 2D-foto kunnen maken van alles waarnaar ze worden gewezen. Dit betekent dat u de 2D-structuur kunt aanpassen en het 3D-model van een personage dat bij het nieuwe gezicht past.

In-game Character Creator Workflow

Laten we veronderstellen dat we onze spelers een paar selfies met een RealSense-camera willen laten nemen en ze dan gebruiken om een ​​3D-avatar voor hen te maken.

In plaats van te proberen in hun hele lichaam te scannen - en vervolgens een 3D-model, textuur en reeks animaties daaruit te maken - zouden we beter een 3D full-body model kunnen kopen van een site zoals 3DOcean ...

... dan het hoofd afsnijden:

Dit maakt het veel gemakkelijker om het spel te ontwikkelen en te testen; het enige dat zal variëren tussen speleravatars is het hoofd.

De gelijkenis van de speler vastleggen

Om de gelijkenis van de speler vast te leggen, moet de maker van het spel verschillende scans van zijn hoofd maken, allemaal nauwkeurig gecontroleerd zodat de software alles opnieuw kan samenvoegen. (De Intel RealSense SDK heeft een voorbeeld verstrekt dat precies dat doet; het kan onmiddellijk worden uitgevoerd vanuit de voorgecompileerde map binaries.)

Natuurlijk wilt u uw eigen 3D-scanner creëren die bij uw project past, dus wat volgt is slechts een uitsplitsing van hoe de techniek voor u zou kunnen werken.

Methode 1

U kunt de mesh-opnamen afzonderlijk nemen en vervolgens proberen ze handmatig aan te sluiten in een make-shift-tekengereedschap of in een klein programma. Het probleem met live 3D-scannen is echter dat er een mens aan de andere kant van het beeld zit, wat betekent dat ze friemelen, op hun stoel gaan zitten, achterover leunen en op subtiele manieren verdergaan - en dat is niet de subtiele toonhoogte, gieren en rollen van het hoofd zelf. Gezien deze neiging van het hoofd om positie en afstand van de camera tijdens de scansessie te veranderen, zal dit alleen maar tot frustratie leiden bij het opnieuw in elkaar zetten van de opnames..

Methode 2

Als uw scans nauwkeurig zijn, kunt u de mazen versmallen met het eerste net dat u hebt gescand en aanpassingen aanbrengen als er een hoekpunt bestaat in de gegevens van het wereldruimtemodel of een nieuw vertexpunt voor de wereldruimte maken als er nog geen eerder bestond. Dit zorgt ervoor dat je hoofdgaas verfijnder wordt met de meer samples die de speler biedt. Het nadeel van deze techniek is dat als je ervoor zorgt dat het hoofd van je speler tijdens het scannen in een centrale positie blijft en dat 3D-gegevens worden omgezet in wereldcoördinaten, dit een aantal uitdagingen oplevert.

Methode 3

De perfecte techniek is om markeringen in de gescande mesh te detecteren om een ​​'vertex-fix' te krijgen. Zie dit als het in kaart brengen van uw positie op de oceaan door naar de sterren te kijken; door sterrenbeelden te gebruiken, kunt u zowel uw relatieve oriëntatie als uw positie bepalen. Dit is met name handig wanneer u een tweede net maakt: u kunt hetzelfde markeringsdetectiealgoritme toepassen, hetzelfde patroon vinden en de relatieve oriëntatie, positie en schaalverschuiving van het eerste net teruggeven. Zodra u deze verschuiving hebt, voegt u de tweede maas toe aan de eerste is een eenvoudige wereldtransformatieberekening en voegt u vervolgens de extra vertex-gegevens toe aan de oorspronkelijke maas. Dit proces wordt herhaald totdat er geen mazen meer zijn die u wilt indienen en vervolgens gaat u verder met de laatste stap.

Sleutelpunten

  • Ik zou het niet aanbevelen om de technieken hier te implementeren totdat je een goed praktisch begrip hebt van 3D-geometriecodering, omdat het manipuleren van variabel georiënteerde vertex-gegevens lastig kan zijn.
  • Als de techniek die u koos, bestond uit het in lagen plaatsen van vertex-gegevens op een enkel object, hebt u waarschijnlijk veel overtollige en overlappende hoekpunten. Deze moeten worden verwijderd en een nieuwe driehoekslijst wordt gemaakt om het object af te dichten.
  • Het opslaan van de kleurgegevens van uw gezichtsscan in de diffuse component van de hoekpuntgegevens is een handige manier om de noodzaak van een textuur te voorkomen en biedt andere voordelen als het gaat om het optimaliseren van het uiteindelijke gaas.
  • Vergeet niet om de onbewerkte dieptegegevens te verwerken om interferentie te verwijderen, zoals zwerfdieptewaarden die niet consistent zijn met de omliggende dieptepixeldata. Misluk hier niet mee en al je werk om een ​​goed 3D hoofdnet te maken zal tevergeefs zijn.

Dit is beslist het harde deel, maar het is niet onmogelijk; onthoud, er is een werkende demo in de SDK-bestanden die u kunt gebruiken als basis om dit in de engine van uw game te laten draaien.

De gelijkenis in het spel gebruiken

Laten we aannemen dat je een fatsoenlijk 3D-model (en de bijbehorende textuur) van het gezicht van de speler hebt:

Een futuristische mugshot.

We kunnen dit nu op het lichaamsmodel van het personage plakken:

Toegegeven, het resultaat is nog steeds vrij gruwelijk, maar we zijn nog niet klaar. We kunnen een oplossing kiezen op een van de vele pagina's van de bijbel van de spelontwikkelaar, die we onszelf kunnen overtuigen is een vrij leuke functie in tegenstelling tot een nogal sinistere hack.

Alles wat we doen is de gaten verbergen met een pruik en een hoed:

OK, toegegeven, we kunnen gewoon het 3D-vlak op de voorkant van een al gemodelleerde 3D-kop plakken, maar dit is leuker. Als Team Fortress 2 iets te bieden heeft, zullen spelers het leuk vinden om het hoofd en gezicht van hun avatar aan te passen met verschillende accessoires; we doden twee vogels met één steen!

Als je echt wilt vermijden hoeden en pruiken aan het spelpersonage toe te voegen, moet je de speler laten binden of het haar teruggeleren voordat je de scans maakt. Hoe platter hun haar is, hoe beter de scan zal zijn. Los haar interfereert met de dieptecamera en produceert reflecties van verstrooiing die niet goed scannen.

Het is gemakkelijker om dit in Dev Time te doen

Hoewel het mogelijk is om een ​​speler in de game in de game te krijgen, is het een moeilijke start. Als je dit nog niet eerder geprobeerd hebt, raad ik je aan om eerst iets technisch eenvoudiger te proberen: je eigen beeltenis (of die van een acteur) in het spel krijgen.

Dit is gemakkelijker om drie redenen:

  1. Er is veel meer ruimte voor fouten en ruimte voor correctie; als je het hele proces zelf bestuurt, pas dan handmatig alle kleuren of meshes aan die niet goed uitkomen, en pas het eindresultaat aan totdat het precies goed is. U bent niet afhankelijk van uw code die perfect werkt, de eerste keer, voor elk gezicht.
  2. U kunt bestaande software (zoals Blender) gebruiken in plaats van dat u het hele proces in de gebruikersinterface en -code van uw spel moet opnemen.
  3. Omdat het jouw spel is, heb je waarschijnlijk meer geduld dan je spelers, dus je kunt meer foto's nemen en langer wachten op resultaten dan dat het redelijk is om een ​​speler te vragen.

En op basis van dit laatste punt, kunt u de tijd nemen om een ​​scan van uw hele hoofd te maken, niet alleen uw gezicht. Sterker nog, we hebben dit al in een eerdere tutorial gedaan. Laten we verder gaan waar dat gebleven was en doorlopen om dit model in Unity 5 te krijgen.

Je hoofd in eenheid brengen

Nadat u de vorige zelfstudie hebt gevolgd, moet u een FBX-model van uw hoofd en een bijbehorende UV-structuurkaart hebben.

Open Unity en maak vervolgens een nieuw project en een nieuwe scène.

Klik Activa> nieuw item importeren. Selecteer het FBX-model dat u uit Blender hebt geëxporteerd.

Wanneer Unity het object importeert, is het mogelijk (en zelfs waarschijnlijk) dat het de textuur ervan niet zal importeren. In dat geval ziet u een grijs-witte versie van uw mesh:

Dat is OK - we voegen de structuurkaart vervolgens toe.

Selecteer de materialen map, klik met de rechtermuisknop en selecteer Asset importeren. Selecteer het PNG-bestand dat u in Blender hebt opgeslagen en importeer het vervolgens.

Je ziet nu de textuurkaart naast een grijs-wit materiaal met dezelfde naam als je mesh. Klik met de rechtermuisknop op het grijs-witte materiaal (in de vorm van een bal) en verwijder het.

Ga terug naar jouw Middelen map en klik met de rechtermuisknop op de mesh die u hebt geïmporteerd. kiezen wederinvoer

Nadat het opnieuw geïmporteerd is, zal het het materiaal op de juiste manier maken en uw mesh structuur geven:

Als het model in het objectvoorbeeld roze uitziet, selecteert u eenvoudig een ander object (zoals de camera) en selecteert u vervolgens opnieuw uw mesh om het te laten vernieuwen.

Nu ben je klaar om je hoofd in het spel te krijgen. Sleep uw object naar de scène. (Je kunt het groter maken en rotzooien met het perspectief van de camera om het in beeld te krijgen.)

Wanneer je slaat Spelen, je zou je object correct weergegeven moeten zien:

Als u de textuur wilt aanpassen om het meer of minder glanzend of metaalachtig te maken, gaat u eerst naar de materialen map en selecteer de ronde versie van uw textuur. In de Inspecteur paneel, kunt u de Metalen en Gladheid schuifregelaars om de juiste look te krijgen:

Conclusie

Het lijkt misschien een buitensporige hoeveelheid werk om de voorkant van een hoofd in een virtuele scène te krijgen, maar de technieken die je in dit artikel hebt geleerd, kunnen worden toegepast op scannen en naaien wat je maar wilt. 

De mogelijkheid om je essentie in de computer te scannen en je reis voort te zetten in een virtueel landschap begint hier met het scannen van een enkel gezicht. Hoe zullen games en attitudes veranderen als de protagonisten in de game lijken op echte mensen die je in je eigen leven tegenkomt? Wanneer je iemand een gezicht geeft, worden ze echt, en het zal interessant zijn om te zien hoe games en spelers daardoor veranderen.

Het Intel® Software Innovator-programma ondersteunt innovatieve onafhankelijke ontwikkelaars die in staat zijn om toekomstgerichte projecten te creëren en te demonstreren. Vernieuwers profiteren van sprekerschap en demomogelijkheden tijdens evenementen en bijeenkomsten voor ontwikkelaars.

Intel® Developer Zone biedt tools en how-to-informatie voor platformonafhankelijke app-ontwikkeling, platform- en technologie-informatie, codevoorbeelden en peer-expertise om ontwikkelaars te helpen innoveren en slagen. Word lid van onze community voor de internet van dingen, Android *, Intel® RealSense ™ -technologie, Moderne code, Game ontwikkelaar en Ramen* om gereedschappen te downloaden, toegang te krijgen tot ontwikkelkits, ideeën uit te wisselen met gelijkgestemde ontwikkelaars en deel te nemen aan hackathons, wedstrijden, roadshows en lokale evenementen.