bauhausify美大出身の
WEBエンジニアリング奮闘記
CODING

p5.jsスケッチトレーニング -円弧の線を円周上に沿って動かす-

2019.09.11
p5.jsのarcと簡単なEasing式を使い、円弧の線を動かします。

今回はp5jsのトレーニングとして、arcと簡単なEaseOut関数を使ったコードを作りました。

このコードの要点のみ解説したいと思います。
最終的なコードはCodepenでご確認いただけます。

  1. arc関数で円弧を描く
  2. 描画する円弧の定義を、オブジェクトとして格納する
  3. 複数生成したいので配列に格納する
  4. Easingで動きをつける
  5. draw関数内で最終的な円弧を描く

arc関数で円弧を描く

一見複雑にみえますが、主な描画関数はarcです。

noFill(); // 塗りつぶしをなくします。
stroke(線の色);
strokeWeight(線の太さ);
arc(円弧の中心x座標, 円弧の中心y座標, 円弧の幅, 円弧の高さ, 円弧の開始角度, 円弧の終了角度);

描画する円弧の定義を、オブジェクトとして格納する

円弧の定義の内、動的に変えたい値を1つのオブジェクトに格納します。
動的に変えたいのは色、太さ、円弧の大きさ、円弧の長さです。
自動で様々な円弧を生成したいので、値の初期値にrandom関数を使い、オブジェクトを定義します。

{
  color: color(random(255), random(255), random(255)), // 線の色
  weight: random(1, 3), // 先の太さ
  arcWidth: random(50, width), // 円弧の幅と高さ、正円は幅と高さも同じなので幅のみ定義
  startDegree: random(360), // 円弧の開始角度
  arcLength: radians(random(30, 120)), // 円弧の長さを角度で定義、開始角度とると円弧の終了角度になる
}

複数生成したいので配列に格納する

for文を使い、好きな数の円弧の定義を生成し、arcsに格納します。

let arcs = [];

for(let i = 0; i < 30; i++) {
  arcs.push({
    color: color(random(255), random(255), random(255)),
    weight: random(1, 3),
    arcWidth: random(50, width),
    startDegree: random(360),
    arcLength: radians(random(30, 120)),
  })
}

Easingで動きの緩急をつける

Easing[イージング]に関しては、CodeGridさんの記事で詳しく解説されているのでわからない方はざっと見たほうがいいかもしれません。

ここでは、Processing内でサクッと書きたかったので、 こちらの記事の式が簡単だったので、引用させていただきました。

nowValue += (tagetValue - nowValue) * 0.05;

要は目的の値までの距離を均等に徐々に足していくという式です。
目的の値に近づくほど足す値が小さくなっていくので、EaseOut[イーズアウト]の形になります。

他にも、Robert Pennerさんのeasing関数など、様々なEasing関数があるようです。後日チャレンジしてみたいと思います。

そして、Easingの値を格納するために、円弧の定義に新たにdelayDegを追加します。
円弧は0から360の角度で指定するので、目標角度を360としdelayFinalDegに格納します。
上記のEasing式に当てはめると以下の様なコードになります。

const delayFinalDeg = 360;

// Easing部分の式
delayDeg += (delayFinalDeg - delayDeg) * 0.05;

delayDegは円弧ごとに変えたいので、先ほどのオブジェクトに追加します。

{
  color: color(random(255), random(255), random(255)),
  weight: random(1, 3),
  arcWidth: random(50, width),
  startDegree: random(360),
  arcLength: radians(random(30, 120)),
  delayDeg: random(360), // この行を追加
}

draw関数内で最終的な円弧を描く

最後に、p5jsのdraw関数内でcanvasの中心座標に円弧を描きます。
Easing値となるdelayDegは円弧の開始と終了座標にそれぞれ加算します。

arc(
  width/2,
  height/2,
  arcWidth,
  arcWidth,
  radians(delayDeg + startDegree) - arcLength,
  radians(delayDeg + startDegree),
);

delayDegが360まで到達(一回転する)したあと、再度ループして描画させたいので、360に近づいたタイミングで0に戻します。
今回使用したEasing式だと360に値に収束しますが、360になることはないので、-1した値とdelayDegを比較させます。

if (delayDeg > delayFinalDeg - 1) arcLine.delayDeg = 0;

以上のコードをp5jsのライフサイクル内に当てはめ、コードを完成させます。
最終的なコードはCodepenでご確認いただけます。

この記事を共有しよう!

前の記事
アトミックデザインはコンポーネント再利用の設計方法
次の記事
p5.jsを本番サイトで使う方法
関連記事
目次

エムロート [Mwrote]

多摩美術大学
プロダクトデザイン専攻卒業 ->
GUIデザイン会社勤務 ->
現在フロントエンジニア

My site ->
www.mwrote.com