static BVHExporter CreateBVHExporter()
 {
     BVHExporter exporter = new BVHExporter();
     exporter.ExcludeFingers = false;
     exporter.ExcludeToes = false;
     exporter.HandsDownward = false;
     exporter.MotionBuilderNames = true;
     exporter.SingleJointTorso = false;
     exporter.Units = LengthUnits.Units_Centimeters;
     return exporter;
 }
    static bool ExportBVHs(Take pTake, IEnumerable<TakeProcessor> pTakeProcessors, BVHExporter pExporter, StreamWriter pLoger, ref int pNbErrors)
    {
        pNbErrors = 0;
        IEnumerable<Node> activeSkels = pTake.Scene.AllSkeletons().Where(skel => skel.Active);
        if (activeSkels.Count() > 0)
        {
            Log(pLoger, "==> Exporting BVH files (1 per skeleton)... !");

            // We will export BVHs only if all processors succeed.
            bool allProcessesSucceeded = true;
            foreach (TakeProcessor processor in pTakeProcessors)
            {
                try
                {
                    Result processResult = processor.Process(pTake);
                    if (!processResult.Success)
                    {
                        Log(pLoger, String.Format("\tError : process {0} failed : {1}", processor.Name, processResult.Message));
                        allProcessesSucceeded = false;
                        ++pNbErrors;
                        break;
                    }
                }
                catch (Exception e)
                {
                    Log(pLoger, String.Format("\tError : process {0} failed : {1}", processor.Name, e.Message));
                    allProcessesSucceeded = false;
                    ++pNbErrors;
                    break;
                }
            }

            if (allProcessesSucceeded)
            {
                string takeDir = Path.GetDirectoryName(pTake.FileName);
                // Exporting all active skeletons to a bvh file.
                for (int i = 0; i < activeSkels.Count(); ++i)
                {
                    Node skeleton = activeSkels.ElementAt(i);

                    string bvhFilePath = Path.GetFileNameWithoutExtension(pTake.FileName) + "_" + skeleton.Name + "." + pExporter.Extension;
                    bvhFilePath = Path.GetFullPath(Path.Combine(takeDir, bvhFilePath));
                    try
                    {
                        pExporter.SkeletonName = skeleton.Name;
                        pExporter.Scale = 1.0f;
                        pExporter.StartFrame = pTake.FullFrameRange.Start;
                        pExporter.EndFrame = pTake.FullFrameRange.End;
                        pExporter.FrameRate = (float)pTake.FrameRate;

                        Result exportResult = pExporter.Export(pTake, bvhFilePath, true);
                        if (exportResult.Success)
                        {
                            Log(pLoger, String.Format("\t==> BVH {0}/{1} exported successfully to file {2}", i+1, activeSkels.Count(), bvhFilePath));
                        }
                        else
                        {
                            Log(pLoger, String.Format("\tError : cannot export BVH {0}/{1} : {2} => {3}", i+1, activeSkels.Count(), bvhFilePath, exportResult.Message));
                            ++pNbErrors;
                        }
                    }
                    catch (Exception e)
                    {
                        Log(pLoger, String.Format("\tError : cannot export BVH {0}/{1} : {2} => {3}", i+1, activeSkels.Count(), bvhFilePath, e.Message));
                        ++pNbErrors;
                    }
                }
            }
        }
        else
        {
            Log(pLoger, "\t==> No active skeleton found !");
            return false;
        }
        return pNbErrors == 0;
    }