2012-11-11 1 views
2

내가 사용자의 오른손에 의해 이루어집니다 원을 인식하는 논리를 개발하기 위해 노력하고, 나는 샘플 코드에서 골격과 트랙을 그리는 코드, 내가 지금 무엇을 원하는 관절 좌표 (X, Y, Z)를 찾는 방법, 관측 된 관절의 궤적을 그리는 방법?

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); 
      } 
     } 

     using (DrawingContext dc = this.drawingGroup.Open()) 
     { 
      // Draw a transparent background to set the render size 
      dc.DrawRectangle(Brushes.Black, null, new Rect(0.0, 0.0, RenderWidth, RenderHeight)); 

      if (skeletons.Length != 0) 
      { 
       foreach (Skeleton skel in skeletons) 
       { 
        RenderClippedEdges(skel, dc); 

        if (skel.TrackingState == SkeletonTrackingState.Tracked) 
        { 
         this.DrawBonesAndJoints(skel, dc); 
        } 
        else if (skel.TrackingState == SkeletonTrackingState.PositionOnly) 
        { 
         dc.DrawEllipse(
         this.centerPointBrush, 
         null, 
         this.SkeletonPointToScreen(skel.Position), 
         BodyCenterThickness, 
         BodyCenterThickness); 
        } 
       } 
      } 

      // prevent drawing outside of our render area 
      this.drawingGroup.ClipGeometry = new RectangleGeometry(new Rect(0.0, 0.0, RenderWidth, RenderHeight)); 
     } 
    } 

이있어 여기

내가 작업을 끝낼 계획입니다 어떻게, 제스처 인식에 대한 사용자의 좌표에게 오른손을 추적하기 :

  1. 시작
  2. 는 동그라미 제스처를 그리기 제스처, 시작을위한 좌표를 저장하고 조인트의 45도 시프트마다 좌표를 처음부터 기억해야합니다. 8 개의 8 분면에 대해 8 개의 샘플을 얻습니다.
  3. 원이 그려지는 결정을 내리기 위해 8 개 샘플 간의 관계를 확인할 수 있습니다.

는 또한, depthimage에서 나는 handpoint 우리는 사용자에 의해 그려진 그림을 얻을 것이다 끝에 그래서 뒤에 흔적을 남긴다 이동 있도록, 그려진 제스처의 궤적을 보여주고 싶어요. 나는 이것을 어떻게 달성 할 수 있는지 전혀 모른다.

+0

당신이 무엇을 요구하고 있는지 분명하지 않습니다. 위의 철자 논리를 시도 했습니까? –

+0

안녕하세요, 오른쪽 관절의 좌표를 가져오고 싶습니다. 지금까지 나는 오른쪽 손의 (X, Y, Z) 좌표를 얻을 수있었습니다. 제 질문의 두 번째 부분에 대해서도 오른쪽 관절의 움직임의 궤적 (경로)을 표시해야합니다. 우리는 스켈레톤 뷰를보고 있고 사용자는 원을 그리며 스켈레톤 뷰에서 오른손 관절이 따르는 경로를 볼 것입니다. 나는 나의 질문이 분명하기를 바란다 :/그것이 아직도 is not라면 나에게 알린다. –

+0

제스처 시작을 어떻게 감지 했습니까? 당신이 원을 보간 할 수있는 마지막 _n_ 포인트의 기록을 가지고있을 때, 끝을 감지하는 것이 더 쉬울 것입니다 ... – Rook

답변

4

각 조인트의 좌표는 각 SkeletonFrameReady 이벤트 동안 각 추적 된 골격에 대해 사용할 수 있습니다. 당신의 foreach 루프 ...

foreach (Skeleton skeleton in skeletons) { 
    // get the joint 
    Joint rightHand = skeleton.Joints[JointType.HandRight]; 

    // get the individual points of the right hand 
    double rightX = rightHand.Position.X; 
    double rightY = rightHand.Position.Y; 
    double rightZ = rightHand.Position.Z; 
} 

내부 당신은 관절 중 하나를 꺼내 개별 좌표와 함께 작동하도록 JointType 열거 볼 수 있습니다.

제스처 트레일을 그리려면 예제에있는 DrawContext을 사용하거나 다른 방법으로 Path을 시각적 레이어 위에 그립니다. x/y/z 값을 사용하여 창 좌표로 크기를 조정해야합니다. "Coding4Fun"라이브러리는 미리 작성된 기능을 제공합니다. 또는 직접 작성할 수도 있습니다. 예를 들면 다음과 같습니다.

private static double ScaleY(Joint joint) 
{ 
    double y = ((SystemParameters.PrimaryScreenHeight/0.4) * -joint.Position.Y) + (SystemParameters.PrimaryScreenHeight/2); 
    return y; 
} 

private static void ScaleXY(Joint shoulderCenter, bool rightHand, Joint joint, out int scaledX, out int scaledY) 
{ 
    double screenWidth = SystemParameters.PrimaryScreenWidth; 

    double x = 0; 
    double y = ScaleY(joint); 

    // if rightHand then place shouldCenter on left of screen 
    // else place shouldCenter on right of screen 
    if (rightHand) 
    { 
     x = (joint.Position.X - shoulderCenter.Position.X) * screenWidth * 2; 
    } 
    else 
    { 
     x = screenWidth - ((shoulderCenter.Position.X - joint.Position.X) * (screenWidth * 2)); 
    } 


    if (x < 0) 
    { 
     x = 0; 
    } 
    else if (x > screenWidth - 5) 
    { 
     x = screenWidth - 5; 
    } 

    if (y < 0) 
    { 
     y = 0; 
    } 

    scaledX = (int)x; 
    scaledY = (int)y; 
} 
관련 문제