public void ToggleButtonRecChecked(object sender, RoutedEventArgs e) { Controls.ConsoleControl.LogEntries.Add(new LogEntry(DateTime.Now, "Initialization")); Microsoft.Win32.SaveFileDialog saveFileDialog = new Microsoft.Win32.SaveFileDialog { Title = "Select filename", Filter = "Replay files|*.replay" }; if (saveFileDialog.ShowDialog() == true) { Controls.ConsoleControl.LogEntries.Add(new LogEntry(DateTime.Now, "Recording Stream")); DirectRecord(saveFileDialog.FileName); if (BVHFile == null && sensor != null) { Controls.ConsoleControl.LogEntries.Add(new LogEntry(DateTime.Now, "Recording BHV")); string txtFileName = saveFileDialog.FileName.Replace(".replay", ""); BVHFile = new BVHWriter(txtFileName); Window w = Window.GetWindow(this); MainWindow mw = (MainWindow)w; BVHFile.SetBvhEditor(mw.bvhEditor); } } }
/// <summary> /// calculate length of each bone, get each joint's original position based on T pose; /// todo: give each bone a rotation as its start position, and calculate the original offset using this rotation and bone length; /// </summary> /// <param name="skeleton"></param> public void CliberateSkeleton(Skeleton skeleton) { _cliberateNum++; if (NeedBoneClibrated()) { //clibrateStartPosition(skeleton); updateBoneLengths(skeleton); initializeJoints(skeleton); } else { // set each joint original offset - T pose foreach (JointNode node in JointNodes) { switch (node.JointIndex) { case JointType.HipCenter: //node.OriginalOffset = new Point3D(BVHWriter.BVHScaledValue(_initialOffsets[(int)node.JointIndex].X), // BVHWriter.BVHScaledValue(_initialOffsets[(int)node.JointIndex].Y + calRealHeightOfHipJoint()), BVHWriter.BVHScaledValue(_initialOffsets[(int)node.JointIndex].Z)); node.OriginalOffset = new Point3D(); break; default: node.OriginalOffset = new Point3D(BVHWriter.BVHScaledValue(_initialOffsets[(int)node.JointIndex].X), BVHWriter.BVHScaledValue(_initialOffsets[(int)node.JointIndex].Y), BVHWriter.BVHScaledValue(_initialOffsets[(int)node.JointIndex].Z)); node.OriginalOffset.X *= 2; node.OriginalOffset.Y *= 2; node.OriginalOffset.Z *= 2; break; } } } }
public void ToggleButtonRecUnChecked(object sender, RoutedEventArgs e) { if (BVHFile != null) { BVHFile.CloseBVHFile(); Controls.ConsoleControl.LogEntries.Add(new LogEntry(DateTime.Now, "Record saved")); BVHFile = null; } if (recorder != null) { StopRecord(); } }
/// <summary> /// update all nodes' offsets and rotations with the latest skeleton frame /// </summary> /// <param name="skeleton"></param> public void UpdateJoints(Skeleton skeleton) { //StringBuilder sb = new StringBuilder(); //foreach (JointType joint in Enum.GetValues(typeof(JointType))) //{ // sb.Append(joint.ToString() + ", Start: " + skeleton.BoneOrientations[joint].StartJoint.ToString() // + ", End : " + skeleton.BoneOrientations[joint].EndJoint.ToString() // + " Rotation: " + getrotationString(skeleton.BoneOrientations[joint].HierarchicalRotation) + "\n"); //} //MessageBox.Show(sb.ToString()); /******* using position to calculate orientation ********/ //Vector3D vectorX, vectorY, vectorZ; //if (node.JointIndex == JointType.HipCenter) //{ // vectorY = KinectDataConverter.SkeletonPosToVector3d(skeleton.Joints[JointType.Spine].Position) // - KinectDataConverter.SkeletonPosToVector3d(skeleton.Joints[JointType.HipCenter].Position); // vectorX = KinectDataConverter.SkeletonPosToVector3d(skeleton.Joints[JointType.HipLeft].Position) // - KinectDataConverter.SkeletonPosToVector3d(skeleton.Joints[JointType.HipRight].Position); // Matrix3D rotationMatrix = new Matrix3D(); // KinectDataConverter.MakeMatrixFromYX(vectorX, vectorY, ref rotationMatrix); // Quaternion rotationQuaternion = KinectDataConverter.LookRotation( // KinectDataConverter.GetZColumn(rotationMatrix), KinectDataConverter.GetYColumn(rotationMatrix)); //} /******* using position to calculate orientation ********/ foreach (JointNode node in JointNodes) { JointType rotationJoint = getRotationJoint(node); Quaternion rotation = new Quaternion(); if (node.Type == NodeTypeEnum.ROOT) { node.Offset.X = BVHWriter.BVHScaledValue(skeleton.Joints[node.JointIndex].Position.X - _initialOffsets[(int)node.JointIndex].X); node.Offset.Y = BVHWriter.BVHScaledValue(skeleton.Joints[node.JointIndex].Position.Y - _initialOffsets[(int)node.JointIndex].Y + calRealHeightOfHipJoint()); node.Offset.Z = BVHWriter.BVHScaledValue(skeleton.Joints[node.JointIndex].Position.Z - _initialOffsets[(int)node.JointIndex].Z); rotation = KinectDataConverter.Vector4ToQuaternion(skeleton.BoneOrientations[node.JointIndex].AbsoluteRotation.Quaternion); Quaternion initialQuat = _initialRotations[(int)node.JointIndex]; initialQuat.Invert(); rotation = initialQuat * rotation; node.Rotation = KinectDataConverter.QuaternionToAxisAngles(rotation); } else { rotation = KinectDataConverter.Vector4ToQuaternion(skeleton.BoneOrientations[rotationJoint].HierarchicalRotation.Quaternion); Quaternion initialQuat = _initialRotations[(int)node.JointIndex]; initialQuat.Invert(); rotation = initialQuat * rotation; node.Rotation = KinectDataConverter.QuaternionToAxisAngles(rotation); //if (node.Axis == TransAxis.X || node.Axis == TransAxis.nX) //{ // Vector3D tempRotation = node.Rotation; // node.Rotation.X = tempRotation.Z; // node.Rotation.Z = tempRotation.X; //} } } }