Skip to content

Repository files navigation

魔法花園瑜珈闖關

面向國小學童的繁體中文網頁體感遊戲。玩家在攝影機前模仿引導卡上的瑜珈姿勢;姿勢分數達到該關門檻並連續保持指定時間後,即可進入下一關。完成全部關卡後,可把成績寫入這台瀏覽器的本機排行榜。

攝影機影像、MediaPipe 身體/手部/臉部追蹤結果與姿勢分數只在目前的瀏覽器分頁內處理:不錄影、不上傳、不需要帳號,也沒有後端服務。

本專案是獨立的 Vite + React + TypeScript 應用程式。姿勢追蹤與 VRM 互動概念參考 SystemAnimatorOnline / XR Animator,沒有複製其介面、美術、音效或原始碼。

遊戲畫面

準備畫面

玩家可以在開始前確認 VRM 魔法夥伴、攝影機取景與全身入鏡狀態。

魔法花園瑜珈闖關準備畫面

闖關畫面

闖關介面會顯示姿勢示範、動作說明、關卡計時與連續保持進度。

魔法花園瑜珈闖關遊戲畫面,顯示山式姿勢卡與充能進度

目前功能

  • MediaPipe Pose Landmarker 在 Web Worker 中執行,最多辨識兩人並阻止多人狀態累積進度。
  • 額外的 MediaPipe Hand/Face Landmarker 在獨立 Worker 中帶動 VRM 手腕、手指、眨眼與嘴型;手腕使用完整 3D 掌面 quaternion,沿最短旋轉路徑平滑追蹤,持續的 180° 翻掌也能完整到達。
  • @pixiv/three-vrm 載入 VRM,準備畫面會即時帶動人物的軀幹、手臂、腿、腳掌、手指與模型已提供的表情。
  • 準備與闖關畫面以 VRM 魔法夥伴為主視覺,鏡像攝影機縮成浮動小視窗;桌機闖關時位於右下角。身體骨架、雙手 21 點與臉部輪廓 overlay 只提供視覺回饋,其中手/臉資料完全不參與瑜珈分數或保持計時。
  • 內建山式、樹式、戰士二式、椅子式、星星式;關卡數量由 game.json 決定。
  • 每關可以獨立設定通過分數與保持秒數;未設定時使用全域預設值。
  • 3D 關節角度、相對位置、距離比例、左右鏡像、EMA 平滑與 500 ms 追蹤寬限。
  • 倒數、有效時間計時、進度光環、提示、跳過、音效、粒子與轉場動畫。
  • 本機前十名排行榜;同名只保留最快成績,跳過任何一關則該局不列入排行榜。
  • 攝影機拒絕、模型載入失敗、多人、全身未入鏡與關鍵點遮擋提示。
  • 高/低畫質、靜音與作業系統「減少動態效果」支援。

快速開始

需要 Node.js 20.19 以上版本(建議使用目前維護中的 Node.js LTS)與 pnpm 11。

pnpm install
pnpm dev

在開發電腦開啟 http://localhost:5173/。Vite 已設定監聽 0.0.0.0,同一區域網路的其他電腦可使用開發機的 IPv4 位址連線,例如 http://192.168.1.20:5173/。遠端電腦的攝影機通常仍需要 HTTPS 或受控瀏覽器測試設定,詳見建置與執行

修改程式後的基本檢查:

pnpm typecheck
pnpm test
pnpm build

預覽正式建置:

pnpm preview

預覽伺服器監聽 0.0.0.0:4173vite preview 只用來驗收建置結果,不應當作正式對外伺服器。

文件

文件 內容
文件索引 依工作情境選擇文件
建置與執行 Windows、Node.js、pnpm、0.0.0.0、LAN、HTTPS、正式建置與部署
GitHub Pages 部署 公開網址、Actions 自動部署、子路徑、攝影機權限與發布檢查
開發指南 架構、身體/手/臉資料流、狀態機、測試、poseDebugavatarDebug
設定檔手冊 game.json 完整欄位、每關門檻、顯示追蹤、評分規則、換圖/模型與新增關卡
維護手冊 依賴與模型更新、姿勢校準、排行榜、隱私、手/臉排錯與發行檢查表
第三方授權 套件、參考專案、原創 VRM 與美術素材說明

最常修改的設定

所有遊戲參數集中在 public/config/game.json。例如:

{
  "challengeId": "magic-garden-yoga-dev",
  "avatar": {
    "modelPath": "/models/magic-garden-guide.vrm",
    "scale": 1,
    "cameraDistance": 2.8,
    "mirrored": true
  },
  "timing": {
    "defaultHoldSeconds": 3,
    "trackingGraceMs": 500
  },
  "poseDetection": {
    "scoreThreshold": 75
  },
  "avatarTracking": {
    "enabled": true,
    "maxInferenceFps": 10,
    "lowQualityMaxInferenceFps": 6,
    "initializationTimeoutMs": 120000,
    "smoothing": 0.38,
    "lostHoldMs": 250,
    "relaxMs": 300,
    "hands": {
      "enabled": true,
      "modelPath": "https://storage.googleapis.com/mediapipe-models/hand_landmarker/hand_landmarker/float16/1/hand_landmarker.task",
      "roiScale": 1.6,
      "handednessSwap": false,
      "wristRotationEnabled": true,
      "fingerSpreadInfluence": 1,
      "fingerSpreadMaxDegrees": 28
    },
    "face": {
      "enabled": true,
      "modelPath": "https://storage.googleapis.com/mediapipe-models/face_landmarker/face_landmarker/float16/1/face_landmarker.task"
    }
  },
  "poses": [
    {
      "id": "mountain",
      "scoreThreshold": 75,
      "holdSeconds": 3
    }
  ]
}

上例只摘錄相關欄位,不能直接取代完整設定檔。

  • poses[].scoreThreshold 是該關專用門檻,範圍為 0–100。
  • 省略 poses[].scoreThreshold 時,才使用 poseDetection.scoreThreshold
  • poses[].holdSeconds 會覆蓋 timing.defaultHoldSeconds
  • avatar.mirrored 只水平翻轉 VRM 畫面,不交換骨骼或改變評分。
  • avatarTracking 是選用的顯示同步功能;可整體關閉,或只關閉 handsface。載入或推論失敗只會顯示提醒,不會阻止身體姿勢闖關。
  • wristRotationEnabled 只控制是否套用手腕追蹤。手腕沒有最終姿勢角度上限或幅度衰減;完整掌面 quaternion 會沿最短路徑、依來源時間做速度平滑,因此短暫跳點不會瞬間翻腕,持續朝向則仍會完整到達。
  • fingerSpreadInfluence 調整食指到小指的張指幅度,fingerSpreadMaxDegrees 設定這四指相對模型休息姿勢的最大張指角。拇指不使用強度倍率:MediaPipe 的 1→2、2→3、3→4 三段有號掌面局部方向會逐節解算到 VRM 父子骨。詳細檢查順序見設定檔手冊
  • 手腕直接由 Hand Landmarker 的 raw world landmarks 建立掌面方向;拇指則使用以手腕為原點、掌寬正規化並平滑後的 world landmarks。拇指不依賴指尖距離、掌心吸附或角度 cone,避免握拳時被錯誤拉到手背;來源 timestamp 與 render quaternion 平滑則用來抑制靜止抖動。這些處理只影響人物顯示,不參與瑜珈分數。
  • 公開版預設從 Google 的固定版網址下載 Hand/Face 模型,並從釘選版本的 unpkg 下載 MediaPipe WASM,以避開 GitHub Pages 大檔速度限制;只有靜態程式與模型被下載,攝影機影像與 landmark 不會送出瀏覽器。校內或離線環境可把兩個 modelPath 改回 /models/hand_landmarker.task/models/face_landmarker.task,並把 wasmPath 改回 /mediapipe/wasm
  • poses[].allowMirrored 才決定評分器是否接受左右相反的做法。
  • challengeId 是本機排行榜的儲存分區。目前開發版沿用 magic-garden-yoga-dev;啟動時只保留目前 ID 的榜單,並刪除同遊戲前綴的其他舊榜單。要重置目前榜單時直接刪除對應 Local Storage,不需要為每次調整建立新 ID。

校正姿勢時使用:

http://localhost:5173/?poseDebug=1

畫面會顯示本關通過門檻與每條規則的即時分數。如何判讀分數與調整容錯值,請見設定檔手冊

只驗收 VRM 手指與表情、但不依賴真人手/臉追蹤資料時,可開啟:

http://localhost:5173/?avatarDebug=1

此模式會合成循環的彎指、眨眼、張嘴與微笑資料;只要 VRM 載入成功,即使沒有攝影機也可按「開始冒險」,用來檢查闖關頁的主要 VRM、右下角小攝影機與 responsive 版面。這個例外只解除顯示驗收時的開始條件,不會停用或改寫 Pose Tracker;沒有真人 PoseFrame 時不能驗證姿勢分數、保持進度或實際 overlay 對位。合成的手/臉資料也不會改變分數或排行榜。正式真人驗收仍須關閉此參數,實際測試全身姿勢、雙手、臉部光線及追蹤效能。

支援範圍

  • 桌面版最新版 Chrome 與 Edge。
  • 單一玩家、全身清楚入鏡、鏡頭距離約兩公尺。
  • 手指同步需要雙手在畫面內、手指輪廓清楚;臉部同步需要正面或接近正面的臉與足夠光線。
  • VRM 缺少標準手指骨或對應表情預設時,只會略過該動畫,身體動作與闖關仍可使用。
  • localhost 或 HTTPS 執行;請勿直接雙擊 index.html
  • 這是活動遊戲,不是醫療、復健、運動處方或安全診斷工具。

3D 引導模型

public/models/magic-garden-guide.vrm 是魔法花園的 3D 引導角色,作者為 NHRI。模型會隨公開 GitHub 專案及 GitHub Pages 網站一併發布。

預計公開網站為 https://root50643.github.io/magic-garden-yoga/。部署前請依照 GitHub Pages 部署手冊 完成 Actions、Pages 與攝影機驗收;在工作流程實際執行成功前,該網址不代表已上線。

About

結合 MediaPipe 姿勢辨識與 VRM 即時動作追蹤的兒童瑜珈闖關遊戲

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages