1

私は非常に単純なことをしています。私の目標は、他のスケルトンの位置に基づいて 1 つのスケルトンを移動することです。これは、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 ループの 2 番目のパスで問題なく動作します。foreach で 2 回目に渡すと、この行で例外が発生します

skReturn.Joints[item] = movedJoint;

例外は言う:

JointType index value must match Joint.JointType 

しかし、値は実際には Spine です。

どうしたの?

4

1 に答える 1

2

解決済み、ここに解決策があります

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

これは機能します。

于 2012-11-27T22:30:17.623 に答える