SkeletonFrameReadyイベントをキャプチャし、最後にキャプチャされたスケルトンをグローバル変数に保存できます。グローバル変数には、ボタンクリックイベントからアクセスできます。
例えば:
private Skeleton[] skeletons = new Skeleton[0];
private void SensorSkeletonFrameReady(object sender, SkeletonFrameReadyEventArgs e)
{
Skeleton[] skeletons = new Skeleton[0];
using (SkeletonFrame skeletonFrame = e.OpenSkeletonFrame())
{
if (skeletonFrame != null)
{
skeletons = new Skeleton[skeletonFrame.SkeletonArrayLength];
skeletonFrame.CopySkeletonDataTo(skeletons);
}
}
}
これで、最後のSkeletonFrameReadyイベントの配列(スケルトン)ができました。
以下のコメントに基づいて、SDKのv1.6にアップグレードし、Microsoftが提供する例を実行する必要があります。彼らはあなたがあなたの直接のプロジェクトに望んでいることを正確に行わないかもしれませんが、彼らはあなたにMicrosoft Kinect for Windowsでの作業の基本的な基礎を教え、あなたにセンサーでの作業方法の理解を与えます。
差し迫った状況で最も見たい例は、SkeletonBasics-WPFの例です。これは、スケルトンを追跡し、そこからデータをプルする方法を示します。また、追跡されたポイント上およびその間でアイテムを描画する方法も正確に示します。
あなたの状況にとって最も関連性のある部分はDrawBonesAndJoints関数です:
private void DrawBonesAndJoints(Skeleton skeleton, DrawingContext drawingContext)
{
// Render Torso
this.DrawBone(skeleton, drawingContext, JointType.Head, JointType.ShoulderCenter);
this.DrawBone(skeleton, drawingContext, JointType.ShoulderCenter, JointType.ShoulderLeft);
this.DrawBone(skeleton, drawingContext, JointType.ShoulderCenter, JointType.ShoulderRight);
this.DrawBone(skeleton, drawingContext, JointType.ShoulderCenter, JointType.Spine);
this.DrawBone(skeleton, drawingContext, JointType.Spine, JointType.HipCenter);
this.DrawBone(skeleton, drawingContext, JointType.HipCenter, JointType.HipLeft);
this.DrawBone(skeleton, drawingContext, JointType.HipCenter, JointType.HipRight);
// Left Arm
this.DrawBone(skeleton, drawingContext, JointType.ShoulderLeft, JointType.ElbowLeft);
this.DrawBone(skeleton, drawingContext, JointType.ElbowLeft, JointType.WristLeft);
this.DrawBone(skeleton, drawingContext, JointType.WristLeft, JointType.HandLeft);
// Right Arm
this.DrawBone(skeleton, drawingContext, JointType.ShoulderRight, JointType.ElbowRight);
this.DrawBone(skeleton, drawingContext, JointType.ElbowRight, JointType.WristRight);
this.DrawBone(skeleton, drawingContext, JointType.WristRight, JointType.HandRight);
// Left Leg
this.DrawBone(skeleton, drawingContext, JointType.HipLeft, JointType.KneeLeft);
this.DrawBone(skeleton, drawingContext, JointType.KneeLeft, JointType.AnkleLeft);
this.DrawBone(skeleton, drawingContext, JointType.AnkleLeft, JointType.FootLeft);
// Right Leg
this.DrawBone(skeleton, drawingContext, JointType.HipRight, JointType.KneeRight);
this.DrawBone(skeleton, drawingContext, JointType.KneeRight, JointType.AnkleRight);
this.DrawBone(skeleton, drawingContext, JointType.AnkleRight, JointType.FootRight);
// Render Joints
foreach (Joint joint in skeleton.Joints)
{
Brush drawBrush = null;
if (joint.TrackingState == JointTrackingState.Tracked)
{
drawBrush = this.trackedJointBrush;
}
else if (joint.TrackingState == JointTrackingState.Inferred)
{
drawBrush = this.inferredJointBrush;
}
if (drawBrush != null)
{
drawingContext.DrawEllipse(drawBrush, null, this.SkeletonPointToScreen(joint.Position), JointThickness, JointThickness);
}
}
}
ボーンは気にしないので、ボーンを描画する関数呼び出しを削除できます。
private void DrawBonesAndJoints(Skeleton skeleton, DrawingContext drawingContext)
{
// Render Joints
foreach (Joint joint in skeleton.Joints)
{
Brush drawBrush = null;
if (joint.TrackingState == JointTrackingState.Tracked)
{
drawBrush = this.trackedJointBrush;
}
else if (joint.TrackingState == JointTrackingState.Inferred)
{
drawBrush = this.inferredJointBrush;
}
if (drawBrush != null)
{
drawingContext.DrawEllipse(drawBrush, null, this.SkeletonPointToScreen(joint.Position), JointThickness, JointThickness);
}
}
}
これで、すべての関節にドットを描画するプログラムができました。あなたが望むのは手だけなら...
private void DrawBonesAndJoints(Skeleton skeleton, DrawingContext drawingContext)
{
drawingContext.DrawEllipse(trackedJointBrush, null, SkeletonPointToScreen(skeleton.Joints[JointType.HandLeft].Position), JointThickness, JointThickness);
drawingContext.DrawEllipse(trackedJointBrush, null, SkeletonPointToScreen(skeleton.Joints[JointType.HandRight].Position), JointThickness, JointThickness);
}
これで、手に2つの小さな点が続きます。