# 开包动画实现技术栈 ## 1. 总体形态 当前原型是一个不依赖后端的静态 Web 应用。Vite 负责开发和生产构建,Three.js 负责实时 3D/WebGL 渲染,GSAP 负责阶段时间轴。生产产物位于 `dist/`,可直接部署到 Cloudflare Pages。 原版产品采用 React Native WebView 作为宿主,原生 App 注入卡包、卡面、稀有度颜色与开关参数,Web 引擎负责动画、粒子、声音和手势。本原型先实现独立浏览器版本,保留后续接入 `window.PackOpeningBridge` 与 `ReactNativeWebView.postMessage` 的边界。 ## 2. 核心依赖 | 层级 | 技术 | 版本/用途 | | --- | --- | --- | | 构建 | Vite | 8.1.4;开发服务器、资源处理和生产构建 | | 包管理 | pnpm | 使用锁文件保证依赖可复现 | | 3D 渲染 | Three.js | 0.185.1;场景、相机、网格、纹理、粒子和后处理 | | 动画 | GSAP | 3.15.0;聚焦、撕封、退场、揭卡和加速时间轴 | | 自动化 | Playwright | 1.55.0;桌面和手机全流程回归与截图 | | 页面 | 原生 HTML/CSS | 状态提示、主题切换、设置、报告和下载入口 | ## 3. 渲染架构 ### 场景与相机 - `THREE.Scene` 使用黑色背景和线性雾隐藏圆环远端。 - `PerspectiveCamera` 使用 60 度视场角,聚焦阶段通过 GSAP 推进和抬升。 - 15 个卡包复用几何和材质,按圆周均匀排布。 ### 卡包材质 - 主体使用业务卡包图作为颜色纹理。 - 原版的卡包标题和 Logo 已烘焙在主体图,不由运行时排版。 - 顶部和底部封口在原版中是独立分段平面,通过颜色、压纹 shader 和顶点折叠生成。 - 深度遮罩主要调节左右边缘亮度,模拟软包装的鼓起和收边,并不生成真实厚度。 ### 粒子系统 - 环境尘埃、撕封火花、旋涡、雪点、最终尘埃和烟花使用 `BufferGeometry`。 - 点粒子使用带硬核心和软衰减的 CanvasTexture。 - 撕封喷流由 `Points` 与 `LineSegments` 组合。 - 粒子位置、速度、重力、寿命和透明度在渲染循环中更新。 ### 选择性 Bloom - 使用两个 `EffectComposer`。 - Bloom Composer 只渲染粒子、封口光、撕封喷流和卡牌边框追光层。 - Final Composer 渲染清晰基础画面并叠加 Bloom 纹理。 - 这样可以复用原版 `strength 2 / radius 0.5 / threshold 0.1` 的观感,同时避免卡包和结果卡整面过曝。 ### 自定义 Shader - 卡包金属高光:根据 UV、时间和主题色计算移动反射。 - 卡背追光:黑白几何纹理阈值化着色,并叠加斜向移动光带。 - 卡面溶解:噪声阈值控制卡背到真实卡图的渐进切换。 - 边框追光:计算矩形周长位置,让绿金光带沿边缘运行并在结尾整圈收束。 ## 4. 状态机与时间轴 主状态依次为: ```text booting -> carousel -> focusing -> tear -> opening -> revealing -> complete ``` - Pointer Events 处理鼠标和触摸输入。 - `Raycaster` 判断点击命中的卡包。 - GSAP Timeline 管理阶段动画,避免用多个互相竞争的定时器。 - 揭卡阶段点击会把时间轴和溶解动画统一切换到 4 倍速。 - 重置时集中清理时间轴、粒子、音频实例和临时网格。 ## 5. 音频与触觉 - Web Audio API 在启动阶段获取并解码音频为 `AudioBuffer`。 - 循环音乐、撕包纸声、whoosh、揭卡音和烟花音按状态与时间点触发。 - 音频加载失败时使用 Oscillator 合成提示音降级。 - 浏览器使用 Vibration API;接入 React Native 后应改为原生 light、medium、heavy 触觉桥接。 ## 6. 资源与目录 ```text src/main.js Three.js 场景、状态机、手势、时间轴和音频 src/styles.css 抽包页面 UI 与响应式样式 public/assets/packs/ 四套用户自有卡包图 public/assets/audio/ 音效和 cue manifest scripts/build.cjs Vite 构建与报告资源整理 scripts/verify.cjs 抽包全流程 Playwright 验证 scripts/verify-report.cjs 分析报告断图和响应式验证 ``` ## 7. 构建和部署 ```powershell pnpm install --frozen-lockfile pnpm build ``` Cloudflare Pages 配置: ```text Build command: pnpm build Build output: dist ``` 生产构建包含抽包首页、HTML 分析报告、报告截图、UTF-8 文档响应头和源码下载 ZIP。`_headers` 明确为 Markdown 声明 `charset=utf-8`,避免浏览器按本地编码猜测。 ## 8. 产品化接入边界 React Native 负责购买结果、鉴权、业务跳转、原生触觉和异常降级;Web 动画引擎只消费已经确定的展示数据。卡片结果必须由后端决定,前端动画不得参与随机结果计算。 推荐 Bridge 输入包括: - `packImageURL` - `cards[].cardFrontImageURL` - `particleColor` - `tearStripColor` - `otherRaritySampleColors` - `isRare` - `soundEnabled` - `hapticsEnabled` 推荐回传事件包括:`engineReady`、`haptic`、`telemetry`、`done` 和 `error`。