我想缩放骨架以匹配另一个骨架的大小。 我algoritm请执行以下操作:Kinect骨架缩放奇怪的行为
- 寻找原点骨架的两个关节,并使用phytagorean teorem
- 分这两个距离找到倍率命运骨架之间的距离。
- 用这个因子乘以每个关节。
这里是我的实际代码:
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;
}
每一个似乎除了手做工精细和脚子
看这个图片
我有我自己的骨架在我身上,还有我的骨架sc对另一个人的大小,但手和脚仍然疯狂。 (但代码看起来不错)
任何建议?
刚刚意识到这个年龄......非常迟到了!我认为你的问题源于试图在运行中缩放骨架,同时仍然使用它来计算原始距离。创建一个可以在最后返回的第三个缩放骨骼。不要修改循环中的原始关节位置,因为您需要它们保持正确的距离计算。 – zeFrenchy