FOREST BREATH森の呼吸
仕事の合間に、ちょっとだけ森へ行きたくなる日があります。
でも平日の夜に山へ行けるはずもないので、ブラウザの中に森を1つ作りました。
画像も動画も使っていません。HTML・CSS・JavaScriptのCanvasだけで、木も風も光も雪もその場で描いています。
四季・時刻・天気を切り替えられます。
森をクリックするとそこから風が吹き、時刻を早送りしたり、いまの季節と時刻に合わせたりもできます。
さらに下では、この森の中に入って3Dで歩き回れます。
ぼーっと眺めるだけでも大丈夫です。
FOREST BREATH森の呼吸
キー操作:Space 停止/1〜4 季節/← → 時刻/↑ ↓ 風/W 天気/G 突風/M 音/P 写真/N 別の森/F 全画面
森の楽しみ方
よく使うボタンは画面の下に、そのほかの操作は右下の「…」の中にまとめてあります。
右上に、いまの季節・時刻・天気が出ます。
- 四季:春は桜色の花びら、夏は濃い緑、秋は紅葉と落ち葉、冬は葉を落とした枝と雪です
- 時刻:朝霧 → 昼 → 夕暮れ → 夜。夜になると星と月が出て、木漏れ日は消えます
- 天気:晴れ・霧・雨・雷雨・雪。雨の日は空が灰色に寄り、足元にしぶきが上がります。雷雨では稲妻が走り、雪の日は春でも夏でも地面が白くなります
- 雨上がり:雨か雷雨から晴れに戻すと、昼のあいだだけ、太陽の反対側にしばらく虹が出ます
- 風:強くすると枝が大きくしなり、舞うものも速く流れます
- 音:風の音に加えて、昼は小鳥の声、夜は虫の音が混ざります。雨のときは雨音、雷雨では遅れて雷鳴が届きます。音量は「…」の中で変えられます
- 森をクリック(タップ):押した場所から突風が広がり、近い木から順にしなって、葉や花びらが舞い上がります
- マウスを動かす:手前の木ほど大きくずれて、奥行きが出ます
- 時の流れ:「手動」はスライダーで動かします。「早送り」は一日を3分でめぐり、「いまの時刻」はあなたの端末の日付と時刻から季節と時間帯を決めます
- 夜空:月は実際の月齢で満ち欠けし、右上に「三日月」「満月」などと出ます。よく晴れた夜には、ときどき流れ星が流れます
- 鹿:雨でない昼や夕方に、ときどき森を横切ります。途中で草を食べますが、近くで風を起こすと歩き出します
- 集中タイマー:25分の集中と5分の休憩をくり返し、切り替わりで鈴が鳴ります
- 写真を撮る・別の森にする:いまの画面をPNGで保存できます。「別の森にする」で木の並びが変わり、「最初の森」でいつもの森に戻ります
- 全画面:作業用の背景としてどうぞ。しばらくマウスを動かさないと、ボタンが消えます
- キー操作:森を一度クリックしてから、Spaceで一時停止、1〜4で季節、← →で時刻、↑ ↓で風、Wで天気、Gで突風が使えます
- 設定の記憶:季節・時刻・天気・風・音量・選んだ森は、このブラウザに保存され、次に開いたときもそのままです
時刻を右端まで動かすと、木々のあいだに蛍が点滅し始めます。
春・夏・秋の夜に出ます(秋は控えめで、冬と雨の日は出ません)。探してみてください。
森の中を歩く
上の森は眺めるための森でした。こちらは、中に入って歩ける森です。
一人称の3Dで、道を歩いたり、木立の奥へ分け入ったりできます。
森のどこかに、8つの見どころが隠れています。近づくと図鑑に記録され、左上の地図に印が付きます。
キー:WASD・矢印で移動/Shift 走る/Space ジャンプ/G 風/1〜4 季節/T 時刻/Y 天気/B 図鑑/M 音/Esc 視点の固定を外す
森の図鑑
EXPLORE THE FOREST
森を歩く
上の森の中へ、一人称で入ってみましょう。
森のどこかに、8つの見どころが隠れています。
PC:森をクリックすると視点が固定されます。WASDで歩き、マウスで見回します(Shiftで走る)。
スマホ:画面の左側で歩き、右側をなぞって見回します。
3D描画のライブラリ(Three.js 約670KB)は、ボタンを押したときに読み込みます。
- PCで歩く:森をクリックすると視点が固定されます。WASDか矢印キーで歩き、マウスで見回します。Shiftで走り、Spaceで跳びます。Escで固定が外れます
- スマホで歩く:画面の左側に指を置くとスティックが出ます。右側をなぞると見回せます。スティックを大きく倒すと走ります
- 地図と図鑑:左上の丸い地図は北が上です。図鑑には、まだ見つけていない場所のヒントが出ます
- 季節・時刻・天気:「設定」から切り替えられます。はじめて入るときは、上の森で選んでいた季節・時刻・天気に合わせます
- 夜の森:手元に明かりがともります。池のまわりでは蛍が光り、カエルが鳴きます
- 音:風・鳥・虫・雨の音に加えて、足音と焚き火の音が鳴ります。足音は雪の上や水の中で変わります
- 記録:見つけた見どころは、このブラウザに保存されます。次に来たときは続きから探せます
3D描画のライブラリ(Three.js)は、「森へ入る」を押したときに初めて読み込みます。ページを開いただけでは読み込みません。
この森のつくり
見た目重視で作ったので、しくみは簡単なメモだけにしておきます。
外部ライブラリは使っていません。
親の傾きを子に足すと、先の枝ほど揺れる
どの枝も自分の揺れは同じ大きさ。親の傾きを足していくので、先端に行くほど傾きが積み重なる。
※枝4段・1段あたりの揺れ最大6度とした説明用の例です。灰色の線は揺れていないときの位置です。
いちばん苦労したのは見た目より重さでした。
最初は1フレームごとに葉を約6,600回描いていて、確認用のブラウザでは1秒に1.5コマしか動きませんでした。
遠くの3列は揺れても数ピクセル以下で目に見えないため、1枚の画像にまとめて描くことにしました。
これで、季節や時刻を切り替えても60fpsを保てています。
- 森が画面の外にあるときは描画を止め、スクロール中の負荷を抑えています
- 時刻を早送りしているあいだも、遠くの3列と空の絵は、時刻が少し進んだときだけ描き直しています
- OSで「動きを減らす」設定をオンにしている人には、止まった状態で表示します
- iPhoneのSafariは要素の全画面表示に対応していないため、全画面ボタンは出ません
3Dの森のしくみ
- 木:数百本の木を、幹・円すい・球の3つの形の「インスタンス描画」でまとめて描いています。同じ形を位置と大きさだけ変えて一度に描くので、木が増えても描画の命令は増えません
- 風:揺れは頂点シェーダーで計算しています。根元からの高さの2乗に比例して横にずらすので、上の2Dの森と同じく、先のほうほど大きく揺れます
- 地面:周期の違う
sinを重ねた式で起伏を作っています。歩くたびに同じ式から足元の高さを求めるので、地面の形をデータとして持つ必要がありません - 当たり判定:森を10m四方のマス目に分けて木を登録し、自分のまわりのマスにある木だけを調べています
- 空:大きな球の内側に、上下のグラデーションと太陽の光をシェーダーで描いています。霧(
FogExp2)の色を地平線の色に合わせて、遠くの木を空になじませています

