Virtual Reality-spel och gör din kropp en Controller! (Unity + Visual Studio + Kinect + Oculus) (7 / 11 steg)

Steg 7: Kinect Scripting



Skapa en ny mapp inuti mappen skript som heter KinectScripts. Nu i mappen skapa två nya skript. en som kallas BodyManger och den andra kallas BodyView.

BILD 1 OVAN

BodyManager

Första vi behöver BodyManager - detta objekt kommer att Mange Kinect sensor anslutningen och läsa i alla organ data kommer från Kinect.

Importera Kinect bibliotek med:

använder Windows.Kinect;

Då vi måste vissa fält för chefen att lagra och data och få sensordata.

privat KinectSensor _Sensor;

privat BodyFrameReader _Reader;

privat organ [] _Data = null;

offentliga organ [] GetData()

{

återvända _Data;

}

Okej så nu vill i metoden Start vi upprätta en anslutning för Kinect.

void Start()

{

_Sensor = KinectSensor.GetDefault();

om (_Sensor! = null)

{

_Reader = _Sensor.BodyFrameSource.OpenReader();

om (! _Sensor.IsOpen)

{

_Sensor.Open();

}

}

}

Nu när anslutningen är öppna och läsa i data behöver vi lagra det i matrisen kropp. Vi kommer att göra detta varje bildruta av spelet, därför måste vi redigera metoden Update().

Vi kontrollera först om _Reader har fastställts och anslutningen har slutförts. Om den har vi kommer att ta den sista bildrutan, läsaren läser i och om det inte är null, vi kan då kontrollera om data är det.

void Update()
{
om (_Reader! = null)
{
var ram = _Reader.AcquireLatestFrame();

om (ram =! = null)
{
IF(_Data == null)
{
Skriv koden här
}
}
}
}

Nu måste vi få kroppen data från Senor. För att göra detta kommer vi att skapa en ny kropp matris med data från Sensor.BodyFrameSource.BodyCount.

I slutet av metoden bör se ut så här:

void Update()

{

om (_Reader! = null)

{

var ram = _Reader.AcquireLatestFrame();

om (frame! = null)

{

om (_Data == null)

{

_Data = ny Body[_Sensor.BodyFrameSource.BodyCount];

}

}

}

}

Behöver vi att uppdatera strömmen av data från läsaren. Genom att lägga till följande kod för att manipulera bildrutan.

void Update()

{

om (_Reader! = null)

{

var ram = _Reader.AcquireLatestFrame();

om (frame! = null)

{

om (_Data == null)

{

_Data = ny Body[_Sensor.BodyFrameSource.BodyCount];

}

ram. GetAndRefreshBodyData(_Data);

ram. Dispose();

ram = null;

}

}

}

Den sista metoden i klassen kroppen Manager är OnApplicationQuit(), som gör sig läsaren, och stänger den Sensor strömmen, ställer det till null.

void OnApplicationQuit()

{

om (_Reader! = null)

{

_Reader.Dispose();

_Reader = null;

}

om (_Sensor! = null)

{

om (_Sensor.IsOpen)

{

_Sensor.Close();

}

_Sensor = null;

}

}

Kropp Visa

Nästa skriptet att skriva är en Rita benstommen. Vi kommer inte nödvändigtvis behöver se skelettet för spelet, men jag ska visa dig hur du visar skelett kroppsspårning. Vi behöver också skelett data att spåra händerna, vars stat kommer att diktera controller-befäl.

För denna MonoBehavoir klass behöver vi, ett material att dra benet i Unity scenen. En gameobject att lagra BodyManger, för att styra strömmen av Kinect.

offentligt Material finfördelas;
offentliga GameObject BodyManager;

Vi behöver också ett BodyManager-objekt och en ordlista att lagra organ spåras.

privat ordlista _Bodies = ny Dictionary();
privat BodyManager _BodyManager;

Sedan behöver vi kartlägga alla ben av två lederna som de kommer att anslutas till.

privat ordlista _BoneMap = ny 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 detta för 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 för Hand
{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},
};

BodyView Update()

Nu i enighet Update() metoden måste vi kontrollera om kroppen Manager inte är null och att den har data.

void Update()
{
int state = 0;
om (BodyManager == null)
{
hemkomst.
}
_BodyManager = BodyManager.GetComponent();
om (_BodyManager == null)
{
returnera
}
Kinect.Body [] data = _BodyManager.GetData();
om (data == null) {
hemkomst.
}
}

Nästa, men fortfarande i metoden Update(), vi måste få mängden organ i förteckningen över organ som spårade. Ta sedan bort okänd organ.

Lista trackedIds = ny lista ();

foreach (var kroppen i data)

{

om (kroppen == null)

{

fortsätta;

}

om (kropp. IsTracked)

{

trackedIds.Add (organ. TrackingId);

}

}

Lista knownIds = ny lista (_Bodies.Keys);

Först ta bort ospårad organ

foreach (ulong trackingId i knownIds)

{

om (! trackedIds.Contains(trackingId))

{

Destroy(_Bodies[trackingId]);

_Bodies.Remove(trackingId);

}

}

Nu när vi har nycklarna för att spåra organ måste vi skapa en body-objekt med det tracking ID-nyckel. Vi behöver skriva två fler metoder. En CreateBodyObject() metod som kommer att ta en ulong id och en RefreashBodyObject() metod som kommer att ta ett Kinect.Body-objekt och en GameObject för kroppen. Vi kommer att använda dessa metoder när vi går igenom data, och hitta om organ inuti spåras eller inte. Om det spåras men inte har en TrackingId, måste vi skapa en kropp med det TrackingID. Om det spåras och har en TrackingId då behöver vi bara uppdatera dras kroppen.

foreach (var kroppen i data)

{

om (kroppen == null)

{

fortsätta;

}

om (kropp. IsTracked)

{

om (! _Bodies.ContainsKey (organ. TrackingId))

{

_Bodies [kropp. TrackingId] = CreateBodyObject (organ. TrackingId);

}

RefreshBodyObject (kropp, _Bodies [kropp. TrackingId]);

}

}

}

CreateBodyObject()

CreateBodyObject tar ett ID och returnerar en kropp gameobject. Så måste vi först skapa en gameobject som kommer att lagra lämpliga uppgifter Hämtad; då behöver vi en for-loop gå igenom varje led Rita kroppen.

privat GameObject CreateBodyObject(ulong id)
{
GameObject kropp = nya GameObject ("kroppen:" + id);
för (Kinect.JointType jt = Kinect.JointType.SpineBase, jt < = Kinect.JointType.ThumbRight, jt ++) {
}
returnera kropp;
}

Varje led i kroppen vi skapa en kub och lägga till en lineRenderer till att cube. Kuben kommer att dras på varje gemensamt medan linje återgivningstillägget kommer att dras för att ansluta lederna.

privat GameObject CreateBodyObject(ulong id) {
GameObject kropp = nya GameObject ("kroppen:" + id);
för (Kinect.JointType jt = Kinect.JointType.SpineBase, jt < = Kinect.JointType.ThumbRight, jt ++) {
GameObject jointObj = GameObject.CreatePrimitive(PrimitiveType.Cube);
LineRenderer lr = jointObj.AddComponent();
LR. SetVertexCount(2);
LR.material = finfördelas;
LR. SetWidth (0.05f, 0.05f);
jointObj.transform.localScale = ny Vector3 (0.3f, 0.3f, 0.3f);
jointObj.name = jt. ToString();
jointObj.transform.parent = body.transform;
}
returnera kropp;
}

RefreashBodyObject()

Nu att skriva den ResfreshBodyObject metoden. I denna metod måste vi gå igenom varje gemensam typ möjligt precis som vi gjorde i metoden CreateBodyObject. Men denna gång vi passerar i det aktuella organet, samt den lämpliga spårningsnummer så vi inte drar benen för fel person.

privata void RefreshBodyObject (Kinect.Body kropp, GameObject bodyObject)

{

för (Kinect.JointType jt = Kinect.JointType.SpineBase, jt < = Kinect.JointType.ThumbRight, jt ++)

{

}

}

Inuti detta for-loop behöver vi få nyckelvärde parar vi gjort innan i ben slingan för alla fogar.

privata void RefreshBodyObject (Kinect.Body kropp, GameObject bodyObject)

{

för (Kinect.JointType jt = Kinect.JointType.SpineBase, jt < = Kinect.JointType.ThumbRight, jt ++)

{

Kinect.Joint sourceJoint = kropp. Lederna [jt];

Kinect.Joint? targetJoint = null;

IF(_BoneMap.ContainsKey(JT))

{

targetJoint = kropp. Lederna [_BoneMap [jt]];

}

}

}

Vi behöver också uppdatera skelett ställning så det är i den exakta platsen på skärmen. För att göra detta måste vi skriva en metod för att få Vetcor3 från sourceJoint.

privata statisk Vector3 GetVector3FromJoint(Kinect.Joint joint)
{
returnera nya Vector3(joint. Position.X * 10, gemensamma. Position.Y * 10, gemensamma. Position.Z * 10);
}

Omfattningen av 10 är att utvidga skelettet, som gör det lättare att arbeta med. Nu har vi möjlighet att korrigera gameObjects ställning.

privata void RefreshBodyObject (Kinect.Body kropp, GameObject bodyObject)
{
för (Kinect.JointType jt = Kinect.JointType.SpineBase, jt < = Kinect.JointType.ThumbRight, jt ++)
{
Kinect.Joint sourceJoint = kropp. Lederna [jt];
Kinect.Joint? targetJoint = null;
IF(_BoneMap.ContainsKey(JT)) {
targetJoint = kropp. Lederna [_BoneMap [jt]];
}
Omvandla jointObj = bodyObject.transform.FindChild (jt. ToString());
jointObj.localPosition = GetVector3FromJoint(sourceJoint);
}
}

Nästa steg den för slinga är att få linerenderer från bodyObject, som var kuben vi skapar för varje gemensamt. Vi måste se om målet gemensamma har ett värde. Om den gör det kan vi då dra en linje från den ursprungliga gemensamt till målet.

LineRenderer lr = jointObj.GetComponent ();

IF(targetJoint.HasValue)

{

LR. SetPosition (0, jointObj.localPosition);

LR. SetPosition (1, GetVector3FromJoint(targetJoint.Value));

}

annat

{

LR.Enabled = false;

}

Stor! Så vi är nästan klar med ritning skelettet. Det finns lite mer information som kommer att vara till hjälp att SDK ger dig, som är att spåra status. Det finns tre lägen att välja mellan, spårade, Inferred eller NotTracked. Vi kan ha linje återgivningstillägget visar oss statligt av spårning genom att ändra sin färg. För att göra detta behöver vi en metod som returnerar en färg baserat på det aktuella läget.

privata statisk färg GetColorForState(Kinect.TrackingState state)
{
Växla (staten) {
fall Kinect.TrackingState.Tracked:
återvända Color.green;
fall Kinect.TrackingState.Inferred:
återvända Color.red;
standard:
återvända Color.black;
}
}

Nu vi lägga till ytterligare en rad till den for-loop av RefreachBodyObject metoden och vi är klar.

privata void RefreshBodyObject (Kinect.Body kropp, GameObject bodyObject)
{
för (Kinect.JointType jt = Kinect.JointType.SpineBase, jt < = Kinect.JointType.ThumbRight, jt ++)
{
Kinect.Joint sourceJoint = kropp. Lederna [jt];
Kinect.Joint? targetJoint = null;
om (_BoneMap.ContainsKey(jt))
{
targetJoint = kropp. Lederna [_BoneMap [jt]];
}
Omvandla jointObj = bodyObject.transform.FindChild (jt. ToString());
jointObj.localPosition = GetVector3FromJoint(sourceJoint);
LineRenderer lr = jointObj.GetComponent();
om (targetJoint.HasValue)
{
LR. SetPosition (0, jointObj.localPosition);
LR. SetPosition (1, GetVector3FromJoint(targetJoint.Value));
LR. SetColors(GetColorForState(sourceJoint.TrackingState), GetColorForState(targetJoint.Value.TrackingState));
}
annat
{
LR.Enabled = false;
}
}
}

Och det är det för att rita skelettet!

Se Steg
Relaterade Ämnen

Hur man lägger in spel och program på din TI-84 med hjälp av MirageOS.

Jag gör detta instructables eftersom när jag fick min Ti-84 Plus, jag letade efter en guide att sätta spel på den. Jag hittade en annan instructables där de använde Ion men det fungerade inte för mig av någon anledning. Så jag tittade runt på interne...

Hur får alla GBC spel (och DOOM) på din iPod med Rockbox!

Någonsin velat spiff upp din iPod? Ville ha svalare funktioner...? Följ detta instructable!Också: Ha tålamod med mig, jag är bara 13 och detta är min första instructable, snälla kommentar om detta hjälpte dig :DSteg 1: Få RockBox Först behöver du någ...

OBJEKTET identifiering och spårning med hjälp av OPENCV, VISUAL STUDIO C ++ 2010 och ARDUINO

IntroduktionI detta projekt skickar Webcam video ramar till Visual Studio C ++ som innehåller öppen CV biblioteket på vår dator.Om Visual Studio C ++ programmet upptäcker bilden av objektet från webbkameran och sedan beräknas de co koordinaterna X, Y...

Ett helt 3D utskrivbara Mixed Reality spel (Pseussudio)

Med tanke på den förestående lanseringen av Projekt Tango 3D scanning smartphone från Google och Lenovo, som sannolikt 3D scanning-kompatibel iPhone 7 Plus från Apple, beslöt jag att skapa en grov proof-of-concept spel att visa ett komplett blandad v...

3D-modellering och skriva ut din egen skugga kub

En initialer skugga kub är en kub där varje vy av kuben (överst, front och sida-vy) är profilen av en annan bokstav. Detta kommer från boken Gödel, Escher, Bach, av Douglas Hofstadter. En skugga kub är en riktigt trevlig grundläggande 3D design utman...

Ersätter och krydda upp din Xbox Controller

har du knappar på din xbox controller som stick och strula till ditt spel? Är du trött på att titta på tråkiga standard svart eller vit handkontrollen? Vill du imponera på dina vänner med en bländande, sexig controller? Om du svarat "ja" på någo...

Göra en låda och armband till din käraste stjärna

Julen är dags och jag gillar att ge bort hemgjorda presenter. I år blir det ett armband i en snidad låda med ett speciellt meddelande.Jag ville spela med ord och stjärnor. På locket till rutan jag ristade: "Du är stjärnan i mitt liv". På ena sid...

Titta på TV-kanaler från hela världen gratis på ditt hem TV och förvandla din TV till en billig hem-PC

Med hjälp av en $50 Android Mini PC (hittas via Amazon eller eBay), ex-pats eller alla som vill berika sina kunskaper i främmande språk titta på utländska TV-stationer på deras hem TV. Android Mini PC ansluter till en HDTV uppsättning, och med tilläg...

Ladda ner flash spel och spela dem offline

denna guide kommer att lära dig hur man spelar online spel offline.Varför skulle du vill göra detta:Offline spelet fungerar med fullscreen.Du kan ha en stor samling.Du kan spela dem offline.* rekommenderas** RekommenderasDu behöver:En dator (windows/...

Dela och spåra dina böcker med BookCrossing

BookCrossing är en webbplats som gör att du kan tilldela unika nummer till dina böcker, och använda dessa nummer för att spåra dina böcker som de reser över hela världen. Detta blir naturligtvis mycket mer spännande om dina böcker faktiskt få lämna d...

Hur man spela telefon musik på din TV

någonsin velat spela musik högt men du inte vill betala för och dyra dock eller en dyr adapter kabel? Denna tutorial ska show dig hur man gör en för bara om under $10!Steg 1: Saker du behöver: Behöver du (uppifrån och ned) â ¢ 1 RCA Y kabel â ¢ 1 dub...

Spel och titta på bälte spänne

jag älskar Nintendos spel och klockor. För mig är detta min barndom, tappats upp i små, fickformat, rektanglar av härliga spelglädje.Min första någonsin var en Donkey Kong Jr när jag var 7. Inledningsvis kämpade jag för ett par dagar att få den lilla...

Hur man syr en söt sommarklänning solen och göra dina egna kläder

denna underbara, trendig klänning var med i vår "Varje stil har en gemensam Thread" annons att representera en Valley Girl look. Det inspirerades av tecken som Elle Woods från Legally Blonde och Cher från Clueless. Klänningen kräver en teknik so...

Förbättrat Strata för mindre än $20, planteringsjord och Semi - Sheilding din gitarr

ja jag har en indonesiska utformad Squire Strat (jag normalt berätta för människor är det en vintage Fender). Som med alla billiga nybörjare elgitarrer särskilt sådana med enda spole pickups får du en massa foder tillbaka och un-ville oväsen.Efter da...

Duschförhänge inte längre hålla sig till din kropp

om du har ett duschdraperi vet du förmodligen fenomenet att gardinen gillar dig så mycket och försöker hålla sig till din kropp i duschen.En väldigt enkel fix kom fram till mig för det problemet:De flesta av dusch badkar är tillverkade av stål omfatt...

Hur man ska spela och tjäna pengar i kungariket av avsky.

Detta instructable kommer att visa människor hur man skapar en karaktär och hur man gör kött (spelets valuta)__________________________________________________________________________Tre skäl varför detta spel är bra:-A DnD (dungeons n' drakar) parod...

Atari Punk konsol - Konduktiv bläck & din kropp

bygga en enkel Atari Punk konsolen som använder ledande bläck och din kropp för att ändra ljudet! Banan här var modellerad av Joshua Zimmerman underbara instructable. Den ursprungliga designen för APC eller "Klev tongeneratorn" krediteras skog M...

ULTIMATIVE spel och arbetar DESKTOP

HejJag vill presentera min gaming och arbetande skrivbordet och visa dig hur jag gjorde det!Kan börja med den grundläggande idén:Jag ville skapa ett skrivbord, som är mycket bekväma och customizalbe för ägaren.Jag ville också en inre dator, så man ka...

The Walking Dead säsong 2, Android - Hur till backningen och hålla dina framsteg

Uppdatering 22/03/2015: möjligt fix för ljudproblem.Jag märkte på min ROM (Team UB) som i menyn finns ett avsnitt "Prestanda".Där är bara en switch "Aktivera per-app profiler".Som standard är det "på", jag stängt av och alla...