写真 → インタラクティブデスクトップペット
写真を1枚放り込むだけで、画面を歩き回るピクセルアートのデスクトップコンパニオンが手に入ります——すべてあなたのマシン上で生成され、クラウドの画像モデルは使いません。
デスクトップアプリ(v1.46)は、写真——あなたの猫、子どもの絵、ぬいぐるみ——を、アニメーションする常時最前面のデスクトップペットに変えます。パイプライン全体がローカルです:背景除去、ピクセルアート変換、スプライトシートのベイクはすべてduduclaw-petsクレート内で実行され、外部API呼び出しはゼロです。ペットは小さな透明ウィンドウに住み、アイドルアニメーションを再生し、自律的にデスクトップを歩き回り、エージェントのアクティビティに反応します。
生成パイプライン
Section titled “生成パイプライン”photo → EXIF orientation fix → background removal → RGBA cutout → pixel quantization → 8×9 spritesheet bake → pet pack on disk- 背景除去(
segmentation.rs):BiRefNet-general-lite(プライマリ)またはsilueta(低リソースフォールバック)によるローカルONNX推論で、onnxフィーチャーの背後にあります。PassthroughRemoverは常に利用可能です——「背景はもう切り抜いてある」フローを支え、モデルが1つもインストールされていなくても生成が動くことを保証します。モデルは~/.duduclaw/models/(GGUFストアと共有)に置かれ、オンデマンドでダウンロードされます。ビルド時には決してダウンロードされません。スマホ写真にはEXIFのOrientationタグが適用されるため、縦向き写真が横倒しで届くことはありません。 - ピクセル量子化(
pixelate.rs):最近傍法で幅64ピクセルの正準グリッドへ縮小し、ハードなアルファしきい値を適用し(ピクセルアートのエッジは硬いので)、median-cut色量子化で16色パレットへ——結果は縮小された写真ではなく、限定パレットのスプライトとして見えます。 - スプライトシートのベイク(
sprite_bake.rs):単一のスプライトを、決定論的な幾何変換(scale / translate / flip / shear)のみを使って、8列×9行のアニメーションフレームのグリッドに変換します——描画モデルは使いません。行はopenpets / Codex Petsのレイアウト(idle, running-right, running-left, waving, jumping, failed, waiting, running, review)に従い、フレームセルは192×208なので、ベイクされたシートはそのままそのエコシステムに投入できます。
パックは~/.duduclaw/pets/<slug>/に、pet.jsonマニフェスト(Codex Petsのスーパーセット)とともに置かれます。元の写真はそのまま保持される(source.png)ため、後で再アップロードなしにペットを再生成できます。
2つのペットモード
Section titled “2つのペットモード”| モード | ソース | アニメーション |
|---|---|---|
procedural |
背景除去済みのカットアウト1枚 | WAAPIキーフレーム+単一画像上の手製スプリング |
sprite |
ベイク済み8×9スプライトシート | <canvas>上での状態別フレームステッピング、最近傍スケーリング |
proceduralパスがP0フロー(高速、どんな写真でも動く)、spriteパスがピクセルアートフローです。どちらも同じランタイムと同じインタラクション状態機械で駆動されます。
mascot_window.rsは2つ目のTauriウィンドウを構築します:透明、ボーダーレス、常時最前面、タスクバーをスキップ、基準サイズ180論理px、トレイで切り替えるまで非表示。macOSではウィンドウ自身のドロップシャドウを無効化しています——そうしないと、透明で装飾なしのウィンドウでも境界を縁取る矩形の影が描かれてしまいます。これがユーザーから報告された「ペットの周りの箱」でした。ペット自身のピクセルだけが見える状態になります。
徘徊エンジン
Section titled “徘徊エンジン”アイドル中、PetRuntime.tsxは定期的に重み付きランダムで行動を選びます:
- 左へ歩く / 右へ歩く —
petMoveBy経由で本物のウィンドウをデスクトップ上で移動させ、画面端で反対方向へ跳ね返ります。 - 休憩(座り込む)、手を振る、ジャンプ — 時間制のその場アニメーション。
インタラクションやエージェントシグナルは、徘徊を即座に中断します:すべての行動は動作前にライブ状態を再チェックするため、歩行の途中でも押下やドラッグが優先されます。すべての自律的な動きはprefers-reduced-motionでゲートされ、行動の選択時にチェックされるため、設定のライブ変更は即座に反映されます。Tauriの外(通常のブラウザ)では、歩行はウィンドウ移動なしのその場アニメーションにデグレードします。
インタラクション
Section titled “インタラクション”- ドラッグ — ジェスチャーです(mousedown+4 px超の移動でネイティブウィンドウドラッグを開始)。意図的に
data-tauri-drag-regionを使いません。これにより、単純なクリックはクリックとして認識されます(Tauri #9751/#9901)。離すと落下アニメーションが再生されます。 - クリック — リアクションアニメーション。60秒間インタラクションがないと、ペットは居眠りします。
- 右クリック — ネイティブコンテキストメニュー。「スタジオを開く」(メインウィンドウをペットスタジオへ遷移)やサイズ選択を含みます。
- スケール — 小 / 標準 / 大(180 px基準の50% / 100% / 150%)。ホストがリサイズするのはウィンドウで、ペットはビューポートに追従するため、スケーリングで不可視のフレームが育つことはありません。
エージェントシグナル
Section titled “エージェントシグナル”ペットはステータスサーフェスも兼ねます。エージェントシグナル(working / notify / idle)がペットの状態を切り替えます:workingはビジーアニメーションを再生し、notifyはユーザーが閉じられるプラカードを掲げます(新しい項目が届くと再アーム)。承認待ちが最初のライブ配線です——未処理の承認リクエストがnotifyプラカードを掲げます。working用のライブなエージェントステータスフィードが、次に予定されているフックです。
ペットスタジオ
Section titled “ペットスタジオ”ダッシュボードのペットスタジオは、生成済みの全パック(名前、モード、アクティブフラグ)を一覧し、新しい写真からの生成、アクティブペットの選択、パックの削除ができます。スタジオとオーバーレイは、同じ薄いTauriコマンドレイヤー(pet_gen.rs)と対話します。アクティブペットが切り替わるとpet://changedイベントが全ウィンドウにブロードキャストされるため、オーバーレイは再起動なしで再取得します。
| 項目 | 値 |
|---|---|
| ピクセルグリッド幅 | 64 px(正準) |
| パレット | 16色(median-cut) |
| スプライトシート | 8列 × 9行、192×208 pxセル |
| 生成中のクラウド呼び出し | なし |
| 背景除去モデル | BiRefNet-lite / silueta(オプション)、passthroughは常時利用可 |