我正在Kinect上创建一个项目,我需要翻译和旋转用户的骨架,以便它始终面向Kinect。
我知道我无法改变Skeleton的实际值,因此我创建了一个名为littleGuy的头像骨架。 littleGuy是一个SkeletonPoints数组,分别为每个元素分配了实际Skeleton的所有SkeletonPoints。
所有操作都发生在littleGuy骨架上,然后保存在一个名为transGuy(翻译家伙)的不同骨架中。问题是每当我编辑transGuy的值然后尝试将它们映射到colorImage时,我会得到一个溢出的值,并且永远不会渲染骨架。
在下面的代码中,我将Center Hip分配给littleGuy [0],然后我选择偏移为-CHip,因为所有翻译都将基于此centerHip。然后我将偏移添加到transGuy。
if (joint.JointType == JointType.HipCenter)
{
littleguy_chip = skeleton.Joints[JointType.HipCenter].Position;
littleGuy[0] = littleguy_chip;
TransValue.X = -littleguy_chip.X;
TransValue.Y = -littleguy_chip.Y;
TransValue.Z = -littleguy_chip.Z;
transGuy[0] = littleGuy[0];
transGuy[0].X = littleGuy[0].X + TransValue.X;
transGuy[0].Y = littleGuy[0].Y + TransValue.Y;
transGuy[0].Z = littleGuy[0].Z + TransValue.Z;
prevPositions[0] = joint.Position;
}
之后,我通过循环transGuy并将值映射到骨架来绘制每个关节,但我总是得到值2147483648
for (int j = 0; j < transGuy.Length; j++)
{
if ((transGuy[i] == littleguy_head && transGuy[j] == littleguy_cshoulder)
|| (transGuy[i] == littleguy_cshoulder && transGuy[j] == littleguy_spine)
|| (transGuy[i] == littleguy_spine && transGuy[j] == littleguy_chip))
{
var p2 = kinect.CoordinateMapper.MapSkeletonPointToColorPoint(
transGuy[j], ColorImageFormat.RgbResolution640x480Fps30);
spriteBatch.Draw(lineTex, new Vector2(p.X + 80, p.Y),
null, Color.White, (float)Math.Atan2(p2.Y - p.Y, (p2.X + 80) - (p.X + 80)), new Vector2(0f, (float)lineTex.Height / 2),
new Vector2(Vector2.Distance(new Vector2(p.X + 80, p.Y), new Vector2(p2.X + 80, p2.Y)), 1f), SpriteEffects.None, 0f);
}
我真的需要在将它们映射到彩色图像之前操纵这些点......我该怎么做?
答案 0 :(得分:0)
我解决了这个问题。由于SkeletonPoint中的X,Y,Z值是浮点数。在添加偏移量时键入Cast为decimal,然后键入将整个事物转换回float。新代码如下所示:
if (joint.JointType == JointType.Spine)
{
littleguy_spine = skeleton.Joints[JointType.Spine].Position;
littleGuy[1] = littleguy_spine;
transGuy[1] = littleGuy[1];
transGuy[1].X = (float)((decimal)(littleGuy[1].X) + (decimal)(TransValue.X));
transGuy[1].Y = (float)((decimal)(littleGuy[1].Y) + (decimal)(TransValue.Y));
transGuy[1].Z = (float)((decimal)(littleGuy[1].Z) + (decimal)(TransValue.Z));
prevPositions[1] = joint.Position;
}