2012-09-24 24 views
0

我只是想能夠做一些事情,當我的骨骼關節(x,y,z)座標超過x,y,z座標按鈕。 。我有下面的代碼,但它不能正常工作。 。隨着一聲我的手移動它會做一些沒有我的手到達按鈕如何使用骨骼關節作爲遊標使用邊界(無手勢)

if (skeletonFrame != null) 
       { 
        //int skeletonSlot = 0; 
        Skeleton[] skeletonData = new Skeleton[skeletonFrame.SkeletonArrayLength]; 
        skeletonFrame.CopySkeletonDataTo(skeletonData); 

        Skeleton playerSkeleton = (from s in skeletonData where s.TrackingState == SkeletonTrackingState.Tracked select s).FirstOrDefault(); 

        if (playerSkeleton != null) 
        { 
         Joint rightHand = playerSkeleton.Joints[JointType.HandRight]; 

         handPosition = new Vector2((((0.5f * rightHand.Position.X) + 0.5f) * (640)), (((-0.5f * rightHand.Position.Y) + 0.5f) * (480))); 

         var rightHands = playerSkeleton.Joints[JointType.HandRight]; 
         var rightHandsX = rightHands.Position.X; 
         var rightHandsY = rightHands.Position.Y; 
         var rightHandsZ = rightHands.Position.Z; 


         if (Math.Sqrt(Math.Pow(rightHandsX - position.X, 2) + Math.Pow(rightHandsY - position.Y, 2)) < 20) 
         { 

          // Exit(); 
         } 



if (Math.Sqrt(Math.Pow(rightHandsX - start_bttn.Bounds.X, 1) + Math.Pow(rightHandsY - start_bttn.Bounds.Y, 1)) < 10) 
         { 

          currentGameState = GameState.Selection; 
          // Exit(); 
         } 

if ((rightHandsX < GraphicsDevice.Viewport.Width/2 + 150 && rightHandsX > GraphicsDevice.Viewport.Width/2 - 75) && (rightHandsY > GraphicsDevice.Viewport.Height/2 && rightHandsY < GraphicsDevice.Viewport.Height/2 + 50)) 
         { 
          currentGameState = GameState.Selection; 

         } 

}

回答

1

這裏是我的手跟蹤功能。看看它是否做你想要的,或讓你更接近...

private void TrackHandMovement(Skeleton skeleton) 
    { 
     Joint leftHand = skeleton.Joints[JointType.HandLeft]; 
     Joint rightHand = skeleton.Joints[JointType.HandRight]; 

     Joint leftShoulder = skeleton.Joints[JointType.ShoulderLeft]; 
     Joint rightShoulder = skeleton.Joints[JointType.ShoulderRight]; 

     Joint rightHip = skeleton.Joints[JointType.HipRight]; 

     // the right hand joint is being tracked 
     if (rightHand.TrackingState == JointTrackingState.Tracked) 
     { 
      // the hand is sufficiently in front of the shoulder 
      if (rightShoulder.Position.Z - rightHand.Position.Z > 0.4) 
      { 
       double xScaled = (rightHand.Position.X - leftShoulder.Position.X)/((rightShoulder.Position.X - leftShoulder.Position.X) * 2) * SystemParameters.PrimaryScreenWidth; 
       double yScaled = (rightHand.Position.Y - rightShoulder.Position.Y)/(rightHip.Position.Y - rightShoulder.Position.Y) * SystemParameters.PrimaryScreenHeight; 

       // the hand has moved enough to update screen position (jitter control/smoothing) 
       if (Math.Abs(rightHand.Position.X - xPrevious) > MoveThreshold || Math.Abs(rightHand.Position.Y - yPrevious) > MoveThreshold) 
       { 
        RightHandX = xScaled; 
        RightHandY = yScaled; 

        xPrevious = rightHand.Position.X; 
        yPrevious = rightHand.Position.Y; 

        // reset the tracking timer 
        trackingTimerCounter = 10; 
       } 
      } 
     } 
    } 

有一些數學在那裏翻譯手位置到屏幕位置。爲了招人,但我的邏輯是:

Shoulders = top of screen 
Hips = bottom of screen 
Left Should = left most on screen 

爲了獲得最右邊的屏幕位置,我取左側&右肩之間的距離,並把它添加到右肩。

+0

嘿,非常感謝你回答..這個蟎是一個非常愚蠢的問題,但我不明白什麼是雙xScaled&yScaled在做什麼?我們爲什麼需要它? –

+0

這是相對於主顯示器的分辨率將手位置轉換爲屏幕位置的代碼片段。將肩膀映射到屏幕頂部,臀部到臀部,左肩到左側屏幕,以及屏幕右側右肩外側的一小段距離。它爲用戶的胳膊產生一個「點擊框」,因此它們不必在任何給定的方向上大幅拉伸以將光標放在屏幕上的某處。 –

相關問題