🧱 ENGINE3D · 3D 场景标准件

A129 所有 3D 项目共用的运行时。它存在的唯一理由:同一段物理不许被抄写第二遍。

为什么有这个库(一次真实事故)

ROOMTEXT 手搓了一遍第一人称,前向量取 (sin yaw, cos yaw), 却把 MAPTEXT 的右向量 (cos yaw, −sin yaw) 抄了过来——两者正好差一个负号, 结果左右完全颠倒,主席一按就发现了。根因不是粗心,是同一段物理写了第二遍。 所以现在方向数学只有一份,而且带机器自检(见下)。

🔬 方向数学自检(页面加载即跑)

跑测中…

三个模块

文件管什么
mesher.js盒子/圆柱/球 → 合并成一个几何体;材质名→调色板;零件变换
fpcontrol.js第一人称(双摇杆+键鼠)、方向数学、分层碰撞世界、轨道视角
gameshell.js游戏态外壳:收面板、摇杆 DOM、准星、设置面板、本地存档

怎么用(三步)

import { MeshSet, B, C, makeTF } from '../engine3d/mesher.js';
import { FPControl, CollisionWorld, OrbitRig } from '../engine3d/fpcontrol.js';
import { GameShell, hideInGame } from '../engine3d/gameshell.js';

// ① 造几何
const set = new MeshSet();
set.add(B(0,0,0, 4,3,.2, 'wall'), palette);
set.attach(rootGroup);

// ② 造碰撞世界(分层:struct 永远挡,item 听开关)
const world = new CollisionWorld();
world.block('struct', {x,z,w,d,y0,y1});
world.ground('struct', {x,z,w,d,top});
world.setLayer('item', false);   // 家具可穿过

// ③ 第一人称
const fp = new FPControl(canvas, { world, sticks: shell.sticks });
fp.attach(); ... fp.update(dt); fp.applyToCamera(camera);

分层碰撞(主席点名要的开关)

struct = 墙/地板/楼梯/栏杆,永远挡得住;item = 家具摆设, world.setLayer('item', false) 就能直接穿过去。层名随便加,不止两层。

🎮 右边就是用这个库跑的样例

一个 12×9 米的房间:四面墙(struct)+ 中间四张桌子(item)。点下面按钮走进去, 亲手试「左右到底对不对」和「碰撞开关」。

桌面:WASD/方向键走,按住鼠标拖动转视角。手机:左半屏走,右半屏转视角。