private void client_PositionChanged(object sender, TrackerChangeEventArgs e)
{
//If we try and pass a new skeleton for every tracker update we recieve, we'll spend way too much time and memory creating new skeleton objects
//Therefore, this will only update the last skeleton object and the last skeleton data will be passed at regular time intervals
Joint newJoint = new Joint();
newJoint.utcTime = DateTime.UtcNow; //We can't be sure if a specific VRPN server is using utc or local time, so we will grab our own time instead of using VRPNs
JointMapping map = GetJointMapFromChannel(e.Sensor);
newJoint.JointType = map.joint;
newJoint.Position = new Point3D(e.Position.X, e.Position.Y, e.Position.Z);
newJoint.Orientation = e.Orientation;
newJoint.TrackingState = TrackingState.Tracked;
lastSkeleton.skeleton[map.joint] = newJoint;
}