Search Unity

  1. We are migrating the Unity Forums to Unity Discussions. On July 12, the Unity Forums will become read-only.

    Please, do not make any changes to your username or email addresses at id.unity.com during this transition time.

    It's still possible to reply to existing private message conversations during the migration, but any new replies you post will be missing after the main migration is complete. We'll do our best to migrate these messages in a follow-up step.

    On July 15, Unity Discussions will become read-only until July 18, when the new design and the migrated forum contents will go live.


    Read our full announcement for more information and let us know if you have any questions.

Exponential Moving Average of Quaternions

Discussion in 'Physics' started by twoski, Nov 29, 2014.

  1. twoski

    twoski

    Joined:
    Mar 27, 2014
    Posts:
    27
    Let's say i have a function that finds the exponential moving average of 2 given quaternions.

    I convert them to euler angles to make it easier to do maths with them.

    Example:
    Angle 1 is 0, 0, 10
    Angle 2 is 0, 0, 350

    If we just do (emaAlpha * Angle1 + ((1f - emaAlpha) * Angle2)) where emaAlpha is 0.2, we see that it results in the wrong angle. We want to go from 10 to 350 which is only a difference of 20 degrees, so we want to subtract from 10, not add to it.

    So i have been working on a function which properly handles this, however it doesn't seem to properly work.

    Code (csharp):
    1.  
    2. Vector3 AvgPos(Vector3 lastPos, Vector3 pos) //imagine pos is angle 1, lastPos is angle2
    3.     {
    4.         Vector3 init = (emaAlpha * pos + ((1f - emaAlpha) * lastPos)); //exponential moving average
    5.  
    6.         if (init == pos)
    7.         {
    8.             return init;
    9.         }
    10.  
    11.         Vector3 res = init;
    12.         Vector3 delta = pos - init;
    13.  
    14.         if (Mathf.Abs(pos.x - lastPos.x) > 180f)
    15.         {
    16.             res.x = pos.x - delta.x;
    17.         }
    18.  
    19.         if (Mathf.Abs(pos.y - lastPos.y) > 180f)
    20.         {
    21.             res.y = pos.y - delta.y;
    22.         }
    23.  
    24.         if (Mathf.Abs(pos.z - lastPos.z) > 180f)
    25.         {
    26.             res.z = pos.z - delta.z;
    27.         }
    28.  
    29.         res.x = res.x % 360f;
    30.         res.y = res.y % 360f;
    31.         res.z = res.z % 360f;
    32.  
    33.         return res;
    34.     }
    35.  
    Something is off, it makes my stuff rotate in the wrong direction. Any ideas?