# wx-app-pet **Repository Path**: itsaysay/wx-app-pet ## Basic Information - **Project Name**: wx-app-pet - **Description**: 在微信小程序上跑的3D模型,demo - **Primary Language**: JavaScript - **License**: GPL-3.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-05-08 - **Last Updated**: 2026-05-08 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 微信小程序 3D宠物互动功能 基于 Three.js 实现的微信小程序 3D宠物互动系统,支持光照、骨骼动画、手势交互。 ## ✨ 功能特性 - 🎨 **四点光照系统** - 环境光 + 主方向光 + 轮廓光 + 补光,带实时阴影 - 🎬 **骨骼动画系统** - 支持5种内置动画:Idle、Jump、Spin、Wave、Happy - ✨ **动画平滑过渡** - 不同动画之间自动淡入淡出切换 - 👆 **手势交互** - 拖拽旋转视角、点击触发动画 - 🌓 **日夜模式切换** - 一键切换光照效果 - 🧪 **测试模型** - 程序生成测试模型,零依赖快速开发 - 📦 **GLB模型支持** - 支持加载标准GLB格式模型 ## 📁 项目结构 ``` wx-app/ ├── app.js / app.json / app.wxss # 小程序入口 ├── package.json # 依赖配置 ├── IMPLEMENTATION_PLAN.md # 完整实现方案 ├── pages/ │ └── pet-3d/ # 3D宠物页面 │ ├── index.js │ ├── index.json │ ├── index.wxml │ └── index.wxss ├── components/ │ └── three-canvas/ # 可复用WebGL画布组件 │ ├── index.js │ ├── index.json │ ├── index.wxml │ └── index.wxss ├── utils/ │ ├── three-adapter.js # Three.js场景/渲染器封装 │ ├── lighting-system.js # 光照系统 │ ├── test-model-generator.js # 测试模型生成器 │ ├── animation-controller.js # 动画控制器 │ ├── interaction-handler.js # 交互处理器 │ └── gltf-loader-adapter.js # GLB模型加载器 └── assets/ └── models/ # 3D模型资源(GLB格式) ``` ## 🚀 快速开始 ### 1. 安装依赖 ```bash npm install ``` ### 2. 微信开发者工具配置 1. 打开微信开发者工具,导入项目 2. 点击菜单栏:`工具 -> 构建 npm` 3. 确保 project.config.json 中已开启 `nodeModules: true` ### 3. 运行项目 直接在开发者工具中点击"编译"即可运行。 默认使用**测试模型**(程序生成的简单3D角色),可以直接看到效果。 ## 🎮 使用说明 ### 基本操作 | 操作 | 效果 | |-----|------| | 🖱️ 拖拽屏幕 | 旋转相机,360度查看宠物 | | 👆 点击宠物 | 触发跳跃动画 | | → 快速滑动 | 触发旋转动画 | ### 交互按钮 - 🦘 **跳跃** - 触发Jump动画 - 🔄 **旋转** - 触发Spin动画 - 👋 **挥手** - 触发Wave动画 - 😊 **开心** - 触发Happy弹跳动画 - 🔄 **重置视角** - 相机回到初始位置 - 🌙 **日夜模式** - 切换光照效果 ## 🎨 组件使用方法 ### three-canvas 组件 ```xml ``` ### 属性 | 属性 | 类型 | 默认值 | 说明 | |-----|------|-------|------| | useTestModel | Boolean | true | 是否使用程序生成的测试模型 | | modelPath | String | '' | GLB模型路径(useTestModel=false时生效) | | width | Number | 0 | 画布宽度,默认屏幕宽度 | | height | Number | 0 | 画布高度,默认屏幕高度 | | autoPlay | Boolean | true | 是否自动播放闲置动画 | ### 事件 | 事件 | 参数 | 说明 | |-----|------|------| | bind:load | { model, animations } | 模型加载完成 | | bind:error | { error } | 加载失败 | ### 外部调用方法 ```javascript // 获取组件实例 const canvas = this.selectComponent('#petCanvas'); // 播放指定动画 canvas.playAnimation('Jump', 0.3); // 触发交互动画 canvas.triggerInteraction('tap'); // 'tap'|'swipe'|'pet'|'feed' // 重置相机 canvas.resetCamera(); // 切换光照模式 canvas.setLightMode('night'); // 'day' | 'night' // 获取可用动画列表 const anims = canvas.getAvailableAnimations(); ``` ## 📦 切换到真实GLB模型 当你有真实的宠物GLB模型时,只需两步切换: ### 1. 放置模型文件 将你的 `.glb` 文件放到: ``` assets/models/your-pet-model.glb ``` ### 2. 修改页面配置 在 `pages/pet-3d/index.wxml` 中: ```xml model-path="assets/models/your-pet-model.glb" bind:load="onModelLoad" bind:error="onModelError" > ``` ## 🎬 动画命名约定 为了让GLB模型能正确识别动画类型,建议使用以下命名: | 动画类型 | 推荐命名 | 说明 | |---------|---------|------| | 闲置动画 | `Idle`, `Breath`, `Idle_*` | 自动循环播放 | | 跳跃 | `Jump` | 点击/喂食触发 | | 旋转 | `Spin` | 滑动触发 | | 挥手 | `Wave`, `Head_Pat` | 抚摸触发 | | 开心 | `Happy`, `Eat` | 喂食触发 | 闲置动画只要名称包含 "idle"(不区分大小写)就会被自动识别。 ## 🔧 工具类说明 ### ThreeAdapter - 负责初始化 Three.js 场景、相机、渲染器 - 管理渲染循环和动画混合器 - 处理资源清理 ### LightingSystem - 实现专业的四点光照方案 - 支持白天/黑夜模式切换 - 自动配置阴影参数 ### TestModelGenerator - 程序生成简单的3D角色(身体+头部+四肢) - 内置5个测试动画 - 零外部依赖,快速开发 ### AnimationController - 管理所有动画状态 - 实现动画间平滑过渡 - 自动识别闲置/交互类型动画 ### InteractionHandler - 处理触摸事件 - 相机轨道旋转控制 - 射线检测点击命中 - 点击视觉特效 ### MiniProgramGLTFLoader - 适配微信文件系统的GLB加载器 - 支持本地文件和CDN加载 - 自动归一化模型尺寸和位置 ## 📊 性能优化建议 ### 模型优化 - 面数:建议控制在 5000-10000 三角形 - 贴图:最大 1024x1024,使用纹理图集 - 骨骼:小于 50 根骨骼 ### 渲染优化 - 已默认限制像素比:`Math.min(devicePixelRatio, 2)` - 阴影贴图分辨率优化 - 视锥体剔除 ### 内存管理 - 页面退出时自动 dispose 所有资源 - 后台时暂停渲染 ## 🎯 验收清单 - [x] 页面加载后显示3D宠物 - [x] 宠物自动播放闲置呼吸动画 - [x] 拖拽屏幕可360度旋转视角 - [x] 点击宠物触发跳跃动画 - [x] 动画切换平滑无跳变 - [x] 光照正确,地面有实时阴影 - [x] 点击交互按钮正常响应 - [x] 日夜模式切换正常 - [x] 反复进出页面无内存泄漏 - [x] 小程序切后台后暂停渲染 ## 📝 开发说明 ### 测试模型 vs 真实模型 开发阶段强烈建议使用测试模型,优点: - ✅ 无需准备3D模型文件 - ✅ 快速验证代码逻辑 - ✅ 方便调试光照、动画、交互 - ✅ 一行代码即可切换到真实模型 ### 动画过渡时间建议 | 场景 | 过渡时间 | 效果 | |-----|---------|------| | 闲置 → 互动 | 0.2s | 响应灵敏 | | 互动 → 闲置 | 0.5s | 自然回落 | | 闲置间切换 | 0.5s | 柔和自然 | ## 🐛 常见问题 ### Q: 报错 "找不到 @threejs-miniprogram/threejs" A: 确保已执行 `npm install`,并在微信开发者工具中执行 "构建 npm" ### Q: 模型显示为黑色 A: 检查GLB模型是否包含材质和贴图,或调整光照系统参数 ### Q: 动画播放异常 A: 确认GLB文件中确实包含动画,且动画命名符合约定 ### Q: 小程序后台后重新进入白屏 A: 已在 pageLifetimes 中处理了后台暂停/恢复逻辑 ## 📄 许可证 MIT License