p5.jsでアニメーションを作る時、『イラストをそのまま使いたい!』と思ったことはありませんか?
複雑なSVGパスでもp5.jsで綺麗に描画できる『関数』と、失敗しない素材選びのコツを解説します!
【前提】Vectorizer.AIの「魔法の設定」が使えなくなった話
「Vectorizer.AI」という神ツールがあり、そこには「ベジェ曲線をすべて細かい直線に変換して書き出す」という、マニアックだけど「p5.js」でイラストを描画するときにはとてもありがたい設定がありました。
プログラム側が「直線(L)」さえ知っていれば、複雑な絵も描けたんですが、 有料化(ダウンロード制限)により、気軽には使えなくなってしまいました😂
そこで、無料SVGベクター画像やアイコンを検索・ダウンロードできる「SVGRepo」から「お宝」を探して利用しようと思います。
p5.jsの関数を「不器用」から「万能」へ
Before:初期のシンプル関数(直線専用)
// 直線(MとL)しか描けない、初期のシンプル版
const drawSVGPath = (pathData) => {
const commands = pathData.match(/[a-df-zA-DF-Z][\d.,\s-]*/g);
beginShape();
for (let command of commands) {
const [cmd, ...params] = command.split(/[ ,]/).filter(Boolean);
const args = params.map(Number);
if (cmd === "M" || cmd === "L") { vertex(...args); }
else if (cmd === "Z" || cmd === "z") { endShape(CLOSE); }
}
};パワーアップ版関数(カーブ・相対座標対応)
// カーブも省略形もすべて解読できる!最強の完成版
const drawSVGPath = (pathData) => {
const commands = pathData.match(/[a-zA-Z][^a-zA-Z]*/g);
if (!commands) return;
let cx = 0, cy = 0;
let isFirstM = true;
for (let command of commands) {
const cmd = command[0];
const args = (command.slice(1).match(/-?\d*\.?\d+/g) || []).map(Number);
switch (cmd) {
case "M":
if (!isFirstM) endShape();
beginShape();
cx = args[0]; cy = args[1]; vertex(cx, cy);
isFirstM = false;
break;
case "m":
if (!isFirstM) endShape();
beginShape();
cx += args[0]; cy += args[1]; vertex(cx, cy);
isFirstM = false;
break;
case "L": cx = args[0]; cy = args[1]; vertex(cx, cy); break;
case "l": cx += args[0]; cy += args[1]; vertex(cx, cy); break;
case "H": cx = args[0]; vertex(cx, cy); break;
case "h": cx += args[0]; vertex(cx, cy); break;
case "V": cy = args[0]; vertex(cx, cy); break;
case "v": cy += args[0]; vertex(cx, cy); break;
case "C":
bezierVertex(args[0], args[1], args[2], args[3], args[4], args[5]);
cx = args[4]; cy = args[5]; break;
case "c":
bezierVertex(cx + args[0], cy + args[1], cx + args[2], cy + args[3], cx + args[4], cy + args[5]);
cx += args[4]; cy += args[5]; break;
case "Z": case "z": endShape(CLOSE); isFirstM = true; break;
}
}
endShape();
};「関数」の使い方ガイド
「新しい関数を入れたのに、線が表示されない!」「形がぐちゃぐちゃ……」
そんな時にチェックしてほしい、SVGの「3つの罠」があります。
<path>以外は「見えません」
SVGの中には、<circle>(円)や <rect>(四角形)といったタグで作られた図形もありますが、今回の関数は、<path d="…"> という「パスデータ」を読み取る専用の命令です。
対策: 素材を選ぶときは、中身が <path>タグで書かれているものを選びましょう。
💡 パーツが分かれている時の裏技
素材によっては、 タグがいくつも分かれていることがあります。
そんな時は、それぞれの d=" " の中身をコピーして、半角スペースを空けて一列に繋げてしまえばOK
例:const currentPath = "(パス1) (パス2) (パス3)";
関数がまだ知らない「マニアックなアルファベット」
今回、カーブ(C)を教えましたが、SVGの世界には他にもたくさんの「呪文」があります。
要注意コマンド: A(円弧)、S(滑らかなカーブ)、Q(二次ベジェ曲線)などが d="…" の中に混ざっていると、うまく描画できません。
対策: コードをチラ見して、「M, L, C, Z, V, H(とそれぞれの小文字)」以外のアルファベットが多用されていないか確認してみてください。
- 🟢 OKな文字:M, L, C, Z, V, H(小文字も含む)
- ❌ NGな文字:S, Q, T, A
座標の罠:お絵描きの「基準」がずれている
transform="translate(…)" という設定がSVG全体にかかっていると、プログラム上の座標と実際の表示位置がズレて、画面の外に描画されてしまうことがあります。
できるだけ「シンプルで余計な設定が入っていない」素材を選ぶのが、「お宝」を探し出す近道です。
🛠️ 失敗しないための「素材選び」3か条
-
1.
「Line」や「Outline」タイプを選ぶ
塗りつぶしタイプはパスが複雑になり、アニメーションが崩れやすいため、シンプルな線画を選びましょう。 -
2.
コードを開いて <path> がメインか確認する
<circle> や <rect> タグは今回紹介した関数では読み取れません。d=”…”属性を持つpathタグを探してください。 -
3.
複雑な呪文(アルファベット)がないか確認する
✅ OK: M, L, C, Z, V, H(直線と基本のカーブ)
❌ NG: S, Q, T, A(特殊な曲線)
d=”…” の中身をチラ見して、NG文字が多用されていないかチェック!
SVGRepoでコードを抜き出す手順
ダウンロードしたSVGの中身をブラウザだけで確認する「手抜き方法」をご紹介します。
まずは、高品質なアイコンが無料で手に入る SVGRepo(公式サイト) でお好みの素材を探しましょう。
💡 ブラウザだけでOK!パスデータの抜き出し手順
- 素材をダウンロード: SVGRepoで「Download SVG File」をクリックして保存。
- ブラウザに「ポイッ」: 保存したファイルを、ブラウザ(Chromeなど)のアドレスバーに直接ドラッグ&ドロップ!
- ソースを表示: 画像が表示されたら、右クリックで「ページのソースを表示」を選択。(ショートカット:Ctrl + U)
- お宝発見:
<path d="...">の d=” ” の中身だけをコピーして、p5.jsのコードに貼り付ければ完了です!
🌸 あわせて読みたいおすすめ記事
このページでも実装しているクローバーが舞うエフェクト。
難しい設定は一切不要、コピペだけでブログに雪や桜を降らせる「LINE風エフェクト」のやり方は、こちらの記事で解説しています。
