別のスケルトンのサイズに合わせてスケルトンをスケーリングしようとしています。私のアルゴリズムは次のことを行います:
- フィタゴラス定理を使用して、元の骨格と運命の骨格の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;
}
手と足を除いて、すべてがうまく機能しているようです
この画像を見て
自分の上に自分のスケルトンがあり、スケルトンは別の人のサイズにスケーリングされていますが、手と足はまだ狂っています. (ただし、コードは正しく見えます)
なにか提案を?