「もちほっぺ・メーカー」を公開しました! — 好きすぎて作ってしまった話

こんにちは、saba です。
聞いてください。作ってしまいました。
トリッカル もちもちほっぺ大作戦 というゲームがありまして。……あの、キャラのほっぺをぐにーっと引っぱって、ぱっと離すと ぷるんっ と戻る、あの手触り。あれが好きすぎて、気づいたら「自分の好きな画像で、あれをやりたい」という欲求が抑えられなくなり——Web おもちゃにして公開しました。
その名も もちほっぺ・メーカー。
▶ ブラウザですぐ遊べます → あそび場のもちほっぺ・メーカー 好きな画像を入れて、ほっぺを塗って、引っぱるだけ。インストール不要です。

どんなおもちゃ?
遊び方はたった 3 ステップです。
- いれる — 好きな画像をドロップ / ファイル選択 / ペースト(サンプルもあります)
- ぬる — もちもちにしたいところ(=ほっぺ)をブラシで塗る
- あそぶ — つまんで引っぱって、離すと ぷるんっ
引っぱるほど「もちっ」と抵抗が増して、フリックしながら離すと勢いよく揺れます。スマホなら両ほっぺ同時づかみも。遊んでる様子は動画(WebM)や GIF で保存してシェアもできます。
“ぷるん” の正体はバネ物理
いちばんのこだわりは、当然あの手触りです。「引っぱる → 離す → ぷるんっと戻る」をバネの物理シミュレーションで実装しました。
指でつまんだ点をバネで引っぱり、離すと戻ろうとする力+揺り戻し(減衰しながら振動)が働く——という、いわゆるダンパー付きバネです。やわらかさ・のびる量・ゆれ具合は設定でいじれるようにしていて、この係数をちょっと変えるだけで「こんにゃく」から「つきたての餅」まで手触りが激変します。ここの調整が沼で、一番時間を溶かしました。
物理は src/physics/ に spring(バネ)と pinchSystem(つまみ)として分離してあります。設定値で挙動が変わるので、「気持ちいい」を数字で探る作業でした。まさにゲーム UX。
描画はエンジンに頼らず、自前の WebGL メッシュ変形
画像をぐにゃっと歪ませる部分は、画像をメッシュ(格子)に貼って、つままれた頂点を動かして変形しています。これを ゲームエンジンもフレームワークも使わず、素の WebGL で自前実装しました。
- 画像をテクスチャとしてメッシュに貼る
- ほっぺに塗ったマスクの範囲だけが変形するように重み付け
- バネ物理で動いた頂点座標を毎フレーム GPU に渡して描画
「ライブラリに頼らず手触りを 1 から作る」のがやりたかったので、シェーダーもメッシュ生成も自分で書いています。……正直けっこう大変でしたが、そのぶん挙動を隅々までコントロールできました。
塗った場所だけがもちもちする理由
全体が歪むと「ただ画像が伸びてるだけ」になってつまらない。塗った範囲(ほっぺ)だけがもちもちして、それ以外は固定されるからこそ「ほっぺをつまんでる」感が出ます。
そこでマスクの仕組みを入れました。ブラシで塗った領域を別キャンバスに記録し、その濃さを変形の重みに使っています。スマホでは二本指で拡大・回転しながら細かく塗れるように、マルチタッチ対応も入れました。
技術スタック(軽量です)
- Vite + TypeScript — ビルドはこれだけ
- 素の WebGL — 描画・メッシュ変形・シェーダーは自前
- 外部ライブラリは
gifenc1 個だけ — GIF 書き出し用。しかも Web Worker で動かして、エンコード中も UI が固まらないようにしています - 録画は WebM が
MediaRecorder、GIF が上記 worker
「軽く・依存を増やさず・手触りは妥協しない」を意識しました。ソースは公開しているので、WebGL のメッシュ変形やバネ物理に興味がある人は覗いてみてください → GitHub - saba383810/moti_hoppe_maker
まとめ
- 好きなゲームの「ほっぺぷるん」が好きすぎて、Web おもちゃにしました
- “ぷるん” はダンパー付きバネ物理、描画は自前 WebGL メッシュ変形、塗った所だけ変形するマスク付き
- 依存ライブラリは GIF 用の 1 個だけ、GIF は Web Worker でエンコード
作ってる間、ずっとほっぺを引っぱって笑ってました。開発というより遊びでした。ぜひ好きな画像で、あの手触りを味わってみてください。
ではでは!

