BeamNG.Earth
A 1:1 scale streamed Earth for BeamNG.drive: real elevation and satellite imagery, floating origin, LOD streaming from a companion server
翻譯準備中
尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證正在載入完整 README。 以下為已儲存的摘錄。
A browser-based voxel building sandbox (Minecraft-creative-mode-style) built with Three.js and vanilla JavaScript. Runs entirely client-side — no backend, no build-time asset pipeline beyond Vite. Works on desktop (mouse + keyboard, pointer lock) and mobile (touch joystick, drag-to-look, on-screen action buttons).檢視完整 README ↗A browser-based voxel building sandbox (Minecraft-creative-mode-style) built with Three.js and vanilla JavaScript. Runs entirely client-side — no backend, no build-time asset pipeline beyond Vite. Works on desktop (mouse + keyboard, pointer lock) and mobile (touch joystick, drag-to-look, on-screen action buttons).
npm install
npm run dev # dev server
npm run build # production build to dist/
npm run preview # serve the production build locally
On touch devices the left thumb drives a virtual joystick, the right side of the screen drags to look, and on-screen buttons handle break/place/fly/jump/down/symmetry.
src/world/ — chunked voxel data (World.js), terrain generation (TerrainGenerator.js), and an instanced-mesh renderer with exposed-face culling (ChunkMesher.js). No gamification or UI code lives here.src/player/ — first-person controller: WASD/mouse-look/touch input, gravity, AABB collision, fly mode.src/interaction/ — a 3D DDA voxel raycaster used for break/place targeting.src/tools/ — undo/redo stack, box selection + copy/paste, symmetry/mirror mode.src/gamification/GamificationEngine.js — XP/levels, achievements, daily challenges, streaks, unlockable blocks, and the end-of-session build score. Entirely decoupled from rendering; it only reads the world through its public query API.src/config/ — blocks.js, achievements.js, challenges.js: plain arrays of config objects. Add a new block/achievement/challenge by adding an entry, not by touching engine logic.src/storage/SaveManager.js — localStorage persistence (RLE-compressed chunk data) with named saves + autosave.src/ui/UIManager.js — hotbar, XP bar, toasts, stats/achievements panel, save/load menu, and touch controls, all DOM-based and driven by an event bus.src/render/Models.js — the animals', people's and vehicles' models: .glb files in public/models/, built in Blender by tools/mobs/ (see art/mobs/sheets/). Loaded at start; each view draws its old boxes until they're in.src/Game.js — wires everything together: scene/camera/renderer, the game loop, and the block-edit pipeline (apply → undo stack → chunk remesh → gamification hooks).Three tiers, deliberately, in increasing order of commitment:
localStorage. No
account, no network. This is the default and it always works.Export world writes a .voxworld.json carrying the blocks,
your progression, economy and every saved design — enough to restore the
world exactly, on any device. Export .vox writes MagicaVoxel format, which
opens in MagicaVoxel and Blender. Exports are the real backup: localStorage
is per-browser and a cleared cache takes it with it.A browser cannot safely talk to Postgres without a verifiable identity. Row level security has to key off something, and a device id the client makes up is not a something: anyone who guessed or copied one would read another player's worlds, with no way to revoke it and no way to recover it when the device dies. So sync is gated on signing in, and anonymous play stays entirely local. That is a deliberate trade, not an oversight.
authenticated role can reach
only rows that resolve to its own players row; the anonymous role has no
grants on any game table at all. Verified: querying as authenticated
without a matching identity returns zero rows from every table.SyncEngine hashes each chunk and uploads only the ones that changed, so
save cost tracks what you edited rather than how big the world is.VITE_NEON_URL in .env is the only setting, and Neon derives both the auth
service and the Data API from it. It is public by design — a URL grants nothing
on its own. On Vercel, set the same variable under Settings → Environment
Variables.
Note on history: this was first built against Neon's legacy Stack Auth integration, which turned out to be closed to new projects and shipped with email/password sign-in disabled and no way to enable it for a Neon-owned project. Managed Better Auth is the supported path, enables password sign-in by default, and needs one setting instead of three.
Deleting a world from the cloud soft-deletes the row (a mistaken tap is recoverable) and drops its chunks immediately, since those are the bulk of it. Your local copy is never touched by a cloud delete.
The box snaps to a grid of its own size on all three axes. That means the block under your crosshair is always inside the box, the box does not slide around as your aim drifts within a cell, and captured regions tile against each other and against chunks — which is what lets achievements reason about a template's dimensions at all. Its edges are drawn with depth testing off so the cage stays legible from inside a build, and the blocks it contains get a skin over their exposed faces, so what you see highlighted is exactly what a save would capture.