x
This commit is contained in:
+23
-15
@@ -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>
|
||||||
|
|||||||
Reference in New Issue
Block a user