Files
Genarrative/docs/technical/MATCH3D_RUNTIME_3D_GEOMETRY_EXPERIMENT_2026-05-02.md
五香丸子 a18f4db4bb
Some checks failed
CI / verify (push) Has been cancelled
feat: add match3d 3d runtime experiment
2026-05-02 23:01:48 +08:00

3.6 KiB

抓大鹅运行态 3D 几何体实验 2026-05-02

1. 实验目标

本轮只验证抓大鹅运行态把可消除物从 2D 纯色几何图案切换为 3D 几何体后的可读性、点击手感和堆叠碰撞观感。

3D 表现层必须满足:

  1. 圆形图案映射为球体。
  2. 方形图案映射为方块。
  3. 三角形、菱形、五角星、六边形、胶囊、心形、梯形、平行四边形等现有视觉键映射为近似 3D 几何体。
  4. 物体在圆形空间内保持边界约束,并使用物理模拟产生轻微碰撞、堆叠、晃动效果。
  5. 点击、备选栏、消除、胜负判定仍使用当前后端权威快照与前端即时反馈协议,不把规则真相迁到前端。

2. 回退要求

这是一次可取消实验,不替换现有 2D 方案。

  1. 现有 Match3DVisualIconMatch3DToken 和托盘 2D 图案渲染代码必须保留。
  2. 新增 3D 表现层只作为运行态棋盘的可选渲染分支。
  3. 当浏览器不支持 WebGL、3D 依赖加载失败或实验开关关闭时,运行态必须自动回到现有 2D 图案表现。
  4. 托盘继续使用当前 2D 图标,便于玩家识别已选物品,也便于实验失败时快速回滚。

3. 工程落点

本轮只改前端表现层:

src/components/match3d-runtime/Match3DPhysicsBoard.tsx
src/components/match3d-runtime/Match3DRuntimeShell.tsx
src/components/match3d-runtime/Match3DRuntimeShell.test.tsx
src/components/match3d-runtime/match3dRuntimePresentation.ts
src/components/match3d-runtime/match3dVisualAssets.tsx

新增依赖:

three
cannon-es
@types/three

3D 棋盘默认启用;需要快速回到当前 2D demo 表现时,在运行态 URL 上追加任一参数:

?match3dRender=2d
?match3d3d=off

3D 分支只读取后端快照中的物品坐标、层级、可点击状态和视觉键。物理碰撞、轻微堆叠和几何体姿态只作为前端表现层,不改变消除规则、备选栏规则、胜负判定或最终权威快照。

match3dVisualAssets.tsx 保留 2D 纯色几何图案映射,运行态托盘继续使用该 2D 图标;match3dRuntimePresentation.ts 收口显示层坐标和状态兼容,避免异常旧坐标把 2D 或 3D 物体推到圆形边界外。

4. 验收口径

  1. /match3d 能打开并默认看到 3D 几何体棋盘。
  2. 3D 几何体保持在圆形区域内,不被圆形边界裁切到不可点。
  3. 物体进入场景后有轻微物理碰撞和堆叠稳定过程。
  4. 点击 3D 物体后仍执行原有乐观入槽、后端确认、三消反馈和结算。
  5. 单元测试仍覆盖 2D 回退图案,确保回退路径没有被删除。
  6. 390px 移动端与桌面端均不能出现横向溢出,顶部状态、圆形棋盘和 7 格备选栏都要完整可见。

5. 锅型容器优化

2026-05-02 追加一轮 3D 表现优化,把运行态圆形空间明确解释为一口有固定深度和确定边界的锅。

编码口径:

  1. 相机改为俯视角,玩家优先看到锅内物体的平面分布、遮挡关系和向上堆叠。
  2. 3D 场景里的圆形区域拆成锅底、锅壁和锅沿三层视觉结构,锅壁有固定高度,锅沿明确标出边界。
  3. 物理世界使用同一个锅内半径作为水平活动边界,所有可消除物体的初始位置和运行中位置都必须被约束在圆形锅内。
  4. 物体受到重力后只允许在锅内碰撞、滑动、翻滚和向上堆叠,不能因为碰撞或初始坐标散落到圆形区域外。
  5. 该优化仍只属于前端 3D 表现层,不改变后端运行态坐标、点击权威判定、备选栏、消除和胜负规则。