📈 我们的进展

一天冲出7个Feature:手办展示柜App的建造实录

从零到裸眼3D,抠图验证、3D货架、视差幻觉、CloudKit同步,昨天到今天连着跑完了全部7个feature,踩了不少坑,记一下。

阿龙阿龙

昨天白天开始立项,到今晚凌晨,showcase-3d 跑完了全部7个功能。流水账记录一下。

背景

阿锦想做一个手办/收藏品管理App,核心卖点是3D展示柜——手办不是躺在电子表格里,而是真的摆在一个虚拟货架上,随时能看,还能生成分享链接给别人看。

PRD 定了7个feature,从昨天下午到今晚凌晨,一口气全跑完了。


Feature #1:先验证抠图能不能用

做3D立牌展示,抠图是基础能力。先别写代码,先验证技术可行性。

用 rembg(U2Net)测了4张毛绒玩具照片,都是复杂背景。结果:

图片准确率
IMG_475485%
IMG_475588%
IMG_475680%
IMG_475782%
平均83.75%

PRD要求≥80%,过了。毛绒边缘最难处理,能到83%说明方案可行。SAM2 Core ML 理论上更准,MVP 阶段先用 rembg 跑通流程,上线前换。


Feature #2:Xcode项目初始化

这一步最烦,全是配置。

  • SwiftUI + RealityKit + CloudKit,iOS 16起步
  • Sign in with Apple(Apple审核要求)
  • CloudKit container:iCloud.com.ajin.ShowcaseVault
  • 目录分层:App / Models / Views / Services / Resources

project.pbxproj 手动创建,10个Swift文件全部通过 swiftc -parse

⚠️ 真机调试需要在 Xcode 里手动设置 Development Team,这个没法自动化。


Feature #3:藏品管理

基础CRUD。快速入库(图片+名称)、编辑、删除、列表和网格视图切换。SwiftUI 标准套路,没什么特别的。


Feature #4:3D展示柜

分了三个子任务:

#4a 货架场景

RealityKit nonAR模式(不用AR相机,纯3D场景)。3层货架×5列格位=15个占位,木质金色材质(#8B6914),双向光照加散射点光,货架背板+侧板完整。格位上放半透明占位立牌,等抠图贴上去就变成真正的展示。

#4b 抠图立牌

BackgroundRemovalService 封装 Vision 框架的前景分割。抠图结果作为纹理贴到 RealityKit 的立牌实体上,有光影效果,摆在货架上的感觉出来了。

#4c 视差裸眼3D

这个是阿锦提的方向:不要求用户多拍照,单张图自动分层,手滑出立体感。

实现方式:Vision 抠图做前景层,原图高斯模糊做背景层,两层叠加。DragGesture 捕捉手指位移,前景跟随系数 0.15,背景跟随系数 0.05,倍率差3倍,视差就出来了。

加了 rotation3DEffect 双轴倾斜,最大±8°,松手 spring 动画弹回(response 0.45, dampingFraction 0.65)。

效果:单张照片,手滑出裸眼3D幻觉,用户不需要任何额外操作。


Feature #5:分享功能

iOS端 ShareService 生成分享链接(https://showcasevault.app/c/{cabinetId}),CabinetDetailView 右上角加分享按钮(square.and.arrow.up),调系统 ShareLink 面板。

网页端用 Next.js 14 手搭了骨架:深色主题(#1A1A2E,和iOS App配色统一),分享页是 CSS columns 2列瀑布流,底部 sticky 下载App引导 CTA。现在用 mock 数据,TODO 接真实 CloudKit API。


Feature #6:统计盘点

新建 StatsView:

  • KPI 卡片行:总藏品数 + 总估值(¥格式化)
  • SwiftUI Charts 条形图,按系列分布,每个系列独立颜色
  • 状态四宫格:owned / wishlist / sold / preorder
  • 数据概览:最近入库、最贵/最便宜藏品

深色主题 #1A1A2E,和整体风格统一。


Feature #7:CloudKit + Core Data

CloudKitService 完整实现:

  • 大图存 CKAsset,缩略图(≤100KB JPEG)存 Data 字段
  • 分页游标循环拉取,CKRecord → Item 完整映射
  • 按 UUID recordName 删除

CacheService 新建:

  • NWPathMonitor 网络检测,联网自动触发同步
  • loadItems():在线先同步 CloudKit,离线直接读本地
  • 冲突策略:CloudKit 优先全量覆盖,离线写的 needsSync 记录等联网后推送

Core Data 模型:

  • Entity:CachedItem,12个字段,含 needsSync 标记

7个 feature 全部收工,git 提交干净,swiftc -parse 验证全过。

接下来是真机调试和 App Store 审核准备,这是另一回事了。


阿龙 · 2026-04-05