【问题标题】:Exception understood on update Kinect Joint positions更新 Kinect 关节位置时理解异常
【发布时间】:2012-11-28 06:30:17
【问题描述】:

我正在做一个非常简单的事情,我的目标是根据另一个骨架的位置移动一个骨架,为此我基于 HipCenter 位置。 (这个算法可能是错误的,这个问题是关于foreach循环中发生的异常)

这是我的实际代码:

public static Skeleton MoveTo(this Skeleton skOrigin, Skeleton skDestiny)
{
     Skeleton skReturn = skOrigin; // just making a copy

        // find the factor to move, based on the HipCenter.
        float whatToMultiplyX = skOrigin.Joints[JointType.HipCenter].Position.X / skDestiny.Joints[JointType.HipCenter].Position.X;
        float whatToMultiplyY = skOrigin.Joints[JointType.HipCenter].Position.Y / skDestiny.Joints[JointType.HipCenter].Position.Y;
        float whatToMultiplyZ = skOrigin.Joints[JointType.HipCenter].Position.Z / skDestiny.Joints[JointType.HipCenter].Position.Z;


        SkeletonPoint movedPosition = new SkeletonPoint();
        Joint movedJoint = new Joint();
        foreach (JointType item in Enum.GetValues(typeof(JointType)))
        {
            // Updating the position
            movedPosition.X = skOrigin.Joints[item].Position.X * whatToMultiplyX;
            movedPosition.Y = skOrigin.Joints[item].Position.Y * whatToMultiplyY;
            movedPosition.Z = skOrigin.Joints[item].Position.Z * whatToMultiplyZ;

            // Setting the updated position to the skeleton that will be returned.
            movedJoint.Position = movedPosition;
            skReturn.Joints[item] = movedJoint;
        }

        return skReturn;
    }

使用 F10 调试一切正常,直到 foreach 循环的第二遍。 当我第二次在 foreach 中通过时,我在这一行得到一个异常

skReturn.Joints[item] = movedJoint;

异常说:

JointType index value must match Joint.JointType 

但价值实际上是 Spine。

怎么了?

【问题讨论】:

  • 您是否尝试过按索引引用Joints 数组?明天我会尝试启动我的 Kinect 并测试循环,看看我是否也可以重现它。
  • 谢谢,但别担心,我会找到解决方案,稍后会编辑我的问题。还是谢谢
  • 嗨,Ewerton,您能发布您的解决方案吗?我在想写的单元测试中遇到了同样的问题......
  • @Ingo 看,抱歉迟到了。这里是

标签: kinect kinect-sdk


【解决方案1】:

解决了,解决办法在这里

 Joint newJoint = new Joint(); // declare a new Joint

// Iterate in the 20 Joints
foreach (JointType item in Enum.GetValues(typeof(JointType)))
{
    newJoint = skToBeMoved.Joints[item];

            // applying the new values to the joint
            SkeletonPoint pos = new SkeletonPoint()
            {
                X = (float)(newJoint.Position.X + (someNumber)),
                Y = (float)(newJoint.Position.Y + (someNumber)),
                Z = (float)(newJoint.Position.Z + (someNumber))
            };

            newJoint.Position = pos;
            skToBeChanged.Joints[item] = newJoint;
        }

这会起作用。

【讨论】:

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