Kinect Skeletal tracking és az eszköztár frissítése

Először is az eszköztár frissítéséről: Az első ok a frissítésre a kényelem volt. Az első verzióban nem használtam foldereket a projekten belül. Most már sokkal tagoltabb lett. A második és fontosabb indok a Skeletal tracking kibővítése volt.

Először is felvettem egy két új osztályt: a Player osztályt és a SkeletonDrawer osztályt. A Player osztály csak tárolásra szolgál. Eltárolom benne a csontvázat és a kirajzoló Pen-t. A SkeletonDrawer osztályban van megvalósítva a csontáz kirajzolása. Lényegében ez apró vátoztatás, mert csak áthelyeztem a feldolgozó osztályból.

A feldolgozó osztály változásai:
Felvettem két Player-t a változók közé, ez lesz a két követett játékos és egy SkeletonDrawert. A feldolgozó metódus is megváltozott. Bővült a paraméterlista:

  • int: Hány játékost akarunk követni. Alapértelmezetten 1
  • WriteabeBitmap: A háttér. Alapértelmezetten null
  • bool: Ki akarom-e rajzolni a csontvázat, vagy csak az adatokra van szükségem. Alapértelmezetten hamis

A metódus működése: Először megnyitja a SkeletonFrame-et és a Skeleton tömbbe másolja az adatokat. Ezután következik a játékosok számának ellenőrzése. Ez volt a legnagyobb változtatás. Az előző vezió csak egy játékost követett.

Abban az esetben, ha egy játékos van, akkor megvizsgáljuk a Player-ben eltárolt Skeletont. Ha null, akkor egyszerűen keresünk egy játékost:

PlayerOne.PlayerSkeleton = (from s in AllSkeletons
                            where s.TrackingState == SkeletonTrackingState.Tracked
                            select s).FirstOrDefault();

Ha nem null, akkor pedig hasonlóan az előzőhöz

 PlayerOne.PlayerSkeleton = (from s in AllSkeletons
                             where (s.TrackingState == SkeletonTrackingState.Tracked
                             && s.TrackingId == PlayerOne.PlayerSkeleton.TrackinId)
                             select s).FirstOrDefault();

Ezek után már csak a kirajzolás maradt hátra.

Két játékos esetében sem bonyolultabb a megoldás. (Bár be kell vallanom, hogy a munka során belefutottam pár rossz ötletbe.) Itt ugye négy esetet kell sorra vennünk: Ha mindkettő nulla, ha csak az első nullla, ha csak a második nulla, vagy egyik sem nulla.

Abban az esetben ha mindkettő nulla, akkor az első játékos legyen az először használt megoldás, míg a második játékos feltöltése előtt le kell ellenőriznünk, hogy az előbb kapott játékos csontváza nem null-e (a FirstOrDefault miatt). Ha nem, akkor

 PlayerTwo.PlayerSkeleton = (from s in AllSkeletons
                             where (s.TrackingState == SkeletonTrackingState.Tracked
                              && s.TrackingId != PlayerOne.PlayerSkeleton.TrackinId)
                             select s).FirstOrDefault();

Ha viszont nulla akkor legyen a szokásos. (Csak a TrackingState számít és FirstOrDefault). A másik három eset ennek mintájára már elképzelhető.

 

Üdvözlettel:
Álb Csaba

Leave a Reply