メインコンテンツまでスキップ

2. Layout

p5.jsとの違い

この資料では、次のWebサイトに掲載されているアニメーションを参考にした作例を掲載する。

このうち、一つめのWebサイトは、p5.jsを使ったアニメーションを実装している。たとえば、イージングという章には、次のようなコードが載せられている。ここでlerp()は、引数a, b, tを受け取ってa + (b - a) * tを返す、線形補間をするための関数である。

let prevR, nextR, d, t;

function setup() {
createCanvas(windowWidth, windowHeight);

d = 200;
reset();
}

function reset() {
prevR = d;
nextR = random(20, 400);
t = 0;
}

function draw() {
t += 0.01;

// イージング後の余韻を持たせるため、すぐにはリセットしない
if (t >= 1.4) {
reset();
return;
}

// t = 1.0 でイージング終了なので、t > 1.0 の場合は画面を更新しない
if (t > 1.0) {
return;
}

clear();
d = lerp(prevR, nextR, easeInOutBack(t));
circle(width / 2, height / 2, d);
}

function easeInOutBack(t) {
const c1 = 1.70158;
const c2 = c1 * 1.525;

return t < 0.5 ? (pow(2 * t, 2) * ((c2 + 1) * 2 * t - c2)) / 2 : (pow(2 * t - 2, 2) * ((c2 + 1) * (t * 2 - 2) + c2) + 2) / 2;
}

p5.jsは、アニメーションループのなかでdraw()が繰り返し呼び出され、Canvas要素を更新することで描画をおこなう仕組みになっている。一方で、Remotionにおいては、これと同じようなアニメーションループが存在しないため、RemotionのCompositionに渡されるReactコンポーネントでは、副作用がある書き方はできない点に注意が必要だ。

この点に気をつけながら、上のコードをRemotion向けに書き直すと、たとえば、次のように書けるだろう。

0:00 / 0:08

繰り返す・並べる

Remotionでアニメーションを実装する際には、上の例のように、適当な粒度のアニメーションごとにコンポーネントを切り分けるようにすると扱いやすい。そうして用意したコンポーネントをフレームに応じて出し分けるには、Sequenceや、SeriesTransitionSeriesを使うことができる。

一方で、同じようなアニメーションを繰り返したい場合には、次の例のように、Loopを使うのが便利だ。

0:00 / 0:08

ちなみに、Remotionで描画する要素はSVGでなくてもかまわない。JSXとして描画できるものであれば大抵のものは描画できるので、もちろん、ふつうのdiv要素を並べることもできる。

0:00 / 0:08

重ねる・ずらす

JSX(HTML)なので、コードとして下に書かれている要素ほど、上に重なるように描画される。

0:00 / 0:08

mix-blend-modeを使うと、重なり方に変化を付けることができて面白い。また、よくある小ワザとして、要素の位置に応じて、ぼかしをかけたり、アニメーションの量に強弱を付けたりすると、遠近感を出すことができる。

0:00 / 0:08