Files
zhengte.babylonjs-sdk/examples/README.md
2026-05-18 12:13:34 +08:00

380 lines
8.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# SDK 调用示例
本目录包含完整的 SDK 调用示例,展示了两种不同的集成方式。
## 📁 文件说明
### 完整 Demo推荐
- `demo-module.html` - **ES Module 方式完整示例**(推荐)
- `demo-global.html` - **全局脚本方式完整示例**
- `app-global.js` - 全局脚本方式的业务逻辑文件
### 简单示例
- `example-module.html` - ES Module 方式简单示例
- `example-global.html` - 全局脚本方式简单示例
## 🎯 核心设计理念
### 业务逻辑与 SDK 解耦
根目录的 `index.js` 是一个**通用的业务逻辑层**,通过 `initApp(kernel)` 接收外部传入的 kernel 实例,实现了:
**SDK 调用方式无关** - 同一套业务逻辑,适配两种 SDK 引入方式
**代码复用** - 避免重复编写业务逻辑
**易于维护** - 业务逻辑集中管理,修改一处即可
**架构图:**
```
┌─────────────────────────────────────────┐
│ 应用层 (HTML) │
│ ┌─────────────┐ ┌─────────────┐ │
│ │ ES Module │ │ 全局脚本 │ │
│ │ 方式引入 │ │ 方式引入 │ │
│ └──────┬──────┘ └──────┬──────┘ │
│ │ │ │
│ ▼ ▼ │
│ ┌─────────────────────────────────┐ │
│ │ 通用业务逻辑 (index.js) │ │
│ │ - initApp(kernel) │ │
│ │ - init() │ │
│ │ - getAutoLoadModelList() │ │
│ │ - getHotspot() │ │
│ │ - getProductConfig() │ │
│ └──────────────┬──────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────┐ │
│ │ SDK Kernel │ │
│ │ (从外部注入) │ │
│ └─────────────────────────────────┘ │
└─────────────────────────────────────────┘
```
---
## 🚀 快速开始
### 方式 1: ES Module推荐
**文件:** `demo-module.html`
```html
<script type="module">
// 1. 从 CDN 导入 SDK
import { kernel } from 'https://sdk.zguiy.com/zt/assets/index.js';
// 2. 导入业务逻辑
import { initApp, init, getAutoLoadModelList } from '../index.js';
// 3. 注入 kernel 实例
initApp(kernel);
// 4. 初始化应用
await init();
await getAutoLoadModelList();
</script>
```
**特点:**
- ✅ 现代化模块化开发
- ✅ 直接引用根目录的 `index.js`
- ✅ 支持 async/await
- ✅ 更好的 IDE 智能提示
---
### 方式 2: 全局脚本
**文件:** `demo-global.html` + `app-global.js`
```html
<!-- 1. 引入 SDK -->
<script src="https://sdk.zguiy.com/zt/assets/index.global.js"></script>
<!-- 2. 引入业务逻辑 -->
<script src="./app-global.js"></script>
<script>
// 3. 获取 SDK kernel
var kernel = window.faceSDK.kernel;
// 4. 注入 kernel 实例
window.AppLogic.initApp(kernel);
// 5. 初始化应用
(async function() {
await window.AppLogic.init();
await window.AppLogic.getAutoLoadModelList();
})();
</script>
```
**特点:**
- ✅ 兼容所有浏览器
- ✅ 无需构建工具
- ✅ 使用 `app-global.js`(根目录 `index.js` 的全局脚本版本)
- ⚠️ 需要维护两份业务逻辑文件
---
## 📖 业务逻辑 API
### 初始化
```javascript
// 注入 kernel 实例(必须首先调用)
initApp(kernel)
// 初始化 SDK 配置
await init(customConfig?)
// 加载模型列表
await getAutoLoadModelList()
```
### 产品配置
```javascript
// 获取产品配置并应用
await getProductConfig(sku)
// 获取放置区域
await getPlacementZone(sku)
```
### 热点管理
```javascript
// 加载并渲染热点
await getHotspot()
```
### 事件处理
```javascript
// 执行放置区域事件
await getEvent(dropzone_data, sku)
// 执行产品切换事件
await executeEvent2(result)
```
---
## 🎨 完整 Demo 功能
两个完整 demo`demo-module.html``demo-global.html`)都包含:
### UI 功能
- ✅ 3D 模型渲染画布
- ✅ 配置面板(产品选择、热点控制)
- ✅ 加载进度显示
- ✅ 点击信息提示
### 交互功能
- ✅ 产品切换
- ✅ 热点加载
- ✅ 模型点击事件
- ✅ 热点点击事件
### 事件监听
```javascript
// 加载进度
kernel.on('model:load:progress', (data) => {
console.log('进度:', data.progress);
});
// 加载完成
kernel.on('model:loaded', (data) => {
console.log('模型列表:', data.models);
});
// 模型点击
kernel.on('model:click', (data) => {
console.log('点击:', data.meshName);
});
// 热点点击
kernel.on('hotspot:click', (event) => {
console.log('热点:', event.name);
});
```
---
## 🔧 本地运行
### ES Module 方式
```bash
# 需要本地服务器ES Module 不支持 file:// 协议)
cd examples
npx serve .
# 访问 http://localhost:3000/demo-module.html
```
### 全局脚本方式
```bash
# 可以直接双击打开
# 或使用本地服务器
cd examples
npx serve .
# 访问 http://localhost:3000/demo-global.html
```
---
## 📦 集成到项目
### Vue 3 项目
```vue
<template>
<canvas ref="canvasRef"></canvas>
</template>
<script setup>
import { ref, onMounted } from 'vue';
import { kernel } from 'https://sdk.zguiy.com/zt/assets/index.js';
import { initApp, init, getAutoLoadModelList } from '@/utils/app-logic.js';
const canvasRef = ref(null);
onMounted(async () => {
// 注入 kernel
initApp(kernel);
// 初始化
await init({ container: canvasRef.value });
await getAutoLoadModelList();
});
</script>
```
### React 项目
```jsx
import { useEffect, useRef } from 'react';
function ModelViewer() {
const canvasRef = useRef(null);
useEffect(() => {
(async () => {
// 动态导入 SDK
const { kernel } = await import('https://sdk.zguiy.com/zt/assets/index.js');
const { initApp, init, getAutoLoadModelList } = await import('./app-logic.js');
// 注入 kernel
initApp(kernel);
// 初始化
await init({ container: canvasRef.current });
await getAutoLoadModelList();
})();
}, []);
return <canvas ref={canvasRef} />;
}
```
### 原生 HTML
```html
<!DOCTYPE html>
<html>
<head>
<title>3D 模型展示</title>
</head>
<body>
<canvas id="renderDom"></canvas>
<script src="https://sdk.zguiy.com/zt/assets/index.global.js"></script>
<script src="./app-global.js"></script>
<script>
var kernel = window.faceSDK.kernel;
window.AppLogic.initApp(kernel);
(async function() {
await window.AppLogic.init();
await window.AppLogic.getAutoLoadModelList();
})();
</script>
</body>
</html>
```
---
## 🔄 业务逻辑文件说明
### 根目录 `index.js` (ES Module 版本)
- 使用 ES6+ 语法
- 支持 `import/export`
- 适用于现代构建工具
- **推荐用于新项目**
### `app-global.js` (全局脚本版本)
- 使用 ES5 语法
- 通过 IIFE 包装
- 暴露到 `window.AppLogic`
- 适用于传统 HTML 页面
**两个文件功能完全相同,只是语法不同。**
---
## ❓ 常见问题
### Q: 为什么需要两个业务逻辑文件?
**A:** 因为 ES Module 和全局脚本的语法不兼容:
- ES Module 使用 `import/export`,不能在全局脚本中使用
- 全局脚本需要通过 `window` 对象暴露 API
如果你的项目只使用一种方式,只需要维护对应的文件即可。
### Q: 如何选择使用哪种方式?
**A:**
- **现代项目 + 构建工具** → 使用 ES Module (`demo-module.html`)
- **传统 HTML + 无构建工具** → 使用全局脚本 (`demo-global.html`)
- **需要兼容旧浏览器** → 使用全局脚本
### Q: 可以只维护一份业务逻辑吗?
**A:** 可以!有两种方案:
1. **只用 ES Module**:使用构建工具(如 Vite将 ES Module 转换为全局脚本
2. **只用全局脚本**:所有项目都使用 `app-global.js`
### Q: `initApp(kernel)` 必须调用吗?
**A:** 是的!这是核心设计:
```javascript
// ❌ 错误 - 直接调用会报错
await init(); // Error: 请先调用 initApp(kernel)
// ✅ 正确 - 先注入 kernel
initApp(kernel);
await init();
```
---
## 📚 相关资源
- SDK 文档: https://sdk.zguiy.com/docs
- 后端 API: https://ztserver.zguiy.com
- GitHub: [项目地址]
---
## 📄 许可证
MIT License