This commit is contained in:
2026-04-30 17:54:29 +08:00
parent 9fe4e5f067
commit 0f4c17e67f
+23 -15
View File
@@ -537,6 +537,19 @@ class HTMLGenerator:
// 统一按场景包围盒调整相机,避免模型错位/尺度不一致导致观感混乱 // 统一按场景包围盒调整相机,避免模型错位/尺度不一致导致观感混乱
fitCameraToScene(); 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() {{ function animate() {{
requestAnimationFrame(animate); requestAnimationFrame(animate);
@@ -610,7 +623,7 @@ class HTMLGenerator:
}} }}
function splitMold() {{ function splitMold() {{
if (!cavityMesh && !coreMesh) return; if (!cavityMesh || !coreMesh) return;
isSplit = !isSplit; isSplit = !isSplit;
const btn = document.getElementById('splitBtn'); const btn = document.getElementById('splitBtn');
btn.textContent = isSplit ? '合模' : '分模拆分'; btn.textContent = isSplit ? '合模' : '分模拆分';
@@ -618,33 +631,28 @@ class HTMLGenerator:
const bboxDims = geometryData.bounding_box?.dimensions || [100, 100, 100]; const bboxDims = geometryData.bounding_box?.dimensions || [100, 100, 100];
const dir = getPartingDirection(); const dir = getPartingDirection();
// 根据分模方向确定拆分轴和距离
let splitDist, axis; let splitDist, axis;
if (dir === 'Z') {{ if (dir === 'Z') {{
// Z轴上下开模:拆分距离取 Z 方向高度的 40%
splitDist = bboxDims[2] * 0.4; splitDist = bboxDims[2] * 0.4;
axis = 'z'; axis = 'z';
}} else if (dir === 'Y') {{ }} else if (dir === 'Y') {{
// Y轴前后开模
splitDist = bboxDims[1] * 0.4; splitDist = bboxDims[1] * 0.4;
axis = 'y'; axis = 'y';
}} else {{ }} else {{
// X轴左右开模
splitDist = bboxDims[0] * 0.4; splitDist = bboxDims[0] * 0.4;
axis = 'x'; axis = 'x';
}} }}
// 分型面动画目标透明度 const partingTargetOpacity = isSplit ? 0 : partingHomeOpacity;
const partingTargetOpacity = isSplit ? 0 : 0.3;
// 记录起始位置 const cavityStart = cavityMesh.position[axis];
const cavityStart = cavityMesh ? cavityMesh.position[axis] : 0; const coreStart = coreMesh.position[axis];
const coreStart = coreMesh ? coreMesh.position[axis] : 0; const cavityHome = cavityHomePos[axis];
const coreHome = coreHomePos[axis];
const partingStartOpacity = partingMesh ? partingMesh.material.opacity : 0.3; const partingStartOpacity = partingMesh ? partingMesh.material.opacity : 0.3;
// 目标位置:型腔正向移动,型芯负向移动 const cavityTarget = isSplit ? (cavityHome + splitDist) : cavityHome;
const cavityTarget = isSplit ? splitDist : 0; const coreTarget = isSplit ? (coreHome - splitDist) : coreHome;
const coreTarget = isSplit ? -splitDist : 0;
const duration = 800; // ms const duration = 800; // ms
const startTime = performance.now(); const startTime = performance.now();
@@ -665,17 +673,17 @@ class HTMLGenerator:
}} }}
if (partingMesh) {{ if (partingMesh) {{
partingMesh.material.opacity = partingStartOpacity + (partingTargetOpacity - partingStartOpacity) * ease; partingMesh.material.opacity = partingStartOpacity + (partingTargetOpacity - partingStartOpacity) * ease;
if (isSplit && t >= 1) partingMesh.visible = false;
else partingMesh.visible = true;
}} }}
if (t < 1) {{ if (t < 1) {{
splitAnimId = requestAnimationFrame(animateSplit); splitAnimId = requestAnimationFrame(animateSplit);
}} else {{ }} else {{
splitAnimId = null; splitAnimId = null;
if (partingMesh) partingMesh.visible = !isSplit;
}} }}
}} }}
if (partingMesh) partingMesh.visible = true;
splitAnimId = requestAnimationFrame(animateSplit); splitAnimId = requestAnimationFrame(animateSplit);
}} }}
</script> </script>