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();
// 保存各组件原始位置(分模动画合模时复原用)
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);
}}
</script>