From 84c8752e0bbf3f7a281a72ad00d57a3cec6ae9ec Mon Sep 17 00:00:00 2001
From: zguiy <1415466602@qq.com>
Date: Fri, 22 May 2026 13:33:13 +0800
Subject: [PATCH] 1
---
ScreenShot_2026-05-21_102602_338.png | Bin 0 -> 8171 bytes
examples/app-global copy.js | 369 -
examples/app-global.js | 98 +-
examples/app-global.zip | Bin 0 -> 10273 bytes
examples/demo-global.html | 936 +-
examples/demo-global.html.backup | 912 +
examples/demo-global1.html | 951 +
examples/index.global.js | 359378 ++++++++++++++++++++++++
index.html | 126 +-
index.js | 23 +-
src/babylonjs/AppCamera.ts | 2 +-
src/babylonjs/AppEngin.ts | 4 +
src/babylonjs/AppEnv.ts | 32 +-
src/babylonjs/AppGround.ts | 11 +-
src/babylonjs/AppLight.ts | 7 +-
src/babylonjs/AppRay.ts | 5 +-
src/babylonjs/GameManager.ts | 6 +-
17 files changed, 361939 insertions(+), 921 deletions(-)
create mode 100644 ScreenShot_2026-05-21_102602_338.png
delete mode 100644 examples/app-global copy.js
create mode 100644 examples/app-global.zip
create mode 100644 examples/demo-global.html.backup
create mode 100644 examples/demo-global1.html
create mode 100644 examples/index.global.js
diff --git a/ScreenShot_2026-05-21_102602_338.png b/ScreenShot_2026-05-21_102602_338.png
new file mode 100644
index 0000000000000000000000000000000000000000..8014c85c98c11a88d049be26d3a3e7da0cc3698c
GIT binary patch
literal 8171
zcmcJUcR1UB_y1EAMQhZk(W+MM(Na4owfCk3ReRGATS}=aI;cHTdqk)bqp_+jr3keu
z_THP=$?x6I=l8qr-}nCKdw<7$T_kzGuUxO3*E!GkIgi&lu?BkTm#NsOKp@a%O$`+z
z5Qu~V_>89{0bY9&tB--VOFkNppdiqdZ-4$TBnw_)2Z1=VHC2>M0<$(ILQIU!^AxwU
zDY$5FJ|MZ}U2gx5X4fq}z4qa|D@uMvD0_FSSFg$?)^M)y14H$W4)5?aDeVsT;$(&P
z=1s_yY?GTxg?=-E|nL$17!FC(t(Z3`n0h0mva
z
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 {
- const kernel = getKernel();
-
- const { wallName, index, transform } = dropzone_data;
- const { position, rotation } = transform;
-
- for (const event of result.data.events) {
- if (event.event_type === 'change_model') {
- console.log(event.target_data);
-
- const { id, name, file_url, model_control_type, category } = event.target_data;
- console.log('替换百叶模型:', event);
- console.log('替换百叶模型类型:', category);
-
- // 生成唯一的模型ID
- const modelId = id + '_' + Date.now();
-
- // 先记录模型放置(会自动处理替换逻辑)
- kernel.dropZone.recordModelPlacement(wallName, index, modelId);
- console.log(Math.abs(rotation.y - 90), Math.abs(rotation.y - 90) > 5 ? 'x' : 'z');
- // 加载并放置模型
- await kernel.model.add({
- modelId: modelId,
- modelUrl: file_url,
- modelControlType: model_control_type,
- drag: {
- enable: true,
- axis: rotation.y === 0 || rotation.y === 180 ? 'x' : 'z',
- step: 0.1,
- },
- transform: {
- position: position,
- rotation: rotation,
- }
- });
-
- console.log(`百叶模型已放置为 ${name}`);
- }
-
- if (event.event_type === 'change_color') {
- const materialName = event.material_name;
- const { color, color_map_url, normal_map_url, metallic, roughness } = event.target_data;
- console.log('替换百叶模型颜色:', event.target_data);
-
- kernel.material.apply({
- target: materialName,
- albedoColor: color,
- albedoTexture: color_map_url,
- normalMap: normal_map_url,
- metallic: metallic,
- roughness: roughness
- });
-
- console.log(`百叶模型颜色已替换为 ${color}`);
- }
- }
- }
-
- /**
- * 加载热点
- */
- async function getHotspot() {
- var kernel = getKernel();
-
- try {
- var response = await fetch(apiConfig.getApiUrl('/api/hotspots?status=active&page=1&pageSize=100'));
- var result = await response.json();
-
- if (result.code === 200 && result.data.list.length > 0) {
- var hotspots = result.data.list.map(function (item) {
- return {
- id: item.id,
- type: 'hotspot',
- name: item.name,
- meshName: item.name,
- icon: item.image_url,
- position: [item.position_x, item.position_y, item.position_z],
- radius: item.radius,
- color: "#000000",
- payload: {
- skus: item.skus || []
- }
- };
- });
-
- kernel.hotspot.render(hotspots);
- console.log('热点渲染成功:', hotspots);
- } else {
- console.log('没有可用的热点数据');
- }
- } catch (error) {
- console.error('获取热点数据失败:', error);
- }
- }
-
- /**
- * 获取产品配置
- */
- async function getProductConfig(sku) {
- try {
- var response = await fetch(apiConfig.getApiUrl('/api/product-configs/by-sku/' + sku));
- var result = await response.json();
-
- if (result.code === 200) {
- console.log(result.data);
- var enable_placement_zone = result.data.enable_placement_zone;
-
- if (enable_placement_zone) {
- getPlacementZone(sku);
- } else {
- executeEvent2(result);
- }
- }
- } catch (error) {
- console.error('获取产品配置失败:', error);
- }
- }
-
- // 暴露到全局
- window.AppLogic = {
- initApp: initApp,
- init: init,
- getAutoLoadModelList: getAutoLoadModelList,
- getPlacementZone: getPlacementZone,
- getEvent: getEvent,
- executeEvent: executeEvent,
- executeEvent2: executeEvent2,
- getHotspot: getHotspot,
- getProductConfig: getProductConfig
- };
-
-})(window);
diff --git a/examples/app-global.js b/examples/app-global.js
index f1cc63b..dce56a5 100644
--- a/examples/app-global.js
+++ b/examples/app-global.js
@@ -15,6 +15,9 @@ const initApp = (kernel) => {
return kernelInstance;
};
+//全局唯一棚子sku
+let pergolaSku = ""
+
/**
* 获取当前 kernel 实例
*/
@@ -32,7 +35,7 @@ const init = async (customConfig = {}) => {
const defaultConfig = {
container: document.querySelector('#renderDom'),
modelUrlList: [],
- env: { envPath: 'https://sdk.zguiy.com/resurces/hdr/hdr.env', intensity: 1.2, rotationY: 0.3, background: true },
+ env: { envPath: 'https://cdn.files.zguiy.com/zt/environment.env', intensity: 1.2, rotationY: 0.3, background: false },
gizmo: {
position: false,
rotation: false,
@@ -57,15 +60,15 @@ const getAutoLoadModelList = async () => {
const kernel = getKernel();
const url = getApiUrl('/api/models/auto-load/list')
- console.log('API URL:', url)
const response = await fetch(url)
const data = await response.json()
const models = data.data // 这就是模型列表
models.forEach(model => {
- console.log(model.placement_zone);
+
if (model.placement_zone) {
const { alpha, border_color, color, show_border, thickness, walls } = model.placement_zone
+
kernel.dropZone.setData({
color: color,
@@ -78,6 +81,7 @@ const getAutoLoadModelList = async () => {
}
kernel.model.add({
+ modelName: model.name + '_' + model.category,
modelId: model.category,
modelUrl: model.file_url,
modelControlType: model.model_control_type,
@@ -88,7 +92,45 @@ const getAutoLoadModelList = async () => {
//获取放置区域
const getPlacementZone = async (sku) => {
+ //pergolaSku 是需要在加载棚子的时取其引用,传进来的sku则是配件的sku,根据配件的sku来判断放置区域
const kernel = getKernel();
+ let division_include = []
+ // 同时包含10和13
+ const only10_13 = /(?=.*10)(?=.*13)/.test(pergolaSku)
+ // 只包含10 无13 无12
+ const only10 = /(?=.*10)(?!.*13)(?!.*12)/.test(pergolaSku)
+ // 同时包含10和12
+ const only10_12 = /(?=.*10)(?=.*12)/.test(pergolaSku)
+
+ // 1. 只要字符串里包含 10,就返回 true
+ const has10 = /10/.test(sku);
+
+ // 2. 只要字符串里包含 13,就返回 true
+ const has13 = /13/.test(sku);
+
+ // 2. 只要字符串里包含 12,就返回 true
+ const has12 = /12/.test(sku);
+
+ //棚子包含10,不包含13 并且配件是10 说明是正方体 或者是10*20的
+ if (only10 && has10) {
+ division_include.push('前', '后', '左', '右', "前1", "后1", "前2", "后2")
+ }
+ //棚子同时包10和13的并且含配件是10
+ if (only10_13 && has10) {
+ division_include.push('左', '右')
+ }
+ //棚子同时包10和13的并且含配件是13
+ if (only10_13 && has13) {
+ division_include.push('前', '后')
+ }
+ //棚子同时包10和12的并且含配件是12
+ if (only10_12 && has12) {
+ division_include.push('前', '后')
+ }
+ //棚子同时包10和12的并且含配件是10
+ if (only10_12 && has10) {
+ division_include.push('左', '右')
+ }
const response = await fetch(getApiUrl(`/api/product-configs/by-sku/${sku}`));
const result = await response.json();
@@ -97,11 +139,14 @@ const getPlacementZone = async (sku) => {
const { enable_placement_zone, wall_divisions } = result.data;
// const {position_x, position_y, position_z} = data;
if (enable_placement_zone && wall_divisions != undefined) {
+ console.log(wall_divisions);
+ const filteredDivisions = wall_divisions.filter(item => division_include.includes(item.name))
+ console.log(filteredDivisions);
// 只清除旧的放置区域网格,不清除模型
kernel.dropZone.clearZones();
- const divisions = wall_divisions.map(wall => ({
- name: wall.name, // 获取最后一个下划线后的部分
+ const divisions = filteredDivisions.map(wall => ({
+ name: wall.name,
divisions: wall.divisions
}))
@@ -114,6 +159,7 @@ const getPlacementZone = async (sku) => {
//执行事件
const getEvent = async (dropzone_data, sku) => {
+
// 将模型放置到该区域
try {
const response = await fetch(getApiUrl(`/api/product-configs/by-sku/${sku}`));
@@ -124,7 +170,7 @@ const getEvent = async (dropzone_data, sku) => {
console.log('关联事件:', result.data.events);
// 使用 for...of 循环以支持 await
- await executeEvent(dropzone_data, result)
+ await executeEvent(dropzone_data, result, sku)
} else {
console.log(`未查询到数据`);
}
@@ -133,15 +179,17 @@ const getEvent = async (dropzone_data, sku) => {
}
}
-//点击放置区域执行事件
-const executeEvent = async (dropzone_data, result) => {
- const kernel = getKernel();
+//点击放置区域执行事件 一般是换配件
+const executeEvent = async (dropzone_data, result, sku) => {
+ const kernel = getKernel();
const { wallName, index, transform } = dropzone_data;
const { position, rotation } = transform;
let modelId = null; // 在外部声明,用于在两个循环之间传递
let modelName = null;
+ let pergolaSku = null; // 用于存储棚子的 SKU
+
// 第一次循环:处理 change_model
for (const event of result.data.events) {
if (event.event_type === 'change_model') {
@@ -191,6 +239,18 @@ const executeEvent = async (dropzone_data, result) => {
console.log(`百叶模型颜色已替换为 ${color}`);
}
}
+
+ // 查找棚子的 SKU(从已加载的模型中查找 model_control_type 为 'pergola' 的模型)
+ const allModels = kernel.model.getAllMetadata();
+ for (const model of allModels) {
+ if (model.modelControlType === 'pergola') {
+ // 棚子模型找到了,可以在这里做其他处理
+ console.log('找到棚子模型:', model.modelId);
+ break;
+ }
+ }
+
+ return pergolaSku;
}
/**
@@ -205,7 +265,7 @@ const isModelExists = (modelId) => {
}
//一般是换棚子/换颜色/设置放置区域
- const executeEvent2 = async (result) => {
+ const executeEvent2 = async (result, sku) => {
const kernel = getKernel();
// 检查是否有模型更换事件
@@ -221,19 +281,18 @@ const isModelExists = (modelId) => {
console.log(`检查模型 ${name + '_' + category} 是否存在:`, modelAlreadyExists);
}
}
-
+ kernel.dropZone.hide();
// 只有在需要更换模型且模型不存在时才清除
if (hasModelChange && !modelAlreadyExists) {
console.log('模型不存在,执行清除操作');
kernel.model.removeAll();
- } else if (modelAlreadyExists) {
- kernel.dropZone.hide();
- console.log('模型已存在,跳过清除操作,仅更新材质');
}
// 先处理所有 change_model 事件
for (const event of result.data.events) {
+ console.log(event);
+
if (event.event_type === 'change_model') {
const { target_data } = event;
console.log(event.target_data);
@@ -338,12 +397,19 @@ const getProductConfig = async (sku) => {
if (result.code === 200) {
console.log(result.data);
const { enable_placement_zone } = result.data;
- // await initPlacementZoneConfig();
+ //如果触发的是配件,需要显示放置区域
+
if (enable_placement_zone) {
+ if (pergolaSku === "") {
+ console.error("请先加载棚子模型")
+ return;
+ }
getPlacementZone(sku)
}
+ //如果触发的是换棚子模型
else {
- executeEvent2(result)
+ pergolaSku = sku;
+ executeEvent2(result, sku)
}
}
} catch (error) {
diff --git a/examples/app-global.zip b/examples/app-global.zip
new file mode 100644
index 0000000000000000000000000000000000000000..4e72b44ebe5d14ca63209808ede4987401e611cf
GIT binary patch
literal 10273
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
-
-
- |
+
+
+
+
+
+
+
选装选配
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 13
+
+
+
+ 10
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
模型信息
+
名称: -
+
坐标: -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/examples/demo-global.html.backup b/examples/demo-global.html.backup
new file mode 100644
index 0000000..4c1ab57
--- /dev/null
+++ b/examples/demo-global.html.backup
@@ -0,0 +1,912 @@
+
+
+
+