The sample simply applies the Kinect data. When the player raises the right hand, the model also raises its right hand. Everything would look ok if the camera was positioned behind the avatar. But since you are facing the avatar, you expect that the game acts like a mirror and the behavior looks odd.
To make the game act like a mirror:
In KinectAnimationSample.cs when you read the kinect joint positions in OnSkeletonFrameReady() mirror them along the x axis:
// Get joint positions.
for (int i = 0; i < _kinectSkeletonPose.Skeleton.NumberOfBones; i++)
{
var position = GetKinectJointPosition(skeletonData, i);
// Mirror x values.
var delta = position - hipCenterPosition;
delta.X *= -1;
position = hipCenterPosition + delta;
// Add a hardcoded y-offset to position the skeleton above the ground.
// And make all joint Z values relative to the hip center.
position += new Vector3F(0, 1.7f, -hipCenterPosition.Z);
// And store the joint positions in the _kinectSkeletonPose.
_kinectSkeletonPose.SetBonePoseAbsolute(i, new SrtTransform(QuaternionF.Identity, position))
}
In Update() when you update the animation joints, update the left joint using the right kinect bone, and vice versa:
// Update the target positions for the animation joints (using the mirrored bones).
_neckSpring.AnchorPositionALocal = _kinectSkeletonPose.GetBonePoseAbsolute((int)JointID.Head).Translation;
_elbowLeftSpring.AnchorPositionALocal = _kinectSkeletonPose.GetBonePoseAbsolute((int)JointID.ElbowRight).Translation;
_handLeftSpring.AnchorPositionALocal = _kinectSkeletonPose.GetBonePoseAbsolute((int)JointID.HandRight).Translation;
_elbowRightSpring.AnchorPositionALocal = _kinectSkeletonPose.GetBonePoseAbsolute((int)JointID.ElbowLeft).Translation;
_handRightSpring.AnchorPositionALocal = _kinectSkeletonPose.GetBonePoseAbsolute((int)JointID.HandLeft).Translation;
_kneeLeftSpring.AnchorPositionALocal = _kinectSkeletonPose.GetBonePoseAbsolute((int)JointID.KneeRight).Translation;
_ankleLeftSpring.AnchorPositionALocal = _kinectSkeletonPose.GetBonePoseAbsolute((int)JointID.AnkleRight).Translation;
_kneeRightSpring.AnchorPositionALocal = _kinectSkeletonPose.GetBonePoseAbsolute((int)JointID.KneeLeft).Translation;
_ankleRightSpring.AnchorPositionALocal = _kinectSkeletonPose.GetBonePoseAbsolute((int)JointID.AnkleLeft).Translation;
I haven't tested this thoroughly. But I think it should work.