Laban Movement Analysis in Unity. In this project my aim was to transcribe the calculation for Laban Movement Analysis to C# and implement it in a Unity project. I have later used this code in a Virtual Reality application to create a motion controlled instrument where sound characteristic changes based on the expressiveness of users body movements.


My idea behind this implementation shares some similarities with one of my previous projects. In this case I am using tracking data received from Quest 2 (two controllers and HMD). I was not able to find any solutions for LMA in C# so I have made my own code for it from scratch. I based my implementation on the review contained in C. Larboulette and S. Gibet.

Laban Movement Analysis

LMA is a system used for interpreting and describing expressiveness of human movements. Movement is translated and analysed in the digital domain as a series of body joints changing its positions over time.

I have decided to include a selection of motion descriptors in my implementation. I have listed each of the descriptors that I have used together with a short explanation of the way each of them is calculated below.

Low level motion descriptors

  • Kinematic descriptors – dynamic quantities, directly derived from the motion
    • Velocity – rate of change of position for one joint
    • Acceleration – instantaneous acceleration of one joint
    • Jerk – rate of change of the acceleration, describes the smoothness of the movement of one joint
    • Curvature – measures how fast a curve representing the motion of one joint is changing its direction

High level motion descriptors

  • Effort descriptors – describe the quality of motion in terms of dynamics, energy and expressiveness
    • Weight Effort – refers to physical properties of the motion:
      Strong – powerful, vigorous
      Light – gentle, delicate, airy, sensitive
      Calculated as a maximum energy over a time interval where the energy is calculated as a sum of the kinetic energy of all the joints in a body. Lower values represent light movements, on the other hand the high values represent strong movements.
    • Time Effort – represents the urgency of the movement:
      Sudden – quick, urgent
      Sustained – steady, stretched over time
      Calculated as a sum of the acceleration of all the joints in a body over time. Higher values represent sudden movements, in contrast lower values – sustained.
    • Space Effort – refers to the directness of the movement:
      Direct – focused, toward a particular spot
      Indirect – flexible, multi-focused, wandering
      Calculated as the result of comparison between the traversed path and the shortest possible path of movement for each joint in a period of time. Direct movement is represented by higher values while indirect – by lower values.
    • Flow Effort – refers to the continuity of the movement:
      Free – fluid, released, continuous
      Bound – controlled, careful, restrained, hesitant
      Calculated as the aggregated jerk over time. Free flow is represented by lower values, consequently Bound Flow – by higher values.

My C# implementation is available on my GitHub in the form of a Unity project.


I have later used this code to create a motion controlled instrument in a Virtual Reality application. I have linked each effort with different aspects of sound generation. Calmer movements gave more mellow results, while the more aggressive and faster movements made the melody more lively and the sound timbre brighter.