Virtual Reality Games en het maken van je lichaam een Controller! (Eenheid visuele Studio + Kinect + Oculus) (9 / 11 stap)

Stap 9: Hand-besturingselementen met de Kinect


Het volgende script we maken zullen wij gebruiken in ons spel samen met het lichaam manager script. Het detecteert de staat van de hand en leiden tot de rotatie voor ons spel.

Hand Manager Script

Maak nu een ander script in dezelfde map als het lichaam manager script en lichaam view manager script. Noem het HandManager. Dit script zal veel lijken op ons lichaam-View-controller.

Voeg de volgende van BodyView aan ons HandManager-Script.

met behulp van UnityEngine;

met behulp van System.Collections;

met behulp van System.Collections.Generic;

met behulp van Kinect = Windows.Kinect;

openbare klasse HandManager: MonoBehaviour

{

openbare GameObject BodyManager;

privé PlatformRotate platformRotate;

privé OVRInfinitePlayerController ovrPlayerScript;

privé InfinitePlayerController playerScript;

privé woordenboek _Bodies = new Dictionary ();

privé BodyManager _BodyManager;

privé float flipTimer;

privé float flipDelay = 2;

int prevState = 0;

privé woordenboek _BoneMap = nieuwe Dictionary()

{

{Kinect.JointType.FootLeft}, Kinect.JointType.AnkleLeft,

{Kinect.JointType.AnkleLeft}, Kinect.JointType.KneeLeft,

{Kinect.JointType.KneeLeft}, Kinect.JointType.HipLeft,

{Kinect.JointType.HipLeft}, Kinect.JointType.SpineBase,

{Kinect.JointType.FootRight}, Kinect.JointType.AnkleRight,

{Kinect.JointType.AnkleRight}, Kinect.JointType.KneeRight,

{Kinect.JointType.KneeRight}, Kinect.JointType.HipRight,

{Kinect.JointType.HipRight}, Kinect.JointType.SpineBase,

{Kinect.JointType.HandTipLeft, Kinect.JointType.HandLeft}, //Need dit voor HandSates

{Kinect.JointType.ThumbLeft}, Kinect.JointType.HandLeft,

{Kinect.JointType.HandLeft}, Kinect.JointType.WristLeft,

{Kinect.JointType.WristLeft}, Kinect.JointType.ElbowLeft,

{Kinect.JointType.ElbowLeft}, Kinect.JointType.ShoulderLeft,

{Kinect.JointType.ShoulderLeft}, Kinect.JointType.SpineShoulder,

{Kinect.JointType.HandTipRight, Kinect.JointType.HandRight}, //Needthis voor Hand staat

{Kinect.JointType.ThumbRight}, Kinect.JointType.HandRight,

{Kinect.JointType.HandRight}, Kinect.JointType.WristRight,

{Kinect.JointType.WristRight}, Kinect.JointType.ElbowRight,

{Kinect.JointType.ElbowRight}, Kinect.JointType.ShoulderRight,

{Kinect.JointType.ShoulderRight}, Kinect.JointType.SpineShoulder,

{Kinect.JointType.SpineBase}, Kinect.JointType.SpineMid,

{Kinect.JointType.SpineMid}, Kinect.JointType.SpineShoulder,

{Kinect.JointType.SpineShoulder}, Kinect.JointType.Neck,

{Kinect.JointType.Neck}, Kinect.JointType.Head,

};

Nu we een variabele die niet in onze bodyview-script dat is de prevState-variabele toegevoegd.

int prevState = 0;

We hebben deze variabele om te voorkomen dat constant draaien. In de reguliere input controles van het spel dat we doen stijgt dit door enige rotatie activeren wanneer de toets die werd ingedrukt. Met de Kinect is het goed om een staat van de rest die moet worden bereikt als we willen draaien of spiegelen opnieuw. In ons geval is de rest staat elke hand die niet een rotatie signaleert; beide handen zijn wanneer bijvoorbeeld in vuisten.

Nu moeten we in de Update-methode het volgende aan toevoegen:

 void Update(){ int state = 0; if (BodyManager == null) { return; } _BodyManager = BodyManager.GetComponent(); if (_BodyManager == null) { return; } Kinect.Body[] data = _BodyManager.GetData(); if (data == null) { return; } List<ulong> trackedIds = new List<ulong>(); foreach (var body in data) { if (body == null) { continue; } if (body.IsTracked) { trackedIds.Add(body.TrackingId); } } List<ulong> knownIds = new List<ulong>(_Bodies.Keys); // First delete untracked bodies foreach (ulong trackingId in knownIds) { if (!trackedIds.Contains(trackingId)) { Destroy(_Bodies[trackingId]); _Bodies.Remove(trackingId); } }} 

Alle van de bovenstaande code is hetzelfde als Body weergave, die u kan helpen omdat we weten al hoe het werkt.

Het enige ding dat verschillend is is:

 int state = 0; 

Deze variabele zal houden van de stand van de hand, en aan het einde van de Update-methode, wij zal bewaart het in de vorige staat variabele.

Het volgende deel van de update-methode die anders is in de foreach lus.

VOID Update()

{

int status = 0;

Als (BodyManager == null)

{

terugkeer;

}

_BodyManager = BodyManager.GetComponent ();

Als (_BodyManager == null)

{

terugkeer;

}

Kinect.Body [] gegevens = _BodyManager.GetData();

Als (gegevens == null)

{

terugkeer;

}

Lijst van trackedIds = nieuwe lijst ();

foreach (var lichaam in gegevens)

{

Als (lichaam == null)

{

blijven;

}

Als (lichaam. IsTracked)

{

trackedIds.Add (body. TrackingId);

}

}

Lijst van knownIds = nieuwe lijst (_Bodies.Keys);

Eerst verwijderen ongevolgde organen

foreach (ulong trackingId in knownIds)

{

Als (! trackedIds.Contains(trackingId))

{

Destroy(_Bodies[trackingId]);

_Bodies.Remove(trackingId);

}

}

 foreach (var body in data){ if (body == null) { continue; } if (body.IsTracked) { //Check Hand State if body is being Tracked state = CheckLeftHandState(body.HandLeftState) + (2*CheckRightHandState(body.HandRightState)); }} 

}

We moeten de methoden CheckLeftHandState en CheckRIghtHandState te schrijven. Deze methoden nemen de Kinect.HandState-parameter die op een aftelbaar gesloten, Open of Lasso neerkomt. Beide geeft een int die we zullen gelijk is aan de variabele van de staat op het spel vertellen welk commando die wij willen uitvoeren.

 private int CheckRightHandState(Kinect.HandState handState2){ int result = 0; switch (handState2) { //Normal case Kinect.HandState.Closed: result = 0; break; //Stop case Kinect.HandState.Open: result = 0; break; //Flip case Kinect.HandState.Lasso: result = 1; break; default: result = 0; break; } return result; } 
 private int CheckLeftHandState(Kinect.HandState handState1){ int result = 0; switch (handState1) { //Normal case Kinect.HandState.Closed: result = 0; break; //Flip case Kinect.HandState.Open: result = 3; break; //Left case Kinect.HandState.Lasso: result = 1; break; default: result = 0; break; } return result; } 

Oorspronkelijk is het spel omgedraaid als beide handen waren in de lasso staat, maar dat is moeilijker te controleren, omdat voor een frame enerzijds misschien iets sneller dan de andere worden erkend, en dus het spel wordt ervan uitgegaan dat we draaien in plaats van spiegelen.

Dus nu het spel: draait rechts als alleen de rechterhand in lasso staat is; draait links als de linkerhand zich in lasso toestand; en flips als de linkerhand geopend is.

Met zowel de CheckLeftHandState als de CheckRightHandState methodes gedaan we kunnen terugkeren naar de methode Update en het afmaken. Momenteel willen we enkel zien als de Kinect onze hand-Staten goed registreert. Hiervoor maken we een instructie switch die gebruikmaakt van de huidige toestand en die vervolgens controleert wat was de vorige toestand, continue rotatie te voorkomen. Als de vorige toestand was de rustgevende vermelden we draaien, of in dit geval afdrukken naar het Debug scherm.

 if (body.IsTracked){//Check Hand State if body is being Tracked state = CheckLeftHandState(body.HandLeftState) + (2*CheckRightHandState(body.HandRightState)); switch (state) { case 0: break; case 1: //Left if (prevState == 0) Debug.Log("Left"); break; case 2: //Right if (prevState == 0) Debug.Log("Right"); break; case 3: //Both if (prevState == 0) { Debug.Log("Both"); } break; default: break; } prevState = state;}}} 

Oke dus laten we zien of dit werkt. Maak een andere lege doel van het spel in je scène en noemen het HandManager. Het handmanager script aan het koppelen. Vergeet niet om de BodyManager van de hiërarchie naar een tijdelijke aanduiding voor de BodyManger in de HandManager Inspector slepen.

AFBEELDING 1

Voer de code in eenheid.

AFBEELDING 2

Oke, maar we zien nog steeds het skelet. Nou, als we de bodyView deactiveren door het vakje van de linkerhand in het itemvenster kunnen we het project opnieuw uitvoeren.

AFBEELDING 3

BAM! Daar is het, en u weet dat het is nog steeds werken op basis van de Debugger, zelfs als u niet kunt het skelet niet meer zien!

Oke nu om toe te voegen dat in het spel. Eerste laten we de prefabs uit de HandManager en BodyManager objecten.

AFBEELDING 4

Als u eenmaal hebt gemaakt ze slepen de lichaam Manager uit de hiërarchie van de Prefab lichaam Manager die u hebt gemaakt. Doe hetzelfde met de Manager van de Hand. Nu als prefabs kan gemakkelijk gaan we die objecten en functionaliteit in onze belangrijkste spel scène!

Gerelateerde Artikelen

Het maken van Graphics voor een Scratch Racing Game

Het maken van Graphics voor een Scratch Racing Game

deze tutorial zal u tonen hoe te maken van een racespel binnenkant van kras.Stap 1: Voordat u begint moet u... PowerPoint: aankoop voor Mac of PC.Kras: Vrij op http://www.scratch.mit.eduStap 2: Het maken van de achtergronden. 1) gebruik het gereedsch
De wetenschap van het maken van zeep in een Lab

De wetenschap van het maken van zeep in een Lab

Maken van zeep lijkt er niet iets wat je in een laboratorium doen zou, maar het is eigenlijk meer wetenschappelijk dan je zou denken. Verzeping is de zeep besluitvormingsproces, die gebruik maakt van de basisoplossing loog en de verschillende soorten
Het maken van 'One handschoen' - een 3D-gedrukte, draagbare mobiele telefoon.

Het maken van 'One handschoen' - een 3D-gedrukte, draagbare mobiele telefoon.

Hello!  Ik ben Bryan Cera, en ik ben dol op het maken van Ongein uit elektronica! Het is mijn passie. Voor dit instructable, ik wil u door mijn proces van het creëren van Een handschoen, een functionele mobiele telefoon die je op uw hand dragen nemen
Het maken van yoghurt in een Sous-Vide

Het maken van yoghurt in een Sous-Vide

A Sous Vide is een temperatuurgestuurde waterbad. Het handhaaft een zeer consistente temperatuur en is een ideaal toestel om te broeden yoghurt.Ik gebruikte een goedkope combinatie van een standaard crock pot en een controller Dorkfood Sous Vide.Met
Een eenvoudig protocol voor het maken van ijzer (II, III) oxide (magnesiet)

Een eenvoudig protocol voor het maken van ijzer (II, III) oxide (magnesiet)

Hallo.In mijn eerste Instructable, 'm I gonna beschrijven de synthese van ijzer (II, III) oxide (magnesiet).Ijzer (II, III) oxide is een verbinding die Ferrimagnetisme vertoont. Het heeft vele toepassingen en veel van hen zijn beschreven op het Inter
Het maken van een Pen is gemakkelijk en leuk (update)

Het maken van een Pen is gemakkelijk en leuk (update)

Ik heb het maken van pennen voor een weinig meer dan een jaar nu en zijn geweldig leuk om te maken.Kunt u ze als één stick pennen, maar voor het grootste deel u een onderdelen-kit die komen in verschillende niveaus van stijlen en moeite zou kopen.De
(Pier 9 AiR) Hoe vrienden te maken en dingen (een Instructable in twee delen) van de huid (deel 1: het maken van vrienden)

(Pier 9 AiR) Hoe vrienden te maken en dingen (een Instructable in twee delen) van de huid (deel 1: het maken van vrienden)

(als je net als zijn, ongeacht dit, ik hoef geen vrienden, breng me naar de dode dingen, hoofd aan instructable 2.)Dit instructable is geschikt voor zowel beginners als geavanceerde vrienden. Ik moet zeggen dat ik een ervaren vriend ben: Ik heb vrien
Het maken van een Cat(?) Masker met glasvezel

Het maken van een Cat(?) Masker met glasvezel

ik ben niet nieuw voor Instructables, maar ik figuur it's about time ik een account te krijgen en terug te geven aan een website die mij zo veel inspiratie en informatie heeft gegeven. Dit is mijn eerste post, zodat alle opmerkingen en kritiek welkom
Het maken van Biodiesel!

Het maken van Biodiesel!

Instructable #2 in mijn serie over biodiesel.Dit is mijn tutorial voor het gebruik van mijn appleseed processor voor het maken van biodiesel. Dit leerprogramma zal u door het proces van het maken van biodiesel, maar niet de nodige wasproces krijgen.
Verlichting sigaretten en het maken van vuur met zonlicht

Verlichting sigaretten en het maken van vuur met zonlicht

door tonytran2015 (Melbourne, Australië).Figuur 1: Verlichting een sigaret door zonlicht. Smeulende is zichtbaar na 27seconds. Figuur 2: Diagram van het experiment.De titel "Verlichting sigaretten met het gezicht van een Storm merk horloge" kon
Het maken van uw jonge geitjes eruit zien alsof ze het raster vandaan.

Het maken van uw jonge geitjes eruit zien alsof ze het raster vandaan.

Tijdens de volgende reeks stappen, ik ga u laten zien hoe uw kinderen eruit zien alsof ze vandaan Tron opstand.Stap 1: Geeft uw kinderen de Tron-behandeling. Stap 1, kinderen hebben. Als ik nodig om u te vertellen hoe dat te doen, dan hebt u wellicht
Het maken van een basis 3D-Engine in Java

Het maken van een basis 3D-Engine in Java

Een spel plaatsvinden in een 3D omgeving sterk verbetert de onderdompeling, maar daadwerkelijk een volledige 3D-engine kunnen zeer complex zijn. Gelukkig zijn er enkele trucs die kunnen worden gebruikt om het 3D-effect op een relatief eenvoudige mani
Gids voor het maken van een computer van de begroting.

Gids voor het maken van een computer van de begroting.

Welkom!Als u op dit Instructable geklikt dan bent u waarschijnlijk net als ik. U wilt een enigszins lage eindcomputer te spelen van eenvoudige games zoals Minecraft en Toribash op, maar u niet wilt uitgeven van 700 euro op een nieuwe.Begroting comput
Het maken van een juiste Zwitserse leger mes met Popsicle stokken (normale grootte.)

Het maken van een juiste Zwitserse leger mes met Popsicle stokken (normale grootte.)

Dit is v1.0 heeft 1 blade. Dit is een eenvoudige stap voor stap handleiding en dit is gemaakt van zeer goedkope materialen. Bewerk het en afbeeldingen uploaden. U kunt zelfs de badge die in afbeelding 6. Dat is de beste badge maar het donkere kleur.