0

Kinect でプロジェクトを作成しています。このプロジェクトでは、ユーザーのスケルトンを常に Kinect に向けて移動および回転する必要があります。

Skeleton の実際の値を変更できないことはわかっているので、littleGuy というアバター スケルトンを作成しました。littleGuy は、各要素にそれぞれ割り当てられた実際の Skeleton のすべての SkeletonPoints を持つ 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);

                    }

ポイントをカラー画像にマッピングする前に、ポイントを操作する必要があります...どうすればよいですか?

4

1 に答える 1

0

問題を解決しました。SkeletonPoint の X、Y、Z の値は float であるためです。オフセットを追加するときに 10 進数にキャストしてから、全体を 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;
                }
于 2013-05-21T09:41:28.230 に答える