# 纽约城（8192³）

A full rendition of New York City, fully accurate, dense, and to scale — 8192³ 网格、1 米一格（水平与竖直一致），静态城市 + 动态角色。
地理、地标、街区全部凭记忆写进生成器（`src/`），不联网、不用外部数据文件；Node 标准库 + 固定种子，结果确定。

打开 `index.html`（需用 HTTP 服务，例如 `python3 -m http.server --bind 127.0.0.1`）。

## 取景

- 画布 8192 × 8192 米，**整体逆时针旋转 22.5°**（画布“北”指向真北偏西 22.5°），参考点第五大道 / 59 街（40.7644 N, 73.9727 W），
  画布左边 = 参考系东向坐标 −7471 m，上边 = 北向坐标 +1200 m（`src/frame.mjs`）。
- 为什么旋转：沿曼哈顿街道网格方向（真北偏东 29°），从总督岛南端到中央公园南段约 9.3 km，放不进 8.19 km。把这条线放到画布对角线上，
  在 −21.5°…−22.5° 之间搜索（脚本思路见 WORKLOG），同时满足：总督岛全岛、布鲁克林高地到大西洋大道、DUMBO、两座大桥、
  泽西城 Morris Canal 与交换广场、霍博肯到 14 街、中央公园 59 街到羊草坪 / 贝塞斯达台地 / 弓桥（湖的南端）。
- 代价：曼哈顿网格与体素轴成 51.5°，建筑立面是 1 米台阶状；查看器用“立面图案纹理”把每条外露竖向条带画成一个四边形，台阶立面也不贵。
- **自由女神像不在画幅内**：它在总督岛以西约 2.5 km，与中央公园、总督岛三者无法同时放进 8.19 km 方框（差约 1 km）。
- 画幅内还包括：下东区、东村、格林威治村、苏豪、翠贝卡、金融区、炮台公园城、中城、哈德逊园区、地狱厨房、默里山、
  联合国、长岛市南部、绿点、威廉斯堡、海军造船厂、布鲁克林市中心、泽西城高地、罗斯福岛南端、威廉斯堡大桥。

## 重建

```bash
node --max-old-space-size=6000 src/gen.mjs        # 地图 → 建筑 → 7 个 worker 线程逐块生成 → data/（约 3.5 分钟，主进程峰值 ~2.3 GB）
node --max-old-space-size=4000 src/life.mjs       # 动态角色路径 → life/actors.json（约 30 秒）
node checks/shoot.mjs --views overview,downtown --out checks   # 无头 Chrome 截图 + 控制台检查（需要 puppeteer）
```

生成流程：`maps.mjs`（陆地 / 水深 / 地形 / 街道车道线 / 公园）→ 地标占地 → `fabric.mjs`（街区 → 地块 → 建筑表）→ `trees.mjs` →
`worker.mjs`（每 512×512 块：逐列组合地形、建筑、地标 / 桥梁 / 树的列段，精确统计体素，写 LOD0 / LOD1 瓦片与 LOD2/3 半成品）→
`gen.mjs` 组装 LOD2、全局 LOD3、再降采样 LOD4，写 `data/manifest.json`、`data/places.json`。

## 数据格式

所有瓦片是 gzip 压缩的 **NYT1 列区间瓦片**（`js/tilecodec.js`，生成器和查看器共用同一份编解码）：

- 每块 (n+2)×(n+2) 列（n = 256，外加 1 列邻块边框，便于独立做面剔除），行按 z、列按 x。
- 每列是若干实心段 `[y0, y1)` + 材质号（`manifest.palette` 的 1-based 序号，0 = 空气不存）。
- 头 40 字节：`"NYT1"`、lod、版本、列宽（米）、tx、tz、n、段数、ymin、ymax、三个流的字节数；之后是四个流：每列段数（varint）、
  段间隙（varint）、段长（varint）、材质（u8）。
- LOD0：1 米列，1024 块（256 m）；LOD1：2 米列、竖向 1 米；LOD2：4 米列、竖向 2 米；LOD3：8 米列、竖向 4 米；LOD4：16 米列、竖向 8 米（4 块，四叉树根）。
  降采样规则：2×2 列逐米投票，3–4 实心 → 实心；2 实心且含窗玻璃 / 树叶 / 招牌 → 实心（远景保住立面和树冠）；1 实心只保留尖顶 / 主缆。
- **无损完整模型** = 全部 LOD0 瓦片。页面“下载 → 静态模型”在浏览器里把 1024 块打包成一个文件：
  `"NYC8192M"`（8 字节）+ u32 版本 + u32 索引长度 + JSON 索引（每块偏移 / 长度、调色板、统计）+ 各块原样拼接。
- 统计口径：去重静态体素 = 每列各段长度之和（Y 区间并集，重叠只算一次），由 worker 精确累计；
  “列段记录” = 所有列的段数；“盒记录” = 同一行相邻列完全相同的段合并成盒 `[x, y, z, dx, dy, 1, 材质]` 后的盒数。
- `life/actors.json`：`paths`（世界坐标米，x 向东偏、y 向上、z 向南偏；closed 循环 / pingpong 往返 / dwell 停靠秒数）+
  `actors`（类型 t、路径 p、弧长起点 o 米、速度 v 米/秒、车道横向偏移 lane）+ `zones`（活动区域与近景机位）。

## 查看器

- 四叉树 LOD：LOD4 根 → LOD0，按“屏幕上一列超过 N 像素就细分”选择，细分 / 合并阈值有 22% 滞回；LOD0/1 超出四边形预算按最久未显示淘汰。
- Web Worker 里解码 + 网格化：顶面按高度层做 2D 贪心合并；侧面每条外露竖向条带一个四边形，跨多种材质时引用本块“立面图案纹理”
  （每米一个材质字节），相邻条带图案相同就合并。远景玻璃立面在着色器里补楼层线。
- 着色：太阳 + 天光、体素描边与色差、墙脚环境光遮蔽、玻璃天空反射与零星亮窗、水面波纹与菲涅尔、大气透视。
- 动态角色：小方块模型按部件 InstancedMesh 绘制，与城市共用深度缓冲；车轮转动、行人摆臂迈腿、骑行坐姿 + 连续踏板、马腿、螺旋桨、翅膀、船只起伏。
- 交互：左键拖动平移、滚轮朝鼠标缩放、右键或 Alt+左键拖动旋转、双击聚焦（对已加载高度场做射线步进）；播放 / 暂停、0.5× / 1× / 2×、
  活动区域近景、镜头环绕、地标标注、画质（流畅 / 标准 / 精细）；下载静态模型、角色路径、生成器源码（浏览器端打 tar 包）。
- URL 参数：`view=<视角或活动区域 id>`、`q=low|std|high`、`t=<秒>`、`paused=1`、`labels=0`、`cam=px,py,pz,tx,ty,tz`、`shot=1`（截图模式）。

## 统计（最近一次完整构建）

| 项目 | 数值 |
|---|---|
| 网格 / 体素边长 | 8192³ / 1 米（水平、竖直一致） |
| 覆盖 | 8.192 × 8.192 km（旋转 22.5°），竖向 y 0–575（海平面 y=24，世贸一号楼尖顶 y=575） |
| 去重静态体素 | 2,937,830,407（其中海平面以上 1,327,222,101；地基与岩土 17.97 亿、水体 3.10 亿、建筑 7.93 亿、街面 0.16 亿、植被 0.21 亿、桥梁钢构 0.01 亿） |
| 列段记录 / 盒记录 | 277,393,383 / 47,561,420 |
| 生成分块 / 发布瓦片 | 256 块（512×512）/ 1364 块（LOD0 1024、LOD1 256、LOD2 64、LOD3 16、LOD4 4） |
| 建筑 / 地标与构筑物 / 树 | 78,119 栋程序建筑 / 122 个手工结构 / 145,898 棵 |
| 动态角色 / 活动区域 | 612 / 15 |
| 发布文件 | 共约 76 MB（其中 data/ 57.5 MB），最大单文件 1.5 MB（截图），首屏约 3 MB |
| 构建 | 约 2.5–3.5 分钟，1 主线程 + 7 worker，进程峰值 RSS 约 2.4 GB |

## 已知不足

- 自由女神像不在画幅内（见取景）；画幅右上角只到中央公园 74 街附近，湖只含南端；皇后区大桥、罗斯福岛大部分在画外。
- 地理凭记忆：岸线与地标位置误差约 50–100 m；金融区、西村、唐人街、下东区的不规则街道用局部网格 + 主要街道近似，很多小街缺失或简化。
- 除约 120 个手工地标外，建筑是按分区高度 / 风格规则生成的替身，不是逐栋真实；中城塔楼略显整齐。
- 曼哈顿网格与体素轴成 51.5°，立面呈 1 米台阶；1 米粗的桥缆和斜拉索近看生硬；布鲁克林大桥步道在塔墩处没有分岔，行人会穿过塔墩。
- 角色没有红绿灯与避让：同一环线等距同速不会相撞，但不同路线在路口可能交叠；行人之间可能互相穿过。
- 只有白天光照，没有阴影贴图（墙脚 AO 是近似）；SwiftShader 下帧率只有 0.03–3 fps（见 `checks/CHECKS.md`），真实 GPU 未在本机实测。
- 静态体素总数包含海平面以下 24 米的实心地基（17.97 亿），只看地上部分是 13.27 亿。
- 题目中的“熊熊大厦”按“熨斗大厦”（Flatiron）建模，另把麦迪逊大道 383 号（原贝尔斯登大楼）也做了标注。

## 目录

`index.html` 查看器入口 · `js/` 查看器 · `vendor/three/` three.js r186（原样拷贝）· `src/` 生成器与打包器 · `data/` 瓦片与清单 ·
`life/` 角色路径 · `checks/` 截图与检查记录 · `meta.json` 展页信息 · `WORKLOG.md` 工作记录。
