推しアイデア
買い物につきあう「待ち時間」を、スーパーならではの商品を利用してゲームをする「遊び時間」に変えること
買い物につきあう「待ち時間」を、スーパーならではの商品を利用してゲームをする「遊び時間」に変えること
親の買い物に付き合う時間は退屈。その時間を楽しめるよう、店にあるモノを認識してバトルするゲームにした。
Three.js の 3D をカメラ映像に重ねて AR にし、敵の出現には物体認識(YOLOv8n)を使用した。親子の位置は Supabase Realtime で共有し、50m 離れると「脱出」、10m 以内に戻ると親の端末から「復活の鍵」が自動で届く。

スーパーをダンジョンに見立てて遊ぶ スマホ向けWeb ARゲーム です。 カメラに食材を映すと3Dの敵が出てきて、魔法で倒すとアイテムを落とします。親子で遊ぶ想定で、子どもが親から離れすぎると「脱出」扱いになる見守り機能も付いています。
子供にとってスーパーでの買い物は退屈で、飽きると走り回ったり、親から離れて迷子になったりしがち。そこで、買い物そのものを遊びに変えれば、子供も楽しく付いて来られると考えた。さらに、親から離れすぎるとダンジョンから追い出される仕組みにし、遊びながら自然と親のそばにいられるようにした。

画面(スタート画面、ダンジョン入口、バトルHUD、親子の画面)と状態管理
カメラ映像に 3D の敵を重ねる。WebXR がない iPhone Safari でも動くよう、端末の向きセンサーでカメラを回す
本物のバナナを映すと敵が出現。ブラウザの中で推論し、カメラ映像を外部に送らない
親子の位置を Supabase Realtime で共有。データベースには保存しない
親子の距離を計算し、「脱出」と「復活」を判定 15m以上の距離差 => 「脱出」状態(ゲームできない) => 親にも知らせがきている 1m以内の距離 => 復活判定 (復活のカギを入手) => ゲーム可能に!!
距離と位置の算出はGeolocation APIでお互いの緯度・経度を入手してsupabaseに一時保存する(3秒ごとに値を算出) 一時保存された緯度・経度をHaversine公式をもとに距離を算出


読み込み精度の詳細について

person : 人のこと(もし人がカメラに写っていもそれ以外のものを認識して3Dキャラを作成できるために学習済みの配列に入れた)
banana : 実行中のyoloのしきい値を.060を超えたら3Dオブジェクトthree.jsのキャンバスに描画 spawnEnemie !== nullのときはyoloを物体認識をストップしています。 そして敵を倒す => ドロップアイテムを入手の裏でもyoloをキャッシュから呼び出して物体認識を再稼働するような仕組みにしてます。
起動時の読み込みで平均して600 ~ 800msかかっていたのでUXとして悪いな~と思った。 山西先生の「神の一言」によってチュートリアルステージをyolo等の本番環境に必要なツールなしでつくってユーザーの待ち時間をなくす そして裏で非同期処理で読み込み処理を走らせてUXの向上をしました
話し合い履歴↓ https://docs.google.com/document/d/1pDoyN4_cIO84QhV9NP8gAhrdfsx79s6AuyFDLjLazO0/edit?usp=sharing

チームワーク 今回のチームは、チーム開発が右も左もわからない初学者2人と経験豊富なハッカソン常連客1人で開発しました。 Githubを教えてもらい、main、develop、featureを使用して機能ごとにbranchを切って作業をしました。issueをGithub上であげ、各メンバーが何をやっているのか明確化しました。 今まで適当なチーム開発しかしてこなかったので、大変学びになるハッカソンでした!