diff --git a/src/utils/html_generator.py b/src/utils/html_generator.py index df0245d..616f000 100644 --- a/src/utils/html_generator.py +++ b/src/utils/html_generator.py @@ -537,6 +537,19 @@ class HTMLGenerator: // 统一按场景包围盒调整相机,避免模型错位/尺度不一致导致观感混乱 fitCameraToScene(); + // 保存各组件原始位置(分模动画合模时复原用) + const cavityHomePos = {{ + x: cavityMesh ? cavityMesh.position.x : 0, + y: cavityMesh ? cavityMesh.position.y : 0, + z: cavityMesh ? cavityMesh.position.z : 0, + }}; + const coreHomePos = {{ + x: coreMesh ? coreMesh.position.x : 0, + y: coreMesh ? coreMesh.position.y : 0, + z: coreMesh ? coreMesh.position.z : 0, + }}; + const partingHomeOpacity = partingMesh ? partingMesh.material.opacity : 0.3; + // 动画循环 function animate() {{ requestAnimationFrame(animate); @@ -610,7 +623,7 @@ class HTMLGenerator: }} function splitMold() {{ - if (!cavityMesh && !coreMesh) return; + if (!cavityMesh || !coreMesh) return; isSplit = !isSplit; const btn = document.getElementById('splitBtn'); btn.textContent = isSplit ? '合模' : '分模拆分'; @@ -618,33 +631,28 @@ class HTMLGenerator: const bboxDims = geometryData.bounding_box?.dimensions || [100, 100, 100]; const dir = getPartingDirection(); - // 根据分模方向确定拆分轴和距离 let splitDist, axis; if (dir === 'Z') {{ - // Z轴上下开模:拆分距离取 Z 方向高度的 40% splitDist = bboxDims[2] * 0.4; axis = 'z'; }} else if (dir === 'Y') {{ - // Y轴前后开模 splitDist = bboxDims[1] * 0.4; axis = 'y'; }} else {{ - // X轴左右开模 splitDist = bboxDims[0] * 0.4; axis = 'x'; }} - // 分型面动画目标透明度 - const partingTargetOpacity = isSplit ? 0 : 0.3; + const partingTargetOpacity = isSplit ? 0 : partingHomeOpacity; - // 记录起始位置 - const cavityStart = cavityMesh ? cavityMesh.position[axis] : 0; - const coreStart = coreMesh ? coreMesh.position[axis] : 0; + const cavityStart = cavityMesh.position[axis]; + const coreStart = coreMesh.position[axis]; + const cavityHome = cavityHomePos[axis]; + const coreHome = coreHomePos[axis]; const partingStartOpacity = partingMesh ? partingMesh.material.opacity : 0.3; - // 目标位置:型腔正向移动,型芯负向移动 - const cavityTarget = isSplit ? splitDist : 0; - const coreTarget = isSplit ? -splitDist : 0; + const cavityTarget = isSplit ? (cavityHome + splitDist) : cavityHome; + const coreTarget = isSplit ? (coreHome - splitDist) : coreHome; const duration = 800; // ms const startTime = performance.now(); @@ -665,17 +673,17 @@ class HTMLGenerator: }} if (partingMesh) {{ partingMesh.material.opacity = partingStartOpacity + (partingTargetOpacity - partingStartOpacity) * ease; - if (isSplit && t >= 1) partingMesh.visible = false; - else partingMesh.visible = true; }} if (t < 1) {{ splitAnimId = requestAnimationFrame(animateSplit); }} else {{ splitAnimId = null; + if (partingMesh) partingMesh.visible = !isSplit; }} }} + if (partingMesh) partingMesh.visible = true; splitAnimId = requestAnimationFrame(animateSplit); }}