2013-03-22 109 views
0

我有这个代码的问题。Kinect SDK:骨架闪烁

当我使用MoveTo时,我的骨架在屏幕上滑动。我已经对原代码(here)一些小的变化:

  • 锁定骨骼位置到一个特定的Z位置
  • 增长水平速度(X)

我使用XNA 4.0和我打电话该成员进入Draw“回调”。

所以,问题是:为什么骨骼轻弹?

private Skeleton MoveTo2(Skeleton skToBeMoved) { 
    Joint newJoint = new Joint(); 
    ///Based on the HipCenter 
    float howMuchMoveToX = ((skToBeMoved.Joints[JointType.HipCenter].Position.X - settings_skel_offset_x) * -1) * settings_skel_offset_x_mult; 
    float howMuchMoveToY = (skToBeMoved.Joints[JointType.HipCenter].Position.Y - settings_skel_offset_y) * -1; 
    float howMuchMoveToZ = (skToBeMoved.Joints[JointType.HipCenter].Position.Z - settings_skel_offset_z) * -1; 

    foreach (JointType item in Enum.GetValues(typeof(JointType))) 
    { 
     newJoint = skToBeMoved.Joints[item]; 
     SkeletonPoint pos = new SkeletonPoint() 
     { 
      X = (float)(newJoint.Position.X + (howMuchMoveToX)), 
      Y = (float)(newJoint.Position.Y + (howMuchMoveToY)), 
      Z = (float)(newJoint.Position.Z + (howMuchMoveToZ)), 
     }; 

     if (XnaBasics.settings_skel_lock_z) 
     { 
      pos.Z = settings_skel_offset_z; 
     } 

     newJoint.Position = pos; 
     Debug.WriteLine("SkelID: "+skToBeMoved.TrackingId+ " howMuchMoveToX: " + howMuchMoveToX + " oldPosX: " + skToBeMoved.Joints[item].Position.X + " newPosX: " + newJoint.Position.X); 
     skToBeMoved.Joints[item] = newJoint; 
    } 
    return skToBeMoved; 
} 

回答

0

解决

我把电话员进入“更新”的回调,然后才从“画”回调调用。

正确的代码(相关部分)

public override void Update(GameTime gameTime) 
{ 
    // Debug.WriteLine("= UPDATE - SkeletonStreamRender"); 
    if (null == this.Chooser.Sensor || false == this.Chooser.Sensor.IsRunning || KinectStatus.Connected != this.Chooser.Sensor.Status) 
    { 
     return; 
    } 

    if (skeletonDrawn || !drawChk) 
    { 
     using (var skeletonFrame = this.Chooser.Sensor.SkeletonStream.OpenNextFrame(0)) 
      { 
      if (null == skeletonData || skeletonData.Length != skeletonFrame.SkeletonArrayLength) 
      { 
       skeletonData = new Skeleton[skeletonFrame.SkeletonArrayLength]; 
      } 

      skeletonFrame.CopySkeletonDataTo(skeletonData); 

      int counter = 0; 
      foreach (Skeleton s in skeletonData) 
      { 
       if (s.TrackingState == SkeletonTrackingState.Tracked) 
       { 
        playersID = s.TrackingId; 
        Skeleton skeleton = MoveTo2(s); 
        skeletonData[counter] = skeleton; 
        continue; 
       } 
       counter++; 
      } 

      skeletonDrawn = false; 
     } 
     [CUT] 

打错的电话,从绘制

public override void Draw(GameTime gameTime) 
    { 
     // Debug.WriteLine("== DRAW - SkeletonStreamRender"); 
     // If the joint texture isn't loaded, load it now 
     if (null == this.jointTexture) 
     { 
      this.LoadContent(); 
     } 

     // If we don't have data, lets leave 
     if (null == skeletonData || null == this.mapMethod) 
     { 
      return; 
     } 

     if (false == this.initialized) 
     { 
      this.Initialize(); 
     } 

     this.SharedSpriteBatch.Begin(); 

     foreach (var skeleton in skeletonData) 
     { 
      if (playersID != skeleton.TrackingId) 
       continue; 

      switch (skeleton.TrackingState) 
      { 
       case SkeletonTrackingState.NotTracked: 
        // non tracciato 
        break; 
       case SkeletonTrackingState.Tracked: 
        // blocco la posizione Z 

        Skeleton skeleton = MoveTo2(skeletonTmp); 

        // Draw Bones 
        this.DrawBone(skeleton.Joints, JointType.Head, JointType.ShoulderCenter); 
        this.DrawBone(skeleton.Joints, JointType.ShoulderCenter, JointType.ShoulderLeft); 
        this.DrawBone(skeleton.Joints, JointType.ShoulderCenter, JointType.ShoulderRight); 
        this.DrawBone(skeleton.Joints, JointType.ShoulderCenter, JointType.Spine); 
        [CUT]