14 KiB
CrowdRoom · 总览(v0.1)
一句话定义:CrowdRoom 是「RoomPlan 版的 Sketchfab + Pinterest」——人人用 iPhone 扫一个房间,传到云端就有可在浏览器里 360° 把玩、分层切换、换家具换材质、Remix 再创作的 3D 房间社区。
本章是 CrowdRoom 的总览,与既有 plans/PRISM/00_overview.md 对齐:PRISM 是「机器人空间记忆操作系统」,CrowdRoom 是它的消费级前台与数据入口——把"专业机器人技术栈"和"普通用户的手机"用一个社区粘合起来。
1. 产品定位
| 维度 | 描述 |
|---|---|
| 一句话 | "RoomPlan 版的 Sketchfab + Pinterest":扫房 → 上传 → 共享 → Remix |
| 内容形态 | 一个房间 = 一份 RoomPlan 源文件(.usdz + JSON)+ 服务端转码出的 .glb + 4 层可切换图层 |
| 核心动作 | Scan → Upload → View → Toggle Layers → Remix → Share |
| 区别于 Sketchfab | 不是任意 3D 模型库,而是结构化的真实房间(带语义:墙/地/家具/材质) |
| 区别于 Polycam 社区 | Polycam 偏个人云盘,CrowdRoom 偏公共内容流 + Remix 文化 |
| 区别于 ArcGIS | 不做专业 GIS 查询,只做"分层显示/隐藏/替换"这种消费级图层操作 |
CrowdRoom 不和 PRISM 抢机器人场景,它解决的是「怎么让 RoomPlan 数据从一个人的相册变成一个生态」的问题。
2. 目标用户画像
| 画像 | 标签 | 典型行为 | 核心诉求 |
|---|---|---|---|
| A · 扫房爱好者(Scanner) | 极客、博主、Polycam 老用户、租房博主 | 周末扫家、扫民宿、扫展览,上传炫技 | 上传顺、出图快、获赞获关注 |
| B · 灵感党(Browser) | 室内设计学生、装修业主、ins/小红书图源党 | 不扫,只逛;收藏好看的房间作灵感板 | 浏览流畅、能搜风格、能收藏分组 |
| C · Remixer(创作者) | 设计爱好者、3D 玩家、UGC 创作者 | 拿别人扫的房间,换墙纸/换沙发/隐藏家具发"我的版本" | 操作低门槛、能版本对比、能 fork |
三类用户构成采集 → 消费 → 再创作的内容飞轮,对应 plans/iphone/iphone_simplified_plan.md 里"个人验证用 RoomPlan"的轻量场景,但把生产者从 1 人扩到 N 人。
3. 核心用户故事(MVP 范围内 8 条)
| # | As a | I want to | So that |
|---|---|---|---|
| US-1 | 扫房爱好者 | 在 iOS App 里调用 RoomPlan 扫完房间一键上传 | 不用导出 USDZ 再手动传 |
| US-2 | 扫房爱好者 | 上传时给房间打标签(户型 / 风格 / 城市)并选择公开/私有 | 控制我作品的可见性与隐私 |
| US-3 | 灵感党 | 在浏览器里 360° 旋转、缩放、走进一个房间 | 不装 App 就能看 |
| US-4 | 灵感党 | 用复选框开关 墙 / 地板 / 家具 / 材质 四个图层 | 像 ArcGIS 那样按需查看结构或装饰 |
| US-5 | Remixer | 把家具图层里的某件家具替换为公共资产库里的另一件 | 不重新建模就能做"装修方案" |
| US-6 | Remixer | 把墙面/地面材质换成公共材质库里的另一种 | 快速试色 / 试材质 |
| US-7 | 任何用户 | 给一个房间点赞、评论、收藏到画板 | 形成社区互动 |
| US-8 | 扫房爱好者 | 上传前由 App 自动模糊照片中的人脸/身份证/品牌 logo | 默认隐私安全,不用我手工检查 |
故意不包含的 user stories:实时多人协同编辑、复杂 BIM/CAD 出图、专业 GIS 空间查询、跨房间拼接成楼层——见 §7 非目标。
4. 总体架构图
graph TD
subgraph CLIENT["客户端层"]
IOS["iOS App<br/>(RoomPlan SDK 采集 + 上传客户端)<br/>Swift / SwiftUI"]
WEB["Web 前端<br/>(浏览/分层/Remix)<br/>React + R3F + Three.js"]
end
subgraph BAAS["Supabase BaaS 层"]
AUTH["Auth<br/>邮箱/Apple/Google 登录<br/>JWT 下发"]
DB["Postgres<br/>rooms / layers / remixes /<br/>comments / likes 表"]
STG["Storage<br/>原始 .usdz + JSON<br/>+ 转码后 .glb"]
EDGE["Edge Functions<br/>上传回调 / 隐私脱敏触发 /<br/>排行榜聚合"]
end
subgraph WORKER["渲染与转码层"]
TRANS["Transcode Worker<br/>(USDZ → glTF/.glb +<br/>Draco/Meshopt 压缩)<br/>容器化 Node/Python"]
ASSET["Asset Library<br/>公共家具 .glb +<br/>PBR 材质贴图"]
end
subgraph CDN["分发层"]
EDGECDN["CDN<br/>(Cloudflare R2 / Bunny)<br/>直发 .glb 与缩略图"]
end
IOS -- "1. POST 上传 USDZ+JSON" --> STG
IOS -- "登录" --> AUTH
STG -- "2. 触发" --> EDGE
EDGE -- "3. 入队转码任务" --> TRANS
TRANS -- "4. 写回 .glb + layer manifest" --> STG
TRANS -- "5. 更新 status" --> DB
STG -- "公开资源" --> EDGECDN
WEB -- "查列表/详情" --> DB
WEB -- "登录" --> AUTH
WEB -- "拉 .glb / 贴图" --> EDGECDN
WEB -- "查公共素材" --> ASSET
ASSET --> EDGECDN
关键说明:
- iOS App 是唯一采集入口(RoomPlan 仅 iOS);Web 端只消费、不采集
- BaaS(Supabase)= Auth + Postgres + Storage + Edge Functions 一站式,避免自建后端
- Transcode Worker 与 Asset Library 是「服务器渲染/转码」的承载者,对应用户原话里的"服务器渲染"
- CDN 直发
.glb,Web 端实际渲染发生在浏览器 GPU(Three.js),服务端不做实时渲染——这是消费级路线的关键性价比决策
5. 技术栈选型表
| 层 | 推荐 | 备选 | 一行理由 |
|---|---|---|---|
| 移动端语言 | Swift + SwiftUI + RoomPlan | Flutter + 原生桥接 | RoomPlan 是纯 iOS API,原生 Swift 最薄 |
| Web 框架 | React + Vite + TypeScript | Next.js / SvelteKit | React 生态最厚,与 R3F 无缝 |
| 3D 渲染库 | Three.js + React-Three-Fiber + drei | Babylon.js / PlayCanvas | R3F 让"图层切换/换家具"用 React 组件思维直接表达 |
| BaaS | Supabase | Firebase / Appwrite | 开源、Postgres 底座、便于后续平滑迁移到自建 |
| 对象存储 | Supabase Storage(小流量)→ Cloudflare R2(量大后) | AWS S3 / Backblaze B2 | R2 零出口费,国内外访问都还行 |
| CDN | Cloudflare | Bunny.net / 阿里云 CDN | 与 R2 同栈、免费额度大 |
| 转码 Worker | Node + gltf-transform + USD CLI,跑在 Fly.io / Railway 容器 |
AWS Lambda(冷启动慢,pass) | gltf-transform 做 Draco/Meshopt 压缩成熟;USD CLI 解 .usdz |
| 公共资产库 | Google <model-viewer> Asset Pack + 自建 PBR 库 |
Sketchfab API | 起步用免费 CC0 素材,避开版权 |
| CI/CD | GitHub Actions(iOS 走 fastlane → TestFlight;Web 走 Vercel) | GitLab CI | 学习成本低、与 Supabase 集成方便 |
| 监控 | Sentry + Supabase Logs | Datadog | 个人/早期项目够用 |
该表只列MVP 默认选项;具体表结构、API 端点、转码流水线细节由后续子任务(
01_data_schema.md/02_api_contract.md)展开。
6. 与 PRISM 的关系:复用与边界
6.1 一句话定位
CrowdRoom = PRISM 的"消费级前台 + 数据入口"。 PRISM 解决"机器人怎么记住一个房间",CrowdRoom 解决"普通用户怎么把房间贡献出来、怎么消费别人的房间"。 两者共享同一份"RoomPlan → 结构化空间"的数据约定,但生命周期、SLA、安全模型完全不同。
6.2 复用点(CrowdRoom 直接受益于 PRISM 的既有设计)
| # | 复用项 | 来源 | 用法 |
|---|---|---|---|
| R1 | RoomPlan 数据格式约定(USDZ + JSON 双文件,墙/门窗/家具/尺寸字段) | plans/iphone/data_format_specification.md §2-§3 |
CrowdRoom iOS App 直接采用同一份 JSON Schema,避免双标 |
| R2 | RoomPlan 精度边界与扫描最佳实践 | plans/iphone/roomplan_accuracy_and_cad_export.md §1, §4.1 |
用于 App 内的扫描引导提示("慢速移动 0.3 m/s""清理杂物")和精度免责声明 |
| R3 | 导出转换链 USDZ ↔ glTF/DXF | plans/iphone/roomplan_accuracy_and_cad_export.md §3 |
Transcode Worker 复用其 Python/Swift 思路,CrowdRoom 只取 USDZ → glTF 一条 |
| R4 | L3/L4 节点 + 属性的语义抽象(房间是 L3、家具是 L4、category/attributes/material) |
plans/PRISM/03_data_schema.md §3.2 |
CrowdRoom 的"分层 = L1/L2/L3/L4 的简化映射":墙/地→L2 度量,家具→L4 语义节点;4 层图层是 PRISM 四层的降维投影 |
| R5 | 简易方案的快速验证路径(一人一机一周跑通) | plans/iphone/iphone_simplified_plan.md §五 |
直接借作 CrowdRoom MVP 的扫描端工时基线 |
6.3 暂不引入的 PRISM 特性(边界)
| 不引入 | 理由 | 何时再考虑 |
|---|---|---|
Pipeline B 重定位 (05_pipeline_B_relocalization.md) |
CrowdRoom 没有"机器人上线"的概念,无需 CLIP+ICP 握手 | 若未来做 AR Quicklook 多次访问对齐才需要 |
Pipeline C 在线感知 (06_pipeline_C_online_perception.md) |
ZED 2i 不在消费端硬件清单里 | 永久不引入(消费级路线决策) |
Pipeline D 巩固 / Delta 差异记忆 (07_pipeline_D_consolidation.md) |
用户每次扫描视为独立作品而非同一空间的更新 | 若做"扫描日记/同一房间历史对比"功能再启用 |
KeyframeEvidence、Anchor、Delta 字段 (plans/PRISM/03_data_schema.md §3.2.1) |
这些是为机器人翻案与巩固设计的,与社区浏览无关 | 永久不引入 |
| Neo4j / Cypher 查询 | 消费级查询用 Postgres 全文索引足够 | 若引入"空间 SQL"(P2)再讨论 |
| PostGIS / 专业空间查询、LOD、楼层拼接 | 用户已明确划入 P2/未来 | 当单房间日活上 10 万级、用户主动要"按城市/按户型查询"才上 |
原则:CrowdRoom 是 PRISM 的只写入口 + 只读消费;它产出的数据可被 PRISM 后续 import 作为先验地图源("普通用户贡献先验"是诱人的长期愿景,但不在 MVP 范围内)。
7. MVP 范围与非目标
7.1 MVP 8 周内能交付(围绕 §3 的 8 条 user stories)
| 模块 | 交付物 |
|---|---|
| iOS App(TestFlight) | RoomPlan 采集 + USDZ/JSON 导出 + 上传 + 标签 + 隐私脱敏(人脸模糊) |
| Web 前端 | 列表页 / 详情页 / R3F 渲染器 / 4 层图层切换 / 公共素材替换 / 评论点赞 |
| Supabase 后端 | Auth、rooms / layers / remixes / comments / likes / assets 7 张核心表、Storage 桶、上传回调 Edge Function |
| Transcode Worker | USDZ → .glb(Draco 压缩) + 生成 layer_manifest.json(4 层引用) |
| 公共资产库 | ≥ 30 件家具 .glb + ≥ 20 种 PBR 材质(CC0 来源) |
| 内容审核 | 上传时静态规则 + 人工 review 队列(暂不做 AI 审核) |
7.2 明确不做(MVP 外)
- ❌ Android / Web 端采集(RoomPlan 仅 iOS,且不引入 Android ARCore 替代——避免数据双标)
- ❌ 实时多人协同编辑(Remix 走 fork 模型,不走 OT/CRDT)
- ❌ 空间 SQL / 任意自定义图层 / PostGIS 查询(P2)
- ❌ LOD、楼层拼接、跨房间空间索引(P2)
- ❌ 商品化(链接到电商)、付费墙、订阅
- ❌ 机器人接入 / PRISM Pipeline B-D 任何一项
- ❌ 自训练 3D 基础模型(家具识别一律用 RoomPlan 内置语义 + 公共资产匹配)
8. 风险与开放问题(≤ 5 条)
| # | 风险 / 开放问题 | 当前判断 | 待后续子任务回答 |
|---|---|---|---|
| RK-1 | RoomPlan 仅 iOS 且需 LiDAR(iPhone 12 Pro+) | 接受为前提,等同于早期 Polycam 的市场范围;不做 Android 替代 | 是否在 Web 端也开放"上传第三方 USDZ"作为 PC 用户入口? |
| RK-2 | .usdz 在 Web 端兼容性差(Three.js 无原生 USDZ loader) |
服务端强制转 .glb,Web 端只见 glTF |
转码失败率、.usdz 中嵌入纹理/动画的边界由 02_transcode_pipeline.md(待建)回答 |
| RK-3 | UGC 内容审核:色情、违法建筑、他人住宅未授权扫描 | MVP 走"上传时声明 + 举报下架 + 人工 review";不上 AI 审核 | 法律边界(中国大陆 vs 海外)、举报响应 SLA 由 10_governance.md(待建)回答 |
| RK-4 | 隐私脱敏:纹理里可能包含人脸、身份证、品牌 logo、镜子里的人 | 默认开启端侧 Vision 人脸检测 + 高斯模糊;镜面区域参考 PRISM no_update_zone 思想做警告 |
脱敏算法细节、用户能否关闭、是否服务端二次扫描由 01_data_schema.md + 09_privacy.md(待建)回答 |
| RK-5 | 存储与带宽成本:单个房间 .usdz 5–50 MB,.glb 压后 1–10 MB;千用户日活即可烧光免费额度 |
MVP 用 Supabase 免费额度 + Cloudflare R2 零出口费;设单用户上传配额 | 配额数值、冷热分层策略、缩略图分级由 02_transcode_pipeline.md 回答 |
9. 下一章预告
| 子任务 | 待产出 | 关注问题 |
|---|---|---|
01_data_schema.md |
Supabase 7 张表 DDL、layer_manifest.json Schema、与 PRISM L1-L4 的字段映射 |
RK-4 隐私字段、§6 R4 复用怎么落 |
02_api_contract.md |
REST/PostgREST + Edge Function 端点表 | 上传协议、转码回调、Remix fork API |
03_ios_app_plan.md |
iOS App 模块拆解 + 隐私脱敏实现 | US-1, US-2, US-8 |
04_web_app_plan.md |
Web 前端组件树 + R3F 图层渲染策略 | US-3~US-7 |
章节版本:v0.1 · 草案 关键收获:CrowdRoom 是 PRISM 的消费级前台;走 Supabase + Three.js + iOS-RoomPlan 的三件套路线;MVP 8 周覆盖 8 条核心 user stories;专业 GIS 与 PRISM Pipeline B/C/D 明确划在 MVP 之外。