街區漫遊STREET ROAMING 3D

一條馬路、兩側大樓、可跳躍快跑的主角。全部用 three.js 在單一 HTML 檔案裡手工建模, 沒有任何外部資源,打開就能玩。

畫面

快跑中的街道
快跑:FOV 放大、鏡頭拉遠、身體前傾、視野收束
跳躍滯空
跳躍:起跳預壓、空中姿態、落地壓縮與煙塵環
手機橫屏
手機橫屏:左半虛擬搖桿、右半拖曳轉視角、右下跳躍鈕

玩法與操作

電腦

WASD/方向鍵移動 Space 跳躍
按住 Shift 快跑 拖曳畫面轉視角

手機(建議橫屏)

左半螢幕虛擬搖桿移動 右半螢幕拖曳轉視角
右下角 ↑ 跳躍 搖桿推到底即快跑

目標

沿著街道撿滿 6 顆水晶。水晶有垂直光柱,遠處也看得到。

技術重點

幾何按材質合併 → InstancedMesh

一棟樓數十個 mesh,先按材質合併成少量 geometry,再用 InstancedMesh 一次畫完 26 棟, 手機也能順跑。

四肢重新掛樞軸

模型原始座標是「根空間絕對座標」,repivot() 把子物件搬到肩/髖樞軸, 才能用 rotation.x 擺動走路。

相機相對移動

右向量由 F × U 推導:(-cos y, 0, sin y)。 寫成 (cos y, -sin y) 會讓 A/D 左右顛倒。

快跑手感

不是只調速度:FOV 52→59、鏡頭拉遠、身體前傾 0.16 rad、步頻擺幅加大、 外加邊緣視野收束。

跳躍手感

0.15 秒指令緩衝、起跳預壓、空中姿態混合、落地壓縮與煙塵環; 空中操控降到 45%。

單檔自包含

three.js 與兩份模型原始碼全部內嵌,交付檔零外部 src/href, 離線也能開。

從原始碼建置

遊戲成品是產物,真正的架構在 src/。建置腳本會把模板與兩份模型原始碼 組裝成單一 HTML,可逐位元組複現倉庫中的 game/街區漫遊.html。

python src/build_game.py
# built: 667551 bytes -> game/街區漫遊.html
檔案說明
src/game_tpl.html遊戲模板:世界搭建、輸入、移動、碰撞、相機、HUD
src/char_code.js主角模型建構(頭/髮/軀幹/四肢,全部程式化建模)
src/bld_code.js大樓模型建構(立面、窗帶、雨遮格柵、植栽)
src/build_game.py建置腳本:剝殼 → 切場景 → 注入模板
tools/check_*.py無頭瀏覽器自動驗證(移動、跳躍、快跑、碰撞、版面)
tools/shot_*.py無頭截圖
tools/serve_mobile.py區網伺服器,讓手機連進來實機測試
refs/設計參考圖

製作方式

角色與大樓都不是手工拉的,也不是載入現成模型檔 —— 它們都是以開源專案 img2threejs 建成的程式碼。

🔧 img2threejs · Apache-2.0

「參考圖 → 程序化 Three.js 模型」的建構管線。先分析參考圖、寫出 sculpt spec, 再一階一階產出可執行的建模程式碼,並用截圖與參考圖反覆比對修正。
github.com/img2threejs/img2threejs

🤖 DeepSeek 4.1 Flash

模型程式碼大部分由此生成 —— 包含角色與大樓的幾何結構、材質參數與配色, 以及為對齊參考圖所做的逐輪修正。

🧰 WorkBuddy

整體專案在此製作:參考圖分析、模型建構與校對、遊戲邏輯開發、 無頭瀏覽器自動驗證與截圖比對、發布。

另外使用 three.js r149(MIT)作為渲染引擎。