コード例 #1
0
        public static void Load()
        {
            string settingsFolder   = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "IgniteVR", "Spark");
            string filename         = Path.Combine(settingsFolder, "camerawrite_settings.json");
            string animationsFolder = Path.Combine(settingsFolder, "Animations");


            try
            {
                // general settings file
                if (File.Exists(filename))
                {
                    string json = File.ReadAllText(filename);
                    instance = JsonConvert.DeserializeObject <CameraWriteSettings>(json);
                }
                else
                {
                    Console.WriteLine($"Settings file doesn't exist, creating.");
                    instance = new CameraWriteSettings();
                }
            }
            catch (Exception e)
            {
                Console.WriteLine($"Error reading settings file\n{e}");
                instance = new CameraWriteSettings();
            }

            try
            {
                // animation files
                if (!Directory.Exists(animationsFolder))
                {
                    Console.WriteLine("Animations folder doesn't exist, creating.");
                    Directory.CreateDirectory(animationsFolder);
                }

                animations = new Dictionary <string, AnimationKeyframes>();
                string[] files = Directory.GetFiles(animationsFolder);
                foreach (string file in files)
                {
                    string             json = File.ReadAllText(file);
                    AnimationKeyframes anim = JsonConvert.DeserializeObject <AnimationKeyframes>(json);
                    if (anim != null)
                    {
                        animations[Path.GetFileNameWithoutExtension(file)] = anim;
                    }
                }
            }
            catch (Exception e)
            {
                Console.WriteLine($"Error reading animation files\n{e}");
            }
        }
コード例 #2
0
        public BezierSpline(AnimationKeyframes animation)
        {
            List <CameraTransform> animKeyFrames = animation.keyframes;
            List <CameraTransform> currentCurve  = new List <CameraTransform>();

            curves = new List <BezierCurve>();

            // add extra handles
            if (animKeyFrames.Count > 2)
            {
                // split each node in a set of triplets
                currentCurve.Add(animKeyFrames[0]);

                // loop through all keyframes except first and last
                for (int i = 1; i < animKeyFrames.Count - 1; i++)
                {
                    Vector3    dir     = animKeyFrames[i + 1].Position - animKeyFrames[i - 1].Position;
                    Quaternion rotDiff = animKeyFrames[i + 1].Rotation - animKeyFrames[i - 1].Rotation;
                    float      fovDiff = animKeyFrames[i + 1].fovy ?? 1 - animKeyFrames[i - 1].fovy ?? 1;

                    float divisionFactor = 6;
                    float dist1          = Vector3.Distance(animKeyFrames[i + 1].Position, animKeyFrames[i].Position);
                    float dist2          = Vector3.Distance(animKeyFrames[i - 1].Position, animKeyFrames[i].Position);
                    if (Math.Min(dist1, dist2) / Math.Max(dist1, dist2) < .5f)
                    {
                        divisionFactor = 8;
                    }

                    CameraTransform handle1 = new CameraTransform(
                        animKeyFrames[i].Position - dir / divisionFactor,
                        // Quaternion.Lerp(keyframes[i - 1].Rotation, keyframes[i].Rotation, .5f)
                        animKeyFrames[i].Rotation - rotDiff * .25f,
                        animKeyFrames[i].fovy ?? 1 - fovDiff / divisionFactor
                        );
                    CameraTransform handle2 = new CameraTransform(
                        animKeyFrames[i].Position + dir / divisionFactor,
                        // Quaternion.Lerp(keyframes[i].Rotation, keyframes[i + 1].Rotation, .5f)
                        animKeyFrames[i].Rotation + rotDiff * .25f,
                        animKeyFrames[i].fovy ?? 1 + fovDiff / divisionFactor
                        );

                    currentCurve.Add(handle1);
                    currentCurve.Add(animKeyFrames[i]);
                    curves.Add(new BezierCurve(currentCurve));
                    currentCurve.Clear();
                    currentCurve.Add(animKeyFrames[i]);
                    currentCurve.Add(handle2);
                }

                // add the last keyframe
                currentCurve.Add(animKeyFrames[^ 1]);