lim jia sheng,

.Information Design

project[3]: Motion graphics


week[1]B: Motion graphics

What is motion graphics

TL;DR: Graphics in Movement.

It is formed by Composition + Animation.


Graphics + Typography.


Movement + Rhythm.

Creating motion graphics

  1. Write a script.
  2. Storyboard.
  3. Transform storyboard into designs.
  4. Animate designs.


A sequence of sketches to provide visual references for key scenes.

Creating a storyboard
  1. Previsualization
  • Visual script → breakdown (scenes + running times)
  • Example previsualization, n.d

    Figure 1.1.1, Example previsualization, n.d

  1. Create moodboard
  2. Organize inspiration & references


  • Find 3 motion graphic videos, along with a rationale.
  • Create a storyboard.
  • Create style frames.
  • Create an animatic.
  • Create the final animation.


Here's the 3 motion graphic projects I found:

Netflix and... #safe

Full project on Behance→

This was a great showcase of how style can carry a piece. There was no super complex illustrations, nor even a gradient in sight; it still shined using clever uses of different shapes & distinct colours. Their use of title cards to separate sections are also something to be taken away. Overall, pure eye candy, might be something ultra valuable as direction for the motion graphic.


Full project on Behance→

This video contrasts nicely with the previous — having tonnes of cheerful gradients, & detailed illustrations. My favourite parts was actually the animation style. It was snappy while being properly eased, creating that satisfying velocity without seeming lethargic in motion. Their clever mix of anthropomorphism with the clean direction made it the livelier as well. Overall, I don't need what they're selling but I'm sold.

Google In-Store Animations

Full project on Behance→

Google always has their ways with ultra simplicity & just the right amount of playfulness. In line with their new Material You design language, these animations use quirky shapes & colours to hit their point without requiring, basically any illustration. My favourite part was definitely the typographical movements — so many ways of moving letters in ways which stimulate the monkey brain of ours.



Diving head first, we started straight onto the storyboard. Our group of 6 (for now) was split into 2 subgroups, 4 people in the concept team & 2 in the storyboard team. The concept team were each assigned a few chunks of audio, whilst the storyboarders would draw sketches based on their textual descriptions. Not long after that, we had a semi-serviceable storyboard.

Very rough first storyboard, 7/1/2022

Figure 1.1.2, Very rough first storyboard, 7/1/2022

We were given feedback on the storyboard, of which we based our improvements upon:

Figure 1.1.3, Improved storyboard, 25/2/2022

It was here where you can also see, we started delegating illustration & animation tasks to each person, with 4 illustrators & 2 animators. Amount of work was determined through how well-versed the group member was in illustrating. At the same time to further accommodate them, a mentor/mentee system was put in place to help them out when needed as well.


Up next was to continue transforming the ideas into actual pictures on the screen. We had to find a style. Each of us would scour around & propose a style to move forward with.

Art style suggestions, 6/1/2022

Figure 1.1.4, Art style suggestions, 6/1/2022

At the end, we had a discussion & decided that we'd go with the 1st style, as it was simple & stylized enough that it would be pretty difficult to mess up. We did also consider the 4th suggestion, but the colours in that would serve to create problems for inexperienced illustrators, thus we decided against it.

Then, we needed a larger barrage of inspo, so we all went to collect similarly styled images from the web & dumped it all into one single moodboard.

Moodboard, 6/1/2022

Figure 1.1.5, Moodboard, 6/1/2022

This took a surprisingly long time, but we managed it eventually. Wrapping up this part of the journey is simply some standardization to try to keep consistency present throughout each member's style of illustration.

  • Colour palette
  • Illustration
    • Stroke width
      • 4px
    • Artboard
      • 1920x1080

Style frames

This was pretty straightforward, 3 out of the 4 members that were to be on the illustrative team were to create a few style frames to demonstrate their understanding of the style. This gave us more insight into how we could further tweak it, as well as correct any mistakes early on.

Figure 1.1.6, Styleframes, 8/1/2022

Pre-execution exercise

We were given a small practical exercise to prepare us. This was in the form of ai files that were to be animated. Here's mine:

Simple one, 18/1/2022

Figure 1.1.7, Simple one, 18/1/2022

Bit more complex one, 18/1/2022

Figure 1.1.8, Bit more complex one, 18/1/2022


We took all the assets we had created up until this point, going for finished frames & falling back to skecthes, dumped them into an After Effects composition & animated it — courtesy of Tress.

Refining & revamping illustrations

I was not originally tasked on this, but could help in getting it done. This was simply a process to try to correct any mistakes, like QC; if however, correction time would take longer than actually recreating a frame from scratch, that would be the task we took instead.

  • Frame 28 - 11g (3)
  • Frame 28 - 11b
  • Frame 28 - 11a

Figure 1.1.12, Few frames I was in charge of revamping, 10/2/2022

Pre-animation preparations

After Effects hates the human race, & thus its Illustrator import is atrocious. It will only split top-level layers into separate After Effects layers, whilst collapsing everything else (Groups, sub-level layers) into Groups inside Shape Layers.

While top level layers are easy to read in AE, it's not very manageable while working in AI to constantly keep them split up. Thus, to compromise, I wrote up a quick script to transform all 2nd level groups into top level layers, so both illustrators & people cleaning up the illustrators would have a much easier job working.

Figure 1.1.13, Script to move all second level groups to top level layers in Illustrator, 27/1/2022



After that detour, came actual animation. The first thing I worked on was charts with information on all three stats which were discussed in the voiceover — duration, effectiveness, price. This was a surprisingly challenging endeavour, as in order to get data to be properly displayed, math & automation needed to be set up. I spent a lot of time on this so I'm gonna ramble about it.

Raw frame of charts, 28/1/2022

Figure 1.1.14, Raw frame of charts, 28/1/2022

The project ended up with a sorta object-oriented model, with each bar having their own controller, which referred back to a top level controller.

Top level controller

This controller controlled constants such as the padding between the bars & their height scales. Other than that, it also housed values to be animated, such as the total number of columns, the current number of columns on screen, as well as the maximum value of the entire chart.

Properties of the top level controller, 28/1/2022

Figure 1.1.15, Properties of the top level controller, 28/1/2022

Per bar controller

This part of the project was definitely a point of over-engineering. These controllers were named a number (n = 0-6), & their subsequent controlled layers were named with a suffix of ::n. The controlled layers would then dynamically find their controller according to their name.

Unit of controller & controlled layers, 28/1/2022

Figure 1.1.16, Unit of controller & controlled layers, 28/1/2022

Why need a controller per layer, you may ask. Well, like any object-oriented... object, it contained all the properties & state of the controlled layers, so if one were to want to configure this unit, they'd only have to modify the properties there.

Properties of a per bar controller, 28/1/2022

Figure 1.1.17, Properties of a per bar controller, 28/1/2022

Here's where the cool part starts. You might notice some of the properties are collapsed, but that's intentional, as both the key & the value of the property lives in their name, separated by . This is possible thanks to the After Effects feature of propagating renames. In short, when you rename an effect in AE, it looks through every expression that refers to that effect & changes the reference in there as well to the updated name. Inside the expression then, it'll simply split the name prop of the layer & extract everything after the delimiter.

Why would I do this? Simply because AE has built in effect controls for number, boolean, colour, 2D vector, 3D vector, & enum values, but nothing for strings, which is kinda astounding. This gives me an easy way to bring together controls for what text would say, out of the layer into something more human digestible.


Mmm... you see how smooth the bars slide in the frame & how the bars resize with a different bezier easing. Both of these properties are controlled using one control, & thus in order to get these easings, I had to implement my own easing curves in my expressions. Fortunately this wasn't the first time I did something like this, but it was always super inefficient — the time required to render one frame would increase drastically, but CPU usage only stayed on one core, signifying that Javascript execution held things back.

I whipped out the code I had always used, comb through it, found out apparently I was recalculating every single bezier position every single time I'd ask for only one. Fixing that, I further realized that, I don't actually need to do any real computation in AE! I could just precalculate everything, dump it into an array, & simply use it as a lookup table.

Thus, I did.

Bar size & position implementing such lookup tables for easing, 28/1/2022

Figure 1.1.18, Bar size & position implementing such lookup tables for easing, 28/1/2022

Literally everything else

Literally everything else was mostly very boring, just transformations & easings. However, there were a few scenes & tidbits that were pretty fun.

Scaling without f*cking up stroke widths

The age old question. I have to admit, there are definitely places where I was too tired animating to care, but most extreme situations, stroke widths stays the same as things scale, move in the Z axis, & even as the camera zooms in & out.

  • Frame 26 - 9e (synthetic) (0-00-01-06)
  • Frame 26 - 9e (synthetic) (0-00-03-22)

Figure 1.1.21, Stroke width of hand staying same as the camera zooms out, 16/2/2022

This is thanks to this small little expression, applied onto every single "Stroke Width" prop on the shape layer with the figure:

Figure 1.1.22, Stroke width expression, 16/2/2022

I added a few explanations in the comments, which I hope makes it easier to understand what it's doing. Here are a few ways you could modify the expression to suite your needs:

  • If you don't have a Camera layer, you can replace the part where we get its Z position, with simply -2666.666666, this will only offset for the layer's Z position.
  • If your layer is simply a 2D layer, you can remove the entire chunk pertaining to camera distance & Z position.
Circular moving patterns

Who knew I would need to remember what the hell sine waves were outside of high school. I used Math.sin(time), with a half phase offset on the Y axis to get it spinning in a circle.

Example of frame with circular moving patterns, 16/2/2022

Figure 1.1.23, Example of frame with circular moving patterns, 16/2/2022

Expanding blobs

These would come as those satisfying expansions. I really like this technique because how much it abuses effects, using them completely wrongly. In short, the effect chain starts with a "Fill", & a "Glow", with the "Glow" configured to work 100% for the "Fill"'s colour. Then, a "Roughen Edges", with only its "Edge Sharpness" prop set to 1. Lastly, a "Vegas" to finally draw the stroke around everything.

Example of frame with expanding blobs, 16/2/2022

Figure 1.1.24, Example of frame with expanding blobs, 16/2/2022

It's that, imperfect, roundish look that I kind of dig. I could achieve a very similar look using "Offset Paths" in the shapes themselves, but where's the fun in that.

This stupid scene

This stupid scene, 17/2/2022

Figure 1.1.25, This stupid scene, 17/2/2022

Getting the charging head to align with the port

Trigonometry again??? Well honestly this was a pretty basic use case for it. First, a controller was created, which acted as the destination. I then took the difference for both source & destination X & Y axes, then passed it through Math.atan().

Rotation expression, 17/2/2022

Figure 1.1.26, Rotation expression, 17/2/2022

The OFFSET was just because the kind illustrator left the head rotated 26 degrees to the left.

Getting the path animations right

This ended up being a harder task than expected, since the path makes some drastic wonky movements. I first split it into Nulls that controlled each point's position. After animating that, I would have to manually correct each keyframe's tangents, since they would be misaligned. For every single point, & every single keyframe.

Keyframe hell, 17/2/2022

Figure 1.1.27, Keyframe hell, 17/2/2022



Doing SFX was a journey, not only because it was 3am, but also because I decided it was a great idea to use a trailer sound pack. Nothing too bombastic here though, I simply made sure I had fun by choosing all the moistest SFX & placing them in the least appropriate times possible.

SFX project file in FL Studio, 19/2/2022

Figure 1.1.28, SFX project file in FL Studio, 19/2/2022

Voiceover Mixing/Mastering

Hey, there's already a voiceover! Yes there is, this section is just how I decided to make it sound a little more pizzazzy, by adding compression & "air". You might not even be able to hear it, but trust me it sounds a lot clearer, especially needing to cut through all the sound effects.

  • image-20220222202437665
  • image-20220222202525059

Figure 1.1.31, Vocal & "air" chain respectfully

If you're laughing at how stupid my chain is though, please do let me know how it could be better! I'm super open to knowing.


Figure 1.2.1, Final animation, 21/2/2022


This was a doozie. There were definitely some points where things got tough, especially between the group people, but I think there really couldn't've been too much better of an outcome. We all worked together as best as we can, & compensated for each other where others fell short. Was it a tremendous learning experience? Definitely, requiring learning to trust when & where it requires it, as well as pacing oneself to ensure enough work was delegated instead of taken up all on oneself.

On the practical side, all the math was a pretty cool refresher, as well as the opportunity to explore even more of procedural animation (crossing into rigging almost?). That stroke width trick I've already stolen & modified multiple times across the project, giving me the inkling that I'll probably use it a lot more in the future. That bar chart rig is also pretty sick, definitely overengineered for this small use case, but I learnt a lot doing it, & I know there's definitely some potential there to expand the bezier generating thing into a script or extension.

At the end of the day, in practice it's still a simple 2D animated video that I would've had no problem doing, but adding on that group & engineering aspect, it definitely fulfilled its goal in getting something in my head. Watch out, whatever next animation I'll be a part of, you'll be the best I've ever made.