• Products
  • Solutions
  • Made with Unity
  • Learning
  • Support & Services
  • Community
  • Asset Store
  • Get Unity

UNITY ACCOUNT

You need a Unity Account to shop in the Online and Asset Stores, participate in the Unity Community and manage your license portfolio. Login Create account
  • Blog
  • Forums
  • Answers
  • Evangelists
  • User Groups
  • Beta Program
  • Advisory Panel

Navigation

  • Home
  • Products
  • Solutions
  • Made with Unity
  • Learning
  • Support & Services
  • Community
    • Blog
    • Forums
    • Answers
    • Evangelists
    • User Groups
    • Beta Program
    • Advisory Panel

Unity account

You need a Unity Account to shop in the Online and Asset Stores, participate in the Unity Community and manage your license portfolio. Login Create account

Language

  • Chinese
  • Spanish
  • Japanese
  • Korean
  • Portuguese
  • Ask a question
  • Spaces
    • Default
    • Help Room
    • META
    • Moderators
    • Topics
    • Questions
    • Users
    • Badges
  • Home /
avatar image
0
Question by mori_flame · Aug 18, 2022 at 03:02 AM · animationkeyframereduction

Keyframe reduction in Rotation is not correct.

I am working on a script that does keyframe reduction for animations, but when I do the keyframe reduction with the following code, only the Rotation is not done correctly. To be exact, x is working, but some of the values for y and z seem to have changed. How can I modify the source code to do the key reduction for Rotation?

 using System.IO;
 using System.Linq;
 using UnityEngine;
 using UnityEditor;
 using System.Collections.Generic;
 using System;
 
 public class KeyReductionTest : AssetPostprocessor
 {
     [MenuItem("Assets/Key Reduction Test")]
     static void KeyReduction()
     {
         Debug.Log("Key Reduction Test...");
         foreach (UnityEngine.Object obj in Selection.GetFiltered(typeof(AnimationClip), SelectionMode.Editable))
         {
             string path = AssetDatabase.GetAssetPath(obj);
             AnimationClip anim_clip = (AnimationClip)AssetDatabase.LoadAssetAtPath(path, typeof(AnimationClip));
 
             foreach (var binding in AnimationUtility.GetCurveBindings(anim_clip).ToArray())
             {
                 AnimationCurve curve = AnimationUtility.GetEditorCurve(anim_clip, binding);
                 AnimationCurveKeyReduction(curve, binding.propertyName, 0.001f);
                 AnimationUtility.SetEditorCurve(anim_clip, binding, curve);
             }
             string anim_clip_name = Path.GetDirectoryName(path) + "/" + Path.GetFileNameWithoutExtension(path);
             WriteAnimationCurve(anim_clip, anim_clip_name);
         }
     }
 
     static private void WriteAnimationCurve(AnimationClip anim_clip, string anim_clip_name)
     {
         string tmp_name = anim_clip_name + "_tmp.anim";
         var copyClip = UnityEngine.Object.Instantiate(anim_clip);
         AssetDatabase.CreateAsset(copyClip, tmp_name);
         FileUtil.ReplaceFile(tmp_name, anim_clip_name + ".anim");
         AssetDatabase.DeleteAsset(tmp_name);
         AssetDatabase.Refresh();
     }
 
     static private float GetValueFromTime(Keyframe key1, Keyframe key2, float time)
     {
         float t;
         float a, b, c;
         float kd, vd;
 
         if (key1.outTangent == Mathf.Infinity) return key1.value;
 
         kd = key2.time - key1.time;
         vd = key2.value - key1.value;
         t = (time - key1.time) / kd;
 
         a = -2 * vd + kd * (key1.outTangent + key2.inTangent);
         b = 3 * vd - kd * (2 * key1.outTangent + key2.inTangent);
         c = kd * key1.outTangent;
 
         return key1.value + t * (t * (a * t + b) + c);
     }
 
     static private bool IsInterpolationValue(Keyframe key1, Keyframe key2, Keyframe comp, float eps)
     {
         var val1 = GetValueFromTime(key1, key2, comp.time);
 
         if (eps < System.Math.Abs(comp.value - val1)) return false;
 
         var time = key1.time + (comp.time - key1.time) * 0.5f;
         val1 = GetValueFromTime(key1, comp, time);
         var val2 = GetValueFromTime(key1, key2, time);
 
         return (System.Math.Abs(val2 - val1) <= eps) ? true : false;
     }
 
     static public IEnumerable<int> GetDeleteKeyIndex(Keyframe[] keys, float eps)
     {
         for (int s_idx = 0, i = 1; i < keys.Length - 1; i++)
         {
             if (IsInterpolationValue(keys[s_idx], keys[i + 1], keys[i], eps))
             {
                 yield return i;
             }
             else
             {
                 s_idx = i;
             }
         }
     }
 
     static public void AnimationCurveKeyReduction(AnimationCurve in_curve, string propertyName, float eps = 0.0001f)
     {
         if (in_curve.keys.Length <= 2) return;
         var del_indexes = GetDeleteKeyIndex(in_curve.keys, eps).ToArray();
         foreach (var del_idx in del_indexes.Reverse()) in_curve.RemoveKey(del_idx);
     }
 }

before key reduction: alt text after key reduction: alt text

rotation-before.png (153.6 kB)
rotation-after.png (159.5 kB)
Comment
Add comment
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users

0 Replies

· Add your reply
  • Sort: 

Your answer

Hint: You can notify a user about this post by typing @username

Up to 2 attachments (including images) can be used with a maximum of 524.3 kB each and 1.0 MB total.

Welcome to Unity Answers

If you’re new to Unity Answers, please check our User Guide to help you navigate through our website and refer to our FAQ for more information.

Before posting, make sure to check out our Knowledge Base for commonly asked Unity questions.

Check our Moderator Guidelines if you’re a new moderator and want to work together in an effort to improve Unity Answers and support our users.

Follow this Question

Answers Answers and Comments

329 People are following this question.

avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image

Related Questions

Unable to reduce keyframes / compress animations 1 Answer

texture "animation" sync with character problem [PAID] 0 Answers

Visbility keyframes in animation 1 Answer

Animation Keyframes Not Triggering? 0 Answers

How can I give variation to animation curve in Unity? (Raw mocap data) 0 Answers


Enterprise
Social Q&A

Social
Subscribe on YouTube social-youtube Follow on LinkedIn social-linkedin Follow on Twitter social-twitter Follow on Facebook social-facebook Follow on Instagram social-instagram

Footer

  • Purchase
    • Products
    • Subscription
    • Asset Store
    • Unity Gear
    • Resellers
  • Education
    • Students
    • Educators
    • Certification
    • Learn
    • Center of Excellence
  • Download
    • Unity
    • Beta Program
  • Unity Labs
    • Labs
    • Publications
  • Resources
    • Learn platform
    • Community
    • Documentation
    • Unity QA
    • FAQ
    • Services Status
    • Connect
  • About Unity
    • About Us
    • Blog
    • Events
    • Careers
    • Contact
    • Press
    • Partners
    • Affiliates
    • Security
Copyright © 2020 Unity Technologies
  • Legal
  • Privacy Policy
  • Cookies
  • Do Not Sell My Personal Information
  • Cookies Settings
"Unity", Unity logos, and other Unity trademarks are trademarks or registered trademarks of Unity Technologies or its affiliates in the U.S. and elsewhere (more info here). Other names or brands are trademarks of their respective owners.
  • Anonymous
  • Sign in
  • Create
  • Ask a question
  • Spaces
  • Default
  • Help Room
  • META
  • Moderators
  • Explore
  • Topics
  • Questions
  • Users
  • Badges