From 4207fcf7c2112aab5809ff266fb33f10dcbc8229 Mon Sep 17 00:00:00 2001
From: zguiy <1415466602@qq.com>
Date: Thu, 30 Apr 2026 14:46:01 +0800
Subject: [PATCH] 1
---
API_USAGE_EXAMPLE.md | 216 ++++++++++++++++++++++
examples/module-demo.js | 25 ++-
index.html | 73 +++++++-
index.js | 104 ++++++++---
package-lock.json | 26 +--
package.json | 6 +-
src/babylonjs/AppConfig.ts | 14 +-
src/babylonjs/AppModel.ts | 262 ++++++++++++++++++++++++---
src/babylonjs/AppPositionGizmo.ts | 80 ++++++++
src/babylonjs/AppRay.ts | 18 ++
src/babylonjs/AppSelectionOutline.ts | 159 ++++++++++++++++
src/babylonjs/MainApp.ts | 15 +-
src/event/types.ts | 4 +
src/kernel/Adapter.ts | 107 ++++++++++-
src/main.ts | 16 +-
15 files changed, 1038 insertions(+), 87 deletions(-)
create mode 100644 API_USAGE_EXAMPLE.md
create mode 100644 src/babylonjs/AppPositionGizmo.ts
create mode 100644 src/babylonjs/AppSelectionOutline.ts
diff --git a/API_USAGE_EXAMPLE.md b/API_USAGE_EXAMPLE.md
new file mode 100644
index 0000000..4796721
--- /dev/null
+++ b/API_USAGE_EXAMPLE.md
@@ -0,0 +1,216 @@
+# 模型管理 API 使用示例
+
+## API 说明
+
+### 1. 添加模型
+
+```javascript
+// 添加带有 rotation 控制类型的模型
+kernel.model.add({
+ modelId: "卷帘大",
+ modelUrl: "https://sdk.zguiy.com/resurces/model/卷帘大.glb",
+ modelControlType: "rotation"
+});
+
+// 添加带有 color 控制类型的模型
+kernel.model.add({
+ modelId: "小桌",
+ modelUrl: "https://sdk.zguiy.com/resurces/model/小桌.glb",
+ modelControlType: "color"
+});
+
+// 添加不带控制类型的模型
+kernel.model.add({
+ modelId: "框架",
+ modelUrl: "https://sdk.zguiy.com/resurces/model/框架.glb"
+});
+```
+
+### 2. 替换模型
+
+```javascript
+// 替换模型并指定控制类型
+kernel.model.replace({
+ modelId: "卷帘大",
+ modelUrl: "https://sdk.zguiy.com/resurces/model/新卷帘.glb",
+ modelControlType: "rotation"
+});
+```
+
+### 3. 模型变换 (Transform)
+
+```javascript
+// 设置模型旋转 - 直接使用角度(默认)
+kernel.transform.rotation({
+ modelId: "卷帘大",
+ vector3: { x: 0, y: 90, z: 0 } // 绕Y轴旋转90度
+});
+
+// 更多角度示例
+kernel.transform.rotation({
+ modelId: "卷帘大",
+ vector3: { x: 0, y: 180, z: 0 } // 旋转180度
+});
+
+kernel.transform.rotation({
+ modelId: "卷帘大",
+ vector3: { x: 45, y: 90, z: 0 } // X轴45度,Y轴90度
+});
+
+// 如果需要使用弧度,设置 useDegrees: false
+kernel.transform.rotation({
+ modelId: "卷帘大",
+ vector3: { x: 0, y: Math.PI / 2, z: 0 },
+ useDegrees: false
+});
+
+// 设置模型位置
+kernel.transform.position({
+ modelId: "小桌",
+ vector3: { x: 10, y: 0, z: 5 }
+});
+
+// 设置模型缩放
+kernel.transform.scale({
+ modelId: "框架",
+ vector3: { x: 1.5, y: 1.5, z: 1.5 } // 放大1.5倍
+});
+```
+
+### 4. 点击事件回调
+
+```javascript
+kernel.on('model:click', (data) => {
+ console.log('点击的网格名称:', data.meshName);
+ console.log('点击的网格对象:', data.pickedMesh);
+ console.log('点击的3D坐标:', data.pickedPoint);
+ console.log('材质名称:', data.materialName);
+ console.log('模型控制类型:', data.modelControlType); // 'rotation' | 'color' | undefined
+
+ // 根据控制类型执行不同操作
+ if (data.modelControlType === 'rotation') {
+ console.log('这是一个可旋转的模型');
+ // 执行旋转相关操作 - 直接使用角度
+ kernel.transform.rotation({
+ modelId: "卷帘大",
+ vector3: { x: 0, y: 180, z: 0 }
+ });
+ } else if (data.modelControlType === 'color') {
+ console.log('这是一个可改变颜色的模型');
+ // 执行颜色相关操作
+ kernel.material.color(data.materialName, '#FF0000');
+ }
+});
+```
+
+## ModelControlType 说明
+
+- `rotation`: 表示该模型支持旋转控制
+- `color`: 表示该模型支持颜色控制
+- `undefined`: 未指定控制类型
+
+## 完整示例
+
+```javascript
+import { kernel } from './index.js';
+
+const config = {
+ container: document.querySelector('#renderDom'),
+ modelUrlList: [],
+ env: {
+ envPath: 'https://sdk.zguiy.com/resurces/hdr/hdr.env',
+ intensity: 1.2,
+ rotationY: 0.3,
+ background: true
+ },
+};
+
+kernel.init(config);
+
+// 添加多个模型
+kernel.model.add({
+ modelId: "框架",
+ modelUrl: "https://sdk.zguiy.com/resurces/model/框架.glb"
+});
+
+kernel.model.add({
+ modelId: "卷帘大",
+ modelUrl: "https://sdk.zguiy.com/resurces/model/卷帘大.glb",
+ modelControlType: "rotation"
+});
+
+kernel.model.add({
+ modelId: "小桌",
+ modelUrl: "https://sdk.zguiy.com/resurces/model/小桌.glb",
+ modelControlType: "color"
+});
+
+// 模型加载完成后设置变换
+kernel.on('model:loaded', () => {
+ // 设置初始位置
+ kernel.transform.position({
+ modelId: "小桌",
+ vector3: { x: 5, y: 0, z: 0 }
+ });
+
+ // 设置初始旋转 - 直接使用角度
+ kernel.transform.rotation({
+ modelId: "卷帘大",
+ vector3: { x: 0, y: 45, z: 0 }
+ });
+
+ // 设置缩放
+ kernel.transform.scale({
+ modelId: "框架",
+ vector3: { x: 1.2, y: 1.2, z: 1.2 }
+ });
+});
+
+// 监听点击事件
+kernel.on('model:click', (data) => {
+ console.log('模型点击数据:', data);
+
+ if (data.modelControlType === 'rotation') {
+ // 处理旋转逻辑 - 每次点击旋转45度
+ kernel.transform.rotation({
+ modelId: data.meshName,
+ vector3: { x: 0, y: 45, z: 0 }
+ });
+ } else if (data.modelControlType === 'color') {
+ // 处理颜色变更逻辑
+ kernel.material.color(data.materialName, '#FF0000');
+ }
+});
+```
+
+## Transform API 详细说明
+
+### rotation - 旋转
+- 参数:`{ modelId: string, vector3: { x, y, z }, useDegrees?: boolean }`
+- **默认使用角度**:直接传递 90、180 等角度值
+- 如需使用弧度,设置 `useDegrees: false`
+- 示例:
+ ```javascript
+ // 使用角度(默认,推荐)
+ kernel.transform.rotation({
+ modelId: "model1",
+ vector3: { x: 0, y: 90, z: 0 }
+ });
+
+ // 使用弧度
+ kernel.transform.rotation({
+ modelId: "model1",
+ vector3: { x: 0, y: Math.PI / 2, z: 0 },
+ useDegrees: false
+ });
+ ```
+
+### position - 位置
+- 参数:`{ modelId: string, vector3: { x, y, z } }`
+- 单位:场景单位
+- 坐标系:右手坐标系(X右,Y上,Z前)
+
+### scale - 缩放
+- 参数:`{ modelId: string, vector3: { x, y, z } }`
+- 单位:倍数(1.0 = 原始大小)
+- 可以设置不同轴向的缩放比例
diff --git a/examples/module-demo.js b/examples/module-demo.js
index 835eeb2..d5a9f63 100644
--- a/examples/module-demo.js
+++ b/examples/module-demo.js
@@ -15,10 +15,25 @@ const config = {
};
kernel.init(config);
-kernel.model.add("卷帘大", "https://sdk.zguiy.com/resurces/model/框架.glb")
-kernel.model.add("卷帘大", "https://sdk.zguiy.com/resurces/model/卷帘大.glb")
-kernel.model.add("卷帘小", "https://sdk.zguiy.com/resurces/model/卷帘小.glb")
-kernel.model.add("小桌", "https://sdk.zguiy.com/resurces/model/小桌.glb")
+kernel.model.add({
+ modelId: "框架",
+ modelUrl: "https://sdk.zguiy.com/resurces/model/框架.glb"
+});
+kernel.model.add({
+ modelId: "卷帘大",
+ modelUrl: "https://sdk.zguiy.com/resurces/model/卷帘大.glb",
+ modelControlType: "rotation"
+});
+kernel.model.add({
+ modelId: "卷帘小",
+ modelUrl: "https://sdk.zguiy.com/resurces/model/卷帘小.glb",
+ modelControlType: "rotation"
+});
+kernel.model.add({
+ modelId: "小桌",
+ modelUrl: "https://sdk.zguiy.com/resurces/model/小桌.glb",
+ modelControlType: "color"
+});
kernel.on('model:load:progress', (data) => {
console.log('模型加载事件', data);
@@ -64,7 +79,7 @@ let currentPickedMesh = null;
kernel.on('model:click', (data) => {
console.log('模型点击事件', data);
- console.log(data);
+ console.log('模型控制类型:', data.modelControlType);
// DOM 2D转3D 示例:点击模型时显示信息框
if (data.pickedMesh && data.pickedPoint) {
diff --git a/index.html b/index.html
index d924757..c89cdb7 100644
--- a/index.html
+++ b/index.html
@@ -315,7 +315,8 @@
名称: -
坐标: -
-
+
+
+
+
+
+
+
+