本ページはプロモーションが含まれています

ギャラリー

Canvasアニメーションで風に揺れる森を作る

CATEGORY
REV.
DRAWN BY
TOM
SHEETS
3枚
Forest(風に揺れる森)

トム

SESで約8年、環境を変えられないもどかしさの中にいました。32歳で自社開発企業に転職し、今はClaude Codeと自動化で、仕事も時間も組み直している途中です。
・Javaバックエンドエンジニア(Java歴12年以上)
・資格:基本情報技術者/応用情報技術者/Java Silver/Python3エンジニア認定基礎
詳細なプロフィール

𝕏

FOREST BREATH森の呼吸

仕事の合間に、ちょっとだけ森へ行きたくなる日があります。

でも平日の夜に山へ行けるはずもないので、ブラウザの中に森を1つ作りました。

画像も動画も使っていません。HTML・CSS・JavaScriptのCanvasだけで、木も風も光も雪もその場で描いています。

四季・時刻・天気を切り替えられます。

森をクリックするとそこから風が吹き、時刻を早送りしたり、いまの季節と時刻に合わせたりもできます。

さらに下では、この森の中に入って3Dで歩き回れます。

ぼーっと眺めるだけでも大丈夫です。

FOREST BREATH森の呼吸

森の楽しみ方

よく使うボタンは画面の下に、そのほかの操作は右下の「…」の中にまとめてあります。

右上に、いまの季節・時刻・天気が出ます。

  • 四季:春は桜色の花びら、夏は濃い緑、秋は紅葉と落ち葉、冬は葉を落とした枝と雪です
  • 時刻:朝霧 → 昼 → 夕暮れ → 夜。夜になると星と月が出て、木漏れ日は消えます
  • 天気:晴れ・霧・雨・雷雨・雪。雨の日は空が灰色に寄り、足元にしぶきが上がります。雷雨では稲妻が走り、雪の日は春でも夏でも地面が白くなります
  • 雨上がり:雨か雷雨から晴れに戻すと、昼のあいだだけ、太陽の反対側にしばらく虹が出ます
  • 風:強くすると枝が大きくしなり、舞うものも速く流れます
  • 音:風の音に加えて、昼は小鳥の声、夜は虫の音が混ざります。雨のときは雨音、雷雨では遅れて雷鳴が届きます。音量は「…」の中で変えられます
  • 森をクリック(タップ):押した場所から突風が広がり、近い木から順にしなって、葉や花びらが舞い上がります
  • マウスを動かす:手前の木ほど大きくずれて、奥行きが出ます
  • 時の流れ:「手動」はスライダーで動かします。「早送り」は一日を3分でめぐり、「いまの時刻」はあなたの端末の日付と時刻から季節と時間帯を決めます
  • 夜空:月は実際の月齢で満ち欠けし、右上に「三日月」「満月」などと出ます。よく晴れた夜には、ときどき流れ星が流れます
  • 鹿:雨でない昼や夕方に、ときどき森を横切ります。途中で草を食べますが、近くで風を起こすと歩き出します
  • 集中タイマー:25分の集中と5分の休憩をくり返し、切り替わりで鈴が鳴ります
  • 写真を撮る・別の森にする:いまの画面をPNGで保存できます。「別の森にする」で木の並びが変わり、「最初の森」でいつもの森に戻ります
  • 全画面:作業用の背景としてどうぞ。しばらくマウスを動かさないと、ボタンが消えます
  • キー操作:森を一度クリックしてから、Spaceで一時停止、1〜4で季節、← →で時刻、↑ ↓で風、Wで天気、Gで突風が使えます
  • 設定の記憶:季節・時刻・天気・風・音量・選んだ森は、このブラウザに保存され、次に開いたときもそのままです
いちばん好きなのは、夏の夜です。

時刻を右端まで動かすと、木々のあいだに蛍が点滅し始めます。

春・夏・秋の夜に出ます(秋は控えめで、冬と雨の日は出ません)。探してみてください。

森の中を歩く

上の森は眺めるための森でした。こちらは、中に入って歩ける森です。

一人称の3Dで、道を歩いたり、木立の奥へ分け入ったりできます。

森のどこかに、8つの見どころが隠れています。近づくと図鑑に記録され、左上の地図に印が付きます。

EXPLORE THE FOREST

森を歩く

上の森の中へ、一人称で入ってみましょう。
森のどこかに、8つの見どころが隠れています。

PC:森をクリックすると視点が固定されます。WASDで歩き、マウスで見回します(Shiftで走る)。
スマホ:画面の左側で歩き、右側をなぞって見回します。

3D描画のライブラリ(Three.js 約670KB)は、ボタンを押したときに読み込みます。

  • PCで歩く:森をクリックすると視点が固定されます。WASDか矢印キーで歩き、マウスで見回します。Shiftで走り、Spaceで跳びます。Escで固定が外れます
  • スマホで歩く:画面の左側に指を置くとスティックが出ます。右側をなぞると見回せます。スティックを大きく倒すと走ります
  • 地図と図鑑:左上の丸い地図は北が上です。図鑑には、まだ見つけていない場所のヒントが出ます
  • 季節・時刻・天気:「設定」から切り替えられます。はじめて入るときは、上の森で選んでいた季節・時刻・天気に合わせます
  • 夜の森:手元に明かりがともります。池のまわりでは蛍が光り、カエルが鳴きます
  • 音:風・鳥・虫・雨の音に加えて、足音と焚き火の音が鳴ります。足音は雪の上や水の中で変わります
  • 記録:見つけた見どころは、このブラウザに保存されます。次に来たときは続きから探せます

3D描画のライブラリ(Three.js)は、「森へ入る」を押したときに初めて読み込みます。ページを開いただけでは読み込みません。

この森のつくり

見た目重視で作ったので、しくみは簡単なメモだけにしておきます。

外部ライブラリは使っていません。

見えているものしくみ
木再帰関数で枝を2〜3本ずつ分けて生やしています。シード付きの乱数なので、いつ開いても同じ森です
四季葉の色・地面の色・落ちるものを季節ごとに差し替えます。冬は広葉樹の葉を85%落とし、枝の上側に雪の線を重ねます
時刻朝・昼・夕暮れ・夜の4つの配色を用意し、スライダーの位置で隣どうしを混ぜています
風に揺れる枝親の枝の傾きを子に足していくので、先の枝ほど大きく揺れます
突風周期の違うsinを3つ重ね、画面の左から右へ少し遅れて伝わります
霧と奥行き遠くの木ほど霞の色に近づけています(空気遠近法)。霧の日は濃さが1.5倍になります
蛍春・夏・秋の夜(雨と冬を除く。秋は光が控えめ)に、40匹がlighter合成で明滅します
鳥昼のあいだだけ、2本の曲線を羽ばたかせながら横切ります
音Web Audio APIで合成しています。風はブラウンノイズ、小鳥と虫は正弦波と矩形波、雨は高い側を通したノイズ、雷鳴は低い側だけを残したノイズを3秒ほどかけて減衰させています
クリックの突風押した位置から波が広がる計算で、木までの距離が遠いほど遅れて弱く届きます。揺れの大きさは「立ち上がってから減っていく」形の関数で決めています
時の流れ一日を0〜4の数で持ち、夜の次は夜明けをはさんで朝に戻します。いまの時刻モードでは、時計の時刻をこの数に変換しています
月の満ち欠け基準の新月の日時からの経過日数を、朔望月(約29.53日)で割った余りで月齢を出し、明るい側と影の境目を楕円で描いています
雷と虹雷雨では数秒おきに折れ線の稲妻と画面全体の光を出します。雨から晴れに戻すと、7色の弧を約1分かけて出して消します
鹿楕円と線だけで描いています。「待つ」「歩く」「草を食べる」の3つの状態を切り替えています
写真いまのキャンバスを別のキャンバスに写して文字を入れ、toBlobでPNGにして保存しています
設定の記憶localStorageに保存しています。保存できない設定のブラウザでは、毎回最初の状態から始まります

いちばん苦労したのは見た目より重さでした。

最初は1フレームごとに葉を約6,600回描いていて、確認用のブラウザでは1秒に1.5コマしか動きませんでした。

遠くの3列は揺れても数ピクセル以下で目に見えないため、1枚の画像にまとめて描くことにしました。

これで、季節や時刻を切り替えても60fpsを保てています。

  • 森が画面の外にあるときは描画を止め、スクロール中の負荷を抑えています
  • 時刻を早送りしているあいだも、遠くの3列と空の絵は、時刻が少し進んだときだけ描き直しています
  • OSで「動きを減らす」設定をオンにしている人には、止まった状態で表示します
  • iPhoneのSafariは要素の全画面表示に対応していないため、全画面ボタンは出ません

3Dの森のしくみ

  • 木:数百本の木を、幹・円すい・球の3つの形の「インスタンス描画」でまとめて描いています。同じ形を位置と大きさだけ変えて一度に描くので、木が増えても描画の命令は増えません
  • 風:揺れは頂点シェーダーで計算しています。根元からの高さの2乗に比例して横にずらすので、上の2Dの森と同じく、先のほうほど大きく揺れます
  • 地面:周期の違うsinを重ねた式で起伏を作っています。歩くたびに同じ式から足元の高さを求めるので、地面の形をデータとして持つ必要がありません
  • 当たり判定:森を10m四方のマス目に分けて木を登録し、自分のまわりのマスにある木だけを調べています
  • 空:大きな球の内側に、上下のグラデーションと太陽の光をシェーダーで描いています。霧(FogExp2)の色を地平線の色に合わせて、遠くの木を空になじませています
NEXT READ本棚から1本

AIで開発を組み直すなら、まずこの5冊から

入門・実践・設計まで、Claude Codeの本をレベル別に5冊選んで比べました。

→ おすすめ5冊を見る

  • この記事を書いた人
  • 最新記事

トム

SESで約8年、環境を変えられないもどかしさの中にいました。32歳で自社開発企業に転職し、今はClaude Codeと自動化で、仕事も時間も組み直している途中です。
・Javaバックエンドエンジニア(Java歴12年以上)
・資格:基本情報技術者/応用情報技術者/Java Silver/Python3エンジニア認定基礎
詳細なプロフィール

𝕏

ギャラリー