Lotte New Year Greeting & Season Visual
Problem-Solving: Dragon Body

In this project, the precise depiction of the dragon's movement was crucial. I'll detail my approach in expressing its dynamic motion, the challenges encountered, and the solutions applied to bring this majestic creature to life.
- Usual Solution’s Problems

The echo effect is a popular solution for patterned object animation. However, the effect affects the main object’s speed. Therefore Dragon Body stretches or shrinks depending on its speed

Time Remapping of lineal speed animation is also popular. However, secondary animations, such as hair, mouth, and whiskers, move fast or slow along to body movement speed.
- Expression Solution
Applied this script to a body pattern and duplicated the layer, then automatically the duplicated body pattern will located at the location value of Head

sliderValue = thisComp. layer ("Position Controller") .effect("Control Slider") ("Slider") ;
-
This line stores the value of the "Slider" from the "Control Slider" effect in a layer named "Position Controller" within the current composition (
thisComp) into the variablesliderValue.
progressProperty = thisComp. layer ("Trace_Body_Null") .effect ("Trace Path") ("Progress')
-
This line stores the "Progress" property from the "Trace Path" effect in the "Trace_Body_Null" layer into the variable
progressProperty.
numKeys = progressProperty. numKeys;
- This line stores the total number of keyframes set in
progressPropertyinto the variablenumKeys.
startValue = progressProperty. key (1) . value;
- This line stores the value of the first keyframe of
progressPropertyinto the variablestartValue.
endValue = progressProperty. key (numKeys) . value;
- This line stores the value of the last keyframe of
progressPropertyinto the variableendValue.
timeAtSlider = linear (sliderValue, 0, 100, progressProperty. key (1). time + framesToTime (165) - framesToTime ( (index-1) ×3) , progressProperty. key (numKeys) . time + framesToTime (165) - framesToTime ( (index-1) *3) ) ;
-
This line calculates a corresponding time based on converting the
sliderValuefrom 0 to 100. This time is based on the times between the first and last keyframes ofprogressProperty.
prevValue = progressProperty. valueAtTime (timeAtslider - 0.0001);
- This line stores the value of
progressPropertyat a moment just beforetimeAtSliderinto the variableprevValue.
nextValue = progressProperty. valueAtTime (timeAtSlider + 0.0001);
- This line stores the value of
progressPropertyat a moment just aftertimeAtSliderinto the variablenextValue.
selectedValue = linear (sliderValue, 0, 100, startValue, endValue);
- This line calculates
selectedValueby linearly interpolating betweenstartValueandendValuebased on the value ofsliderValue.
linear (sliderValue, 0, 100, prevValue, nextValue);
- The last line returns a value linearly interpolated between
prevValueandnextValuebased onsliderValue.
Credits
Studio: Good Friends
Animation: Woo Young Kim, Yeulhee Kim
Design: Chae Byungrok
Composition Design: Yeulhee Kim