다른 스켈레톤의 크기와 일치하도록 스켈레톤 크기를 조정하려고합니다. 내 알고리즘으로는 다음을 수행하십시오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;
}
모든이의 손을 제외하고 잘 작동하는 것 같다,이 이미지
I에서
봐 발자취 내 자신의 뼈대가 있고, 뼈대 sc 다른 사람의 크기에 따라 달라졌지 만, 손과 발은 여전히 미쳤다. (하지만 코드는 올바르게 보입니다)
어떤 제안이 있습니까?
이 나이를 깨달았습니다. 파티에 늦게 늦었습니다! 나는 당신의 문제가 원래의 거리를 계산하는데 여전히 사용하면서 당신을 해골로 스케일하는 것을 시도하는 것에 기인한다고 생각합니다. 마지막에 반환 할 수있는 세 번째 스케일 된 뼈대를 만듭니다. 올바른 거리 계산을 위해 원래의 조인트 위치를 그대로 유지해야하므로 루프의 원래 조인트 위치를 수정하지 마십시오. – zeFrenchy