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
progressProperty
into the variablenumKeys
.
startValue = progressProperty. key (1) . value;
- This line stores the value of the first keyframe of
progressProperty
into the variablestartValue
.
endValue = progressProperty. key (numKeys) . value;
- This line stores the value of the last keyframe of
progressProperty
into 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
sliderValue
from 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
progressProperty
at a moment just beforetimeAtSlider
into the variableprevValue
.
nextValue = progressProperty. valueAtTime (timeAtSlider + 0.0001);
- This line stores the value of
progressProperty
at a moment just aftertimeAtSlider
into the variablenextValue
.
selectedValue = linear (sliderValue, 0, 100, startValue, endValue);
- This line calculates
selectedValue
by linearly interpolating betweenstartValue
andendValue
based on the value ofsliderValue
.
linear (sliderValue, 0, 100, prevValue, nextValue);
- The last line returns a value linearly interpolated between
prevValue
andnextValue
based onsliderValue
.
Credits
Studio: Good Friends
Senior Producer: Megan Flaherty
Animation: Woo Young Kim, Yeulhee Kim
Design: Chae Byungrok
Composition Design: Yeulhee Kim