2

別のスケルトンのサイズに合わせてスケルトンをスケーリングしようとしています。私のアルゴリズムは次のことを行います:

  • フィタゴラス定理を使用して、元の骨格と運命の骨格の2つの関節間の距離を見つけます
  • この 2 つの距離を除算して倍率を求めます。
  • 各関節にこの係数を掛けます。

これが私の実際のコードです:

public static Skeleton ScaleToMatch(this Skeleton skToBeScaled, Skeleton skDestiny)
    {
        Joint newJoint = new Joint();

        double distanciaOrigem = 0;
        double distanciaDestino = 0;
        double fator = 1;
        SkeletonPoint pos = new SkeletonPoint();

        foreach (BoneOrientation bo in skToBeScaled.BoneOrientations)
        {
            distanciaOrigem = FisioKinectCalcs.Distance3DBetweenJoint(skToBeScaled.Joints[bo.StartJoint], skToBeScaled.Joints[bo.EndJoint]);
            distanciaDestino = FisioKinectCalcs.Distance3DBetweenJoint(skDestiny.Joints[bo.StartJoint], skDestiny.Joints[bo.EndJoint]);

            if (distanciaOrigem > 0 && distanciaDestino > 0)
            {
                fator = (distanciaDestino / distanciaOrigem);

                newJoint = skToBeScaled.Joints[bo.EndJoint]; // escaling only the end joint as the BoneOrientatios starts from HipCenter, i am scaling from center to edges.

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

                newJoint.Position = pos;
                skToBeScaled.Joints[bo.EndJoint] = newJoint;
            }
        }

        return skToBeScaled;
    }

手と足を除いて、すべてがうまく機能しているようです

この画像を見て

ここに画像の説明を入力 ここに画像の説明を入力

自分の上に自分のスケルトンがあり、スケルトンは別の人のサイズにスケーリングされていますが、手と足はまだ狂っています. (ただし、コードは正しく見えます)

なにか提案を?

4

2 に答える 2

1

コードを実行しないとなんとも言えませんが、なんとなく「良さそう」です。

私が検証するのは、あなたの

if (distanciaOrigem > 0 && distanciaDestino > 0)

distanciaOrigemに非常に近くても、から離れて0いても、 に拾われない場合、epsilon0if

fator = (distanciaDestino / distanciaOrigem);

非常に大きな数になります。

于 2012-11-28T23:13:36.330 に答える