【问题标题】:Kinect SDK: Skeleton flickeringKinect SDK:骨架闪烁
【发布时间】:2015-05-16 01:20:07
【问题描述】:

我对这段代码有疑问。

当我使用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;
}

【问题讨论】:

    标签: c# kinect kinect-sdk


    【解决方案1】:

    已解决

    在从“Draw”回调调用之前,我将成员调用放入“Update”回调中。

    正确代码(相关部分)

    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]
    

    Draw 调用错误

    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]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多