diff --git a/reports/bridge-grounding-20260914/86.json b/reports/bridge-grounding-20260914/86.json
new file mode 100644
index 0000000..83cb147
--- /dev/null
+++ b/reports/bridge-grounding-20260914/86.json
@@ -0,0 +1,491 @@
+{
+ "mounted": true,
+ "hasEnvironment": true,
+ "hasEnvironmentTarget": true,
+ "toneMappingExposure": 1.05,
+ "background": "a8cbe1",
+ "meshCount": 45,
+ "materials": [
+ {
+ "name": "M_3dfreehub_mat_2",
+ "color": "ffffff",
+ "metalness": 0,
+ "roughness": 0.5,
+ "envMapIntensity": 1,
+ "hasMap": true,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "M_3dfreehub_mat_3",
+ "color": "ffffff",
+ "metalness": 0,
+ "roughness": 0.5,
+ "envMapIntensity": 1,
+ "hasMap": true,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "M_3dfreehub_mat_4",
+ "color": "ffffff",
+ "metalness": 0,
+ "roughness": 0.5,
+ "envMapIntensity": 1,
+ "hasMap": true,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "M_3dfreehub_mat_5",
+ "color": "ffffff",
+ "metalness": 0,
+ "roughness": 0.5,
+ "envMapIntensity": 1,
+ "hasMap": true,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "Material__85",
+ "color": "695c5b",
+ "metalness": 0,
+ "roughness": 0.5,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "BaiSe",
+ "color": "ffffff",
+ "metalness": 0,
+ "roughness": 0.5,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "Cai1",
+ "color": "3d4b3b",
+ "metalness": 0.6,
+ "roughness": 0.5,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "HeiSe",
+ "color": "4f4f4f",
+ "metalness": 0.3,
+ "roughness": 0.5,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "JinShu",
+ "color": "929292",
+ "metalness": 0.6,
+ "roughness": 0.5,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "LanSe",
+ "color": "3b76d0",
+ "metalness": 0.6,
+ "roughness": 0.5,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "LvSe",
+ "color": "3d4b3b",
+ "metalness": 0.6,
+ "roughness": 0.5,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "Mat_black",
+ "color": "322e2e",
+ "metalness": 0,
+ "roughness": 0.5,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "Mat_supportBridgeBridge_01",
+ "color": "ffffff",
+ "metalness": 0,
+ "roughness": 0.5,
+ "envMapIntensity": 1,
+ "hasMap": true,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "Mat_supportBridgeBridge_02",
+ "color": "ffffff",
+ "metalness": 0,
+ "roughness": 0.5,
+ "envMapIntensity": 1,
+ "hasMap": true,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "Mat_supportBridge_05",
+ "color": "ffffff",
+ "metalness": 0,
+ "roughness": 0.5,
+ "envMapIntensity": 1,
+ "hasMap": true,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "Mat_white",
+ "color": "9da3a4",
+ "metalness": 0,
+ "roughness": 0.5,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "Material__1676",
+ "color": "d96e6e",
+ "metalness": 0.6,
+ "roughness": 0.5,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "MoShaJinShu",
+ "color": "cbcbcb",
+ "metalness": 0.8,
+ "roughness": 0.35,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "__",
+ "color": "ffffff",
+ "metalness": 0,
+ "roughness": 0.5,
+ "envMapIntensity": 1,
+ "hasMap": true,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "adskMatMat_supportBridge_05",
+ "color": "ffffff",
+ "metalness": 0,
+ "roughness": 0.5,
+ "envMapIntensity": 1,
+ "hasMap": true,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "adskMatMat_white",
+ "color": "9da3a4",
+ "metalness": 0,
+ "roughness": 0.5,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "ffffff",
+ "metalness": null,
+ "roughness": null,
+ "envMapIntensity": null,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "Material__579",
+ "color": "404040",
+ "metalness": 0,
+ "roughness": 0.5,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "ffffff",
+ "metalness": null,
+ "roughness": null,
+ "envMapIntensity": null,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "Material__1673",
+ "color": "ffffff",
+ "metalness": 0,
+ "roughness": 0.5,
+ "envMapIntensity": 1,
+ "hasMap": true,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "QianlvSe2",
+ "color": "749f62",
+ "metalness": 0,
+ "roughness": 0.6,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "WaiQiang",
+ "color": "ffffff",
+ "metalness": 0,
+ "roughness": 0.5,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "ffffff",
+ "metalness": null,
+ "roughness": null,
+ "envMapIntensity": null,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "ffffff",
+ "metalness": null,
+ "roughness": null,
+ "envMapIntensity": null,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ }
+ ],
+ "server": {
+ "stepId": "front-pump-step-01",
+ "completed": [],
+ "registeredTargets": [
+ "scene:front-pump-rescue-vehicle",
+ "front-pump-hydraulic-pump",
+ "front-pump-power-take-off",
+ "front-pump-pto-switch",
+ "front-pump-ball-valve-switch",
+ "front-pump-aux-control-box",
+ "front-pump-aux-control-box-cover",
+ "front-pump-rescue-switch"
+ ],
+ "readOnly": false,
+ "animations": [
+ {
+ "modelId": "front-pump-field-terrain",
+ "versionId": "",
+ "bindings": 0,
+ "unresolved": 0,
+ "flowVisible": false,
+ "native": []
+ },
+ {
+ "modelId": "front-pump-step-vehicle",
+ "versionId": "",
+ "bindings": 0,
+ "unresolved": 0,
+ "flowVisible": false,
+ "native": []
+ }
+ ]
+ },
+ "bridgeWorkshop": null,
+ "bridgeGrounding": [
+ {
+ "adjustment": 1.418086860486326,
+ "contacts": 22,
+ "minGap": 0,
+ "maxGap": 1.654042585678425,
+ "position": [
+ 0,
+ 1.418086860486326,
+ 0
+ ]
+ }
+ ],
+ "publishedContentMounted": true,
+ "publishedContentName": "架桥车前泵故障互救处置训练场景",
+ "publishedTrainingContent": {
+ "sceneId": "SCENE-FRONT-PUMP-RESCUE-01",
+ "objectCount": 2
+ },
+ "proceduralMachineVisible": false,
+ "publishedModelRootCount": 2,
+ "framing": {
+ "cameraPosition": [
+ 10.6,
+ 6.4,
+ 13.2
+ ],
+ "controlsTarget": [
+ 0,
+ 1.9,
+ 0
+ ],
+ "distance": 17.52,
+ "minDistance": 0.05,
+ "maxDistance": 800,
+ "fov": 45,
+ "near": 0.1,
+ "far": 800,
+ "fogNear": 70,
+ "fogFar": 240,
+ "modelSize": [
+ 140,
+ 28.34,
+ 116.19
+ ],
+ "modelCenter": [
+ -8.4,
+ 7.33,
+ -34.86
+ ],
+ "stepCameraPolicy": "exterior",
+ "explosionItemCount": 36,
+ "structureNodeCount": 44,
+ "enablePan": true,
+ "outlineActive": false,
+ "labelsVisible": false,
+ "hideOthers": false,
+ "hiddenMeshCount": 0,
+ "keptTargets": [],
+ "targetOnScreen": {
+ "targetId": "front-pump-hydraulic-pump",
+ "localX": 647,
+ "localY": 392,
+ "insideCanvas": true,
+ "visible": true,
+ "coveredBy": []
+ },
+ "keptOpacity": [],
+ "environmentAlignment": {
+ "pickedAt": [
+ 8.4,
+ -10.31,
+ 34.86
+ ],
+ "localRelief": 0.265,
+ "samples": 115
+ },
+ "sceneObjects": [
+ {
+ "name": "野外山地训练场",
+ "min": [
+ -78.4,
+ -6.84,
+ -92.96
+ ],
+ "max": [
+ 61.6,
+ 21.5,
+ 23.24
+ ]
+ },
+ {
+ "name": "架桥车前泵互救操作整车模型",
+ "min": [
+ -0.92,
+ 1.42,
+ -4
+ ],
+ "max": [
+ 0.92,
+ 3.39,
+ 4
+ ]
+ }
+ ],
+ "labelSamples": [
+ {
+ "targetId": "scene:front-pump-rescue-vehicle",
+ "targetName": "",
+ "partName": "架桥车前泵互救操作整车模型"
+ },
+ {
+ "targetId": "front-pump-hydraulic-pump",
+ "targetName": "",
+ "partName": "液压泵"
+ },
+ {
+ "targetId": "front-pump-power-take-off",
+ "targetName": "",
+ "partName": "取力器"
+ },
+ {
+ "targetId": "front-pump-pto-switch",
+ "targetName": "",
+ "partName": "取力器开关"
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/reports/bridge-grounding-20260914/86.png b/reports/bridge-grounding-20260914/86.png
new file mode 100644
index 0000000..8732906
Binary files /dev/null and b/reports/bridge-grounding-20260914/86.png differ
diff --git a/reports/bridge-grounding-20260914/89.json b/reports/bridge-grounding-20260914/89.json
new file mode 100644
index 0000000..1e23b71
--- /dev/null
+++ b/reports/bridge-grounding-20260914/89.json
@@ -0,0 +1,1677 @@
+{
+ "mounted": true,
+ "hasEnvironment": true,
+ "hasEnvironmentTarget": true,
+ "toneMappingExposure": 1.05,
+ "background": "a8cbe1",
+ "meshCount": 78,
+ "materials": [
+ {
+ "name": "M_3dfreehub_mat_2",
+ "color": "ffffff",
+ "metalness": 0,
+ "roughness": 0.5,
+ "envMapIntensity": 1,
+ "hasMap": true,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "M_3dfreehub_mat_3",
+ "color": "ffffff",
+ "metalness": 0,
+ "roughness": 0.5,
+ "envMapIntensity": 1,
+ "hasMap": true,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "M_3dfreehub_mat_4",
+ "color": "ffffff",
+ "metalness": 0,
+ "roughness": 0.5,
+ "envMapIntensity": 1,
+ "hasMap": true,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "M_3dfreehub_mat_5",
+ "color": "ffffff",
+ "metalness": 0,
+ "roughness": 0.5,
+ "envMapIntensity": 1,
+ "hasMap": true,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "Material__85",
+ "color": "695c5b",
+ "metalness": 0,
+ "roughness": 0.5,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "BaiSe",
+ "color": "ffffff",
+ "metalness": 0,
+ "roughness": 0.5,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "Cai1",
+ "color": "3d4b3b",
+ "metalness": 0.6,
+ "roughness": 0.5,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "HeiSe",
+ "color": "4f4f4f",
+ "metalness": 0.3,
+ "roughness": 0.5,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "JinShu",
+ "color": "929292",
+ "metalness": 0.6,
+ "roughness": 0.5,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "LanSe",
+ "color": "3b76d0",
+ "metalness": 0.6,
+ "roughness": 0.5,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "LvSe",
+ "color": "3d4b3b",
+ "metalness": 0.6,
+ "roughness": 0.5,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "Mat_black",
+ "color": "322e2e",
+ "metalness": 0,
+ "roughness": 0.5,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "Mat_supportBridgeBridge_01",
+ "color": "ffffff",
+ "metalness": 0,
+ "roughness": 0.5,
+ "envMapIntensity": 1,
+ "hasMap": true,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "Mat_supportBridgeBridge_02",
+ "color": "ffffff",
+ "metalness": 0,
+ "roughness": 0.5,
+ "envMapIntensity": 1,
+ "hasMap": true,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "Mat_supportBridge_05",
+ "color": "ffffff",
+ "metalness": 0,
+ "roughness": 0.5,
+ "envMapIntensity": 1,
+ "hasMap": true,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "Mat_white",
+ "color": "9da3a4",
+ "metalness": 0,
+ "roughness": 0.5,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "Material__1676",
+ "color": "d96e6e",
+ "metalness": 0.6,
+ "roughness": 0.5,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "MoShaJinShu",
+ "color": "cbcbcb",
+ "metalness": 0.8,
+ "roughness": 0.35,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "__",
+ "color": "ffffff",
+ "metalness": 0,
+ "roughness": 0.5,
+ "envMapIntensity": 1,
+ "hasMap": true,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "adskMatMat_supportBridge_05",
+ "color": "ffffff",
+ "metalness": 0,
+ "roughness": 0.5,
+ "envMapIntensity": 1,
+ "hasMap": true,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "adskMatMat_white",
+ "color": "9da3a4",
+ "metalness": 0,
+ "roughness": 0.5,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "ffffff",
+ "metalness": null,
+ "roughness": null,
+ "envMapIntensity": null,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "Material__579",
+ "color": "404040",
+ "metalness": 0,
+ "roughness": 0.5,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "ffffff",
+ "metalness": null,
+ "roughness": null,
+ "envMapIntensity": null,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "Material__1673",
+ "color": "ffffff",
+ "metalness": 0,
+ "roughness": 0.5,
+ "envMapIntensity": 1,
+ "hasMap": true,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "QianlvSe2",
+ "color": "749f62",
+ "metalness": 0,
+ "roughness": 0.6,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "WaiQiang",
+ "color": "ffffff",
+ "metalness": 0,
+ "roughness": 0.5,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "ffffff",
+ "metalness": null,
+ "roughness": null,
+ "envMapIntensity": null,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "ffffff",
+ "metalness": null,
+ "roughness": null,
+ "envMapIntensity": null,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "254b50",
+ "metalness": 0.55,
+ "roughness": 0.45,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "456068",
+ "metalness": 0.55,
+ "roughness": 0.45,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "456068",
+ "metalness": 0.55,
+ "roughness": 0.45,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "456068",
+ "metalness": 0.55,
+ "roughness": 0.45,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "456068",
+ "metalness": 0.55,
+ "roughness": 0.45,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "31464f",
+ "metalness": 0.55,
+ "roughness": 0.45,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "21b588",
+ "metalness": 0.55,
+ "roughness": 0.45,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "526767",
+ "metalness": 0.55,
+ "roughness": 0.45,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "3c6c86",
+ "metalness": 0.55,
+ "roughness": 0.45,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "223438",
+ "metalness": 0.55,
+ "roughness": 0.45,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "223438",
+ "metalness": 0.55,
+ "roughness": 0.45,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "bdcbd1",
+ "metalness": 0.55,
+ "roughness": 0.45,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "bdcbd1",
+ "metalness": 0.55,
+ "roughness": 0.45,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "bdcbd1",
+ "metalness": 0.55,
+ "roughness": 0.45,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "bdcbd1",
+ "metalness": 0.55,
+ "roughness": 0.45,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "607985",
+ "metalness": 0.55,
+ "roughness": 0.45,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "d1eaf1",
+ "metalness": 0.55,
+ "roughness": 0.45,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "e4ece7",
+ "metalness": 0.55,
+ "roughness": 0.45,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "d9a441",
+ "metalness": 0.55,
+ "roughness": 0.45,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "d9a441",
+ "metalness": 0.55,
+ "roughness": 0.45,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "526767",
+ "metalness": 0.55,
+ "roughness": 0.45,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "8b783d",
+ "metalness": 0.55,
+ "roughness": 0.45,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "223438",
+ "metalness": 0.55,
+ "roughness": 0.45,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "223438",
+ "metalness": 0.55,
+ "roughness": 0.45,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "bdcbd1",
+ "metalness": 0.55,
+ "roughness": 0.45,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "bdcbd1",
+ "metalness": 0.55,
+ "roughness": 0.45,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "bdcbd1",
+ "metalness": 0.55,
+ "roughness": 0.45,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "bdcbd1",
+ "metalness": 0.55,
+ "roughness": 0.45,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "607985",
+ "metalness": 0.55,
+ "roughness": 0.45,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "d1eaf1",
+ "metalness": 0.55,
+ "roughness": 0.45,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "e4ece7",
+ "metalness": 0.55,
+ "roughness": 0.45,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "d9a441",
+ "metalness": 0.55,
+ "roughness": 0.45,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "d9a441",
+ "metalness": 0.55,
+ "roughness": 0.45,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ }
+ ],
+ "server": {
+ "stepId": "BRIDGE-STEP-1",
+ "completed": [],
+ "registeredTargets": [
+ "scene:front-pump-rescue-vehicle",
+ "front-pump-hydraulic-pump",
+ "front-pump-power-take-off",
+ "front-pump-pto-switch",
+ "front-pump-ball-valve-switch",
+ "front-pump-aux-control-box",
+ "front-pump-aux-control-box-cover",
+ "front-pump-rescue-switch",
+ "bridge-engine",
+ "bridge-small-seat",
+ "bridge-small-valve",
+ "bridge-small-bolt-1",
+ "bridge-small-bolt-2",
+ "bridge-small-bolt-3",
+ "bridge-small-bolt-4",
+ "bridge-small-pipe",
+ "bridge-small-bag",
+ "bridge-small-cloth",
+ "bridge-small-plug-1",
+ "bridge-small-plug-2",
+ "bridge-large-seat",
+ "bridge-large-valve",
+ "bridge-large-bolt-1",
+ "bridge-large-bolt-2",
+ "bridge-large-bolt-3",
+ "bridge-large-bolt-4",
+ "bridge-large-pipe",
+ "bridge-large-bag",
+ "bridge-large-cloth",
+ "bridge-large-plug-1",
+ "bridge-large-plug-2"
+ ],
+ "readOnly": false,
+ "animations": [
+ {
+ "modelId": "front-pump-field-terrain",
+ "versionId": "",
+ "bindings": 0,
+ "unresolved": 0,
+ "flowVisible": false,
+ "native": []
+ },
+ {
+ "modelId": "front-pump-step-vehicle",
+ "versionId": "",
+ "bindings": 0,
+ "unresolved": 0,
+ "flowVisible": false,
+ "native": []
+ }
+ ]
+ },
+ "bridgeWorkshop": {
+ "pending": false,
+ "operation": {
+ "targetId": "bridge-small-cloth",
+ "kind": "identify",
+ "directionHint": "清洗并擦净阀体",
+ "effects": [
+ {
+ "targetId": "bridge-small-cloth",
+ "offset": [
+ 0.7,
+ 0,
+ -0.7
+ ]
+ },
+ {
+ "targetId": "bridge-small-valve",
+ "color": 8492701
+ }
+ ],
+ "index": 0,
+ "axis": [
+ 0,
+ 1,
+ 0
+ ],
+ "deltaDegrees": 0,
+ "toleranceDegrees": 6
+ },
+ "operationIndex": 0,
+ "targets": [
+ {
+ "id": "front-pump-hydraulic-pump",
+ "visible": true,
+ "position": [
+ 0,
+ 0,
+ 0
+ ],
+ "scale": [
+ 0.01,
+ 0.01,
+ 0.01
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ],
+ "home": [
+ 0,
+ 0,
+ 0
+ ],
+ "homeScale": [
+ 0.01,
+ 0.01,
+ 0.01
+ ]
+ },
+ {
+ "id": "bridge-engine",
+ "visible": true,
+ "position": [
+ -3,
+ 1.1,
+ 1.2
+ ],
+ "scale": [
+ 1,
+ 1,
+ 1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ],
+ "home": [
+ -3,
+ 1.1,
+ 1.2
+ ],
+ "homeScale": [
+ 1,
+ 1,
+ 1
+ ]
+ },
+ {
+ "id": "bridge-small-seat",
+ "visible": true,
+ "position": [
+ -1.6,
+ 1.1,
+ -0.15
+ ],
+ "scale": [
+ 1,
+ 1,
+ 1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ],
+ "home": [
+ -1.6,
+ 1.1,
+ -0.15
+ ],
+ "homeScale": [
+ 1,
+ 1,
+ 1
+ ]
+ },
+ {
+ "id": "bridge-small-valve",
+ "visible": true,
+ "position": [
+ -1.6,
+ 1.1,
+ 0.15
+ ],
+ "scale": [
+ 1,
+ 1,
+ 1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ],
+ "home": [
+ -1.6,
+ 1.1,
+ 0.15
+ ],
+ "homeScale": [
+ 1,
+ 1,
+ 1
+ ]
+ },
+ {
+ "id": "bridge-small-bolt-1",
+ "visible": true,
+ "position": [
+ -1.9200000000000002,
+ 1.29,
+ 0.42
+ ],
+ "scale": [
+ 1,
+ 1,
+ 1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ],
+ "home": [
+ -1.9200000000000002,
+ 1.29,
+ 0.42
+ ],
+ "homeScale": [
+ 1,
+ 1,
+ 1
+ ]
+ },
+ {
+ "id": "bridge-small-bolt-2",
+ "visible": true,
+ "position": [
+ -1.28,
+ 1.29,
+ 0.42
+ ],
+ "scale": [
+ 1,
+ 1,
+ 1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ],
+ "home": [
+ -1.28,
+ 1.29,
+ 0.42
+ ],
+ "homeScale": [
+ 1,
+ 1,
+ 1
+ ]
+ },
+ {
+ "id": "bridge-small-bolt-3",
+ "visible": true,
+ "position": [
+ -1.9200000000000002,
+ 0.9100000000000001,
+ 0.42
+ ],
+ "scale": [
+ 1,
+ 1,
+ 1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ],
+ "home": [
+ -1.9200000000000002,
+ 0.9100000000000001,
+ 0.42
+ ],
+ "homeScale": [
+ 1,
+ 1,
+ 1
+ ]
+ },
+ {
+ "id": "bridge-small-bolt-4",
+ "visible": true,
+ "position": [
+ -1.28,
+ 0.9100000000000001,
+ 0.42
+ ],
+ "scale": [
+ 1,
+ 1,
+ 1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ],
+ "home": [
+ -1.28,
+ 0.9100000000000001,
+ 0.42
+ ],
+ "homeScale": [
+ 1,
+ 1,
+ 1
+ ]
+ },
+ {
+ "id": "bridge-small-pipe",
+ "visible": true,
+ "position": [
+ -1.2000000000000002,
+ 1.1,
+ 0.1
+ ],
+ "scale": [
+ 1,
+ 1,
+ 1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ],
+ "home": [
+ -1.2000000000000002,
+ 1.1,
+ 0.1
+ ],
+ "homeScale": [
+ 1,
+ 1,
+ 1
+ ]
+ },
+ {
+ "id": "bridge-small-bag",
+ "visible": true,
+ "position": [
+ -0.6500000000000001,
+ 1.1,
+ 0.75
+ ],
+ "scale": [
+ 1,
+ 1,
+ 1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ],
+ "home": [
+ -0.6500000000000001,
+ 1.1,
+ 0.75
+ ],
+ "homeScale": [
+ 1,
+ 1,
+ 1
+ ]
+ },
+ {
+ "id": "bridge-small-cloth",
+ "visible": true,
+ "position": [
+ -2.3,
+ 0.85,
+ 0.9
+ ],
+ "scale": [
+ 1,
+ 1,
+ 1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ],
+ "home": [
+ -2.3,
+ 0.85,
+ 0.9
+ ],
+ "homeScale": [
+ 1,
+ 1,
+ 1
+ ]
+ },
+ {
+ "id": "bridge-small-plug-1",
+ "visible": true,
+ "position": [
+ -1.82,
+ 1.6500000000000001,
+ 0.5
+ ],
+ "scale": [
+ 1,
+ 1,
+ 1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ],
+ "home": [
+ -1.82,
+ 1.1,
+ 0
+ ],
+ "homeScale": [
+ 1,
+ 1,
+ 1
+ ]
+ },
+ {
+ "id": "bridge-small-plug-2",
+ "visible": true,
+ "position": [
+ -1.3800000000000001,
+ 1.6500000000000001,
+ 0.5
+ ],
+ "scale": [
+ 1,
+ 1,
+ 1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ],
+ "home": [
+ -1.3800000000000001,
+ 1.1,
+ 0
+ ],
+ "homeScale": [
+ 1,
+ 1,
+ 1
+ ]
+ },
+ {
+ "id": "bridge-large-seat",
+ "visible": true,
+ "position": [
+ 1.6,
+ 1.1,
+ -0.15
+ ],
+ "scale": [
+ 1,
+ 1,
+ 1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ],
+ "home": [
+ 1.6,
+ 1.1,
+ -0.15
+ ],
+ "homeScale": [
+ 1,
+ 1,
+ 1
+ ]
+ },
+ {
+ "id": "bridge-large-valve",
+ "visible": true,
+ "position": [
+ 1.6,
+ 1.1,
+ 0.15
+ ],
+ "scale": [
+ 1,
+ 1,
+ 1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ],
+ "home": [
+ 1.6,
+ 1.1,
+ 0.15
+ ],
+ "homeScale": [
+ 1,
+ 1,
+ 1
+ ]
+ },
+ {
+ "id": "bridge-large-bolt-1",
+ "visible": true,
+ "position": [
+ 1.28,
+ 1.29,
+ 0.42
+ ],
+ "scale": [
+ 1,
+ 1,
+ 1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ],
+ "home": [
+ 1.28,
+ 1.29,
+ 0.42
+ ],
+ "homeScale": [
+ 1,
+ 1,
+ 1
+ ]
+ },
+ {
+ "id": "bridge-large-bolt-2",
+ "visible": true,
+ "position": [
+ 1.9200000000000002,
+ 1.29,
+ 0.42
+ ],
+ "scale": [
+ 1,
+ 1,
+ 1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ],
+ "home": [
+ 1.9200000000000002,
+ 1.29,
+ 0.42
+ ],
+ "homeScale": [
+ 1,
+ 1,
+ 1
+ ]
+ },
+ {
+ "id": "bridge-large-bolt-3",
+ "visible": true,
+ "position": [
+ 1.28,
+ 0.9100000000000001,
+ 0.42
+ ],
+ "scale": [
+ 1,
+ 1,
+ 1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ],
+ "home": [
+ 1.28,
+ 0.9100000000000001,
+ 0.42
+ ],
+ "homeScale": [
+ 1,
+ 1,
+ 1
+ ]
+ },
+ {
+ "id": "bridge-large-bolt-4",
+ "visible": true,
+ "position": [
+ 1.9200000000000002,
+ 0.9100000000000001,
+ 0.42
+ ],
+ "scale": [
+ 1,
+ 1,
+ 1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ],
+ "home": [
+ 1.9200000000000002,
+ 0.9100000000000001,
+ 0.42
+ ],
+ "homeScale": [
+ 1,
+ 1,
+ 1
+ ]
+ },
+ {
+ "id": "bridge-large-pipe",
+ "visible": true,
+ "position": [
+ 2,
+ 1.1,
+ 0.1
+ ],
+ "scale": [
+ 1,
+ 1,
+ 1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ],
+ "home": [
+ 2,
+ 1.1,
+ 0.1
+ ],
+ "homeScale": [
+ 1,
+ 1,
+ 1
+ ]
+ },
+ {
+ "id": "bridge-large-bag",
+ "visible": true,
+ "position": [
+ 2.55,
+ 1.1,
+ 0.75
+ ],
+ "scale": [
+ 1,
+ 1,
+ 1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ],
+ "home": [
+ 2.55,
+ 1.1,
+ 0.75
+ ],
+ "homeScale": [
+ 1,
+ 1,
+ 1
+ ]
+ },
+ {
+ "id": "bridge-large-cloth",
+ "visible": true,
+ "position": [
+ 0.9000000000000001,
+ 0.85,
+ 0.9
+ ],
+ "scale": [
+ 1,
+ 1,
+ 1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ],
+ "home": [
+ 0.9000000000000001,
+ 0.85,
+ 0.9
+ ],
+ "homeScale": [
+ 1,
+ 1,
+ 1
+ ]
+ },
+ {
+ "id": "bridge-large-plug-1",
+ "visible": true,
+ "position": [
+ 1.3800000000000001,
+ 1.6500000000000001,
+ 0.5
+ ],
+ "scale": [
+ 1,
+ 1,
+ 1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ],
+ "home": [
+ 1.3800000000000001,
+ 1.1,
+ 0
+ ],
+ "homeScale": [
+ 1,
+ 1,
+ 1
+ ]
+ },
+ {
+ "id": "bridge-large-plug-2",
+ "visible": true,
+ "position": [
+ 1.82,
+ 1.6500000000000001,
+ 0.5
+ ],
+ "scale": [
+ 1,
+ 1,
+ 1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ],
+ "home": [
+ 1.82,
+ 1.1,
+ 0
+ ],
+ "homeScale": [
+ 1,
+ 1,
+ 1
+ ]
+ }
+ ]
+ },
+ "bridgeGrounding": [
+ {
+ "id": "front-pump-rescue-vehicle",
+ "adjustment": -2.6725065689598313e-9,
+ "contacts": 22,
+ "minGap": 0,
+ "maxGap": 0.01902815385345835,
+ "position": [
+ 0,
+ -2.6725065689598313e-9,
+ 0
+ ],
+ "quaternion": [
+ 1.5432791624149142e-17,
+ 0,
+ -1.284056869900529e-16,
+ 1
+ ]
+ },
+ {
+ "id": "bridge-workshop",
+ "adjustment": 0.007972344742127626,
+ "contacts": 16,
+ "minGap": 0,
+ "maxGap": 0.007419605491776459,
+ "position": [
+ 0,
+ 0.007972344742127626,
+ 5.2
+ ],
+ "quaternion": [
+ 0.0006589154154300379,
+ 0,
+ -0.00027284082118916614,
+ 0.9999997456941484
+ ]
+ }
+ ],
+ "publishedContentMounted": true,
+ "publishedContentName": "重型支援桥平衡阀拆拼互换",
+ "publishedTrainingContent": {
+ "sceneId": "SCENE-FRONT-PUMP-RESCUE-01",
+ "objectCount": 2
+ },
+ "proceduralMachineVisible": false,
+ "publishedModelRootCount": 2,
+ "framing": {
+ "cameraPosition": [
+ -3.45,
+ 7.67,
+ 18.08
+ ],
+ "controlsTarget": [
+ -3.45,
+ 1.03,
+ 6.01
+ ],
+ "distance": 13.78,
+ "minDistance": 0.25,
+ "maxDistance": 800,
+ "fov": 45,
+ "near": 0.1,
+ "far": 800,
+ "fogNear": 70,
+ "fogFar": 240,
+ "modelSize": [
+ 140,
+ 28.34,
+ 116.19
+ ],
+ "modelCenter": [
+ -8.4,
+ 7.33,
+ -34.86
+ ],
+ "stepCameraPolicy": "focus",
+ "explosionItemCount": 36,
+ "structureNodeCount": 44,
+ "enablePan": true,
+ "outlineActive": false,
+ "labelsVisible": false,
+ "hideOthers": false,
+ "hiddenMeshCount": 0,
+ "keptTargets": [],
+ "targetOnScreen": {
+ "targetId": "bridge-small-cloth",
+ "localX": 788,
+ "localY": 395,
+ "insideCanvas": true,
+ "visible": true,
+ "coveredBy": []
+ },
+ "keptOpacity": [],
+ "environmentAlignment": {
+ "pickedAt": [
+ 8.4,
+ -10.31,
+ 34.86
+ ],
+ "localRelief": 0.265,
+ "samples": 115,
+ "workArea": {
+ "changedVertices": 1354,
+ "floorY": 0,
+ "bounds": [
+ -5,
+ 5,
+ -6,
+ 8
+ ]
+ }
+ },
+ "sceneObjects": [
+ {
+ "name": "野外山地训练场",
+ "min": [
+ -78.4,
+ -6.84,
+ -92.96
+ ],
+ "max": [
+ 61.6,
+ 21.5,
+ 23.24
+ ]
+ },
+ {
+ "name": "架桥车前泵互救操作整车模型",
+ "min": [
+ -0.92,
+ 0,
+ -4
+ ],
+ "max": [
+ 0.92,
+ 1.97,
+ 4
+ ]
+ },
+ {
+ "name": "补充操作示意 · 非实车尺寸",
+ "min": [
+ -3.6,
+ 0,
+ 4.4
+ ],
+ "max": [
+ 3.6,
+ 3.06,
+ 7
+ ]
+ }
+ ],
+ "labelSamples": [
+ {
+ "targetId": "scene:front-pump-rescue-vehicle",
+ "targetName": "",
+ "partName": "架桥车前泵互救操作整车模型"
+ },
+ {
+ "targetId": "front-pump-hydraulic-pump",
+ "targetName": "",
+ "partName": "液压泵"
+ },
+ {
+ "targetId": "front-pump-power-take-off",
+ "targetName": "",
+ "partName": "取力器"
+ },
+ {
+ "targetId": "front-pump-pto-switch",
+ "targetName": "",
+ "partName": "取力器开关"
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/reports/bridge-grounding-20260914/89.png b/reports/bridge-grounding-20260914/89.png
new file mode 100644
index 0000000..ff5fde0
Binary files /dev/null and b/reports/bridge-grounding-20260914/89.png differ
diff --git a/reports/bridge-grounding-20260914/TASK-VIRTUAL-005.png b/reports/bridge-grounding-20260914/TASK-VIRTUAL-005.png
new file mode 100644
index 0000000..7ac2773
Binary files /dev/null and b/reports/bridge-grounding-20260914/TASK-VIRTUAL-005.png differ
diff --git a/reports/bridge-grounding-20260914/TASK-VIRTUAL-006.png b/reports/bridge-grounding-20260914/TASK-VIRTUAL-006.png
new file mode 100644
index 0000000..8ab11c1
Binary files /dev/null and b/reports/bridge-grounding-20260914/TASK-VIRTUAL-006.png differ
diff --git a/reports/bridge-grounding-20260914/TASK-VIRTUAL-007.png b/reports/bridge-grounding-20260914/TASK-VIRTUAL-007.png
new file mode 100644
index 0000000..6ec9ad5
Binary files /dev/null and b/reports/bridge-grounding-20260914/TASK-VIRTUAL-007.png differ
diff --git a/reports/bridge-grounding-20260914/TASK-VIRTUAL-008.png b/reports/bridge-grounding-20260914/TASK-VIRTUAL-008.png
new file mode 100644
index 0000000..be5a0db
Binary files /dev/null and b/reports/bridge-grounding-20260914/TASK-VIRTUAL-008.png differ
diff --git a/reports/bridge-grounding-20260914/index.html b/reports/bridge-grounding-20260914/index.html
new file mode 100644
index 0000000..5f1915f
--- /dev/null
+++ b/reports/bridge-grounding-20260914/index.html
@@ -0,0 +1 @@
+
桥梁车辆贴地修复桥梁车辆贴地修复 · 验证通过
仅对四套桥梁脚本的训练位置平整地形,按轮胎与桌脚接触点贴地;原 GLB 文件和其他场景不变。验证复位、重新加载,以及 005/008 原任务切换步骤后车辆保持地面位置。
006/007 的三维版使用浏览器内隔离渲染验证,未变更旧任务入口或已有记录。列表仍为 4 条,没有新增测试任务。
前端构建与贴地/正式路由测试通过。原始验证结果
TASK-VIRTUAL-005
published-task-preview

TASK-VIRTUAL-006
isolated-v3-render-no-database-change

TASK-VIRTUAL-007
isolated-v3-render-no-database-change

TASK-VIRTUAL-008
published-task-preview
\ No newline at end of file
diff --git a/reports/bridge-grounding-20260914/result.json b/reports/bridge-grounding-20260914/result.json
new file mode 100644
index 0000000..2e2605e
--- /dev/null
+++ b/reports/bridge-grounding-20260914/result.json
@@ -0,0 +1,162 @@
+{
+ "pass": true,
+ "checks": [
+ {
+ "code": "TASK-VIRTUAL-005",
+ "pass": true,
+ "mode": "published-task-preview",
+ "grounding": [
+ {
+ "id": "front-pump-rescue-vehicle",
+ "adjustment": -2.6725065689598313e-9,
+ "contacts": 22,
+ "minGap": 0,
+ "maxGap": 0.01902815385345835,
+ "position": [
+ 0,
+ -2.6725065689598313e-9,
+ 0
+ ],
+ "quaternion": [
+ 1.5432791624149142e-17,
+ 0,
+ -1.284056869900529e-16,
+ 1
+ ]
+ }
+ ]
+ },
+ {
+ "code": "TASK-VIRTUAL-006",
+ "pass": true,
+ "mode": "isolated-v3-render-no-database-change",
+ "grounding": [
+ {
+ "id": "front-pump-rescue-vehicle",
+ "adjustment": -2.6725065689598313e-9,
+ "contacts": 22,
+ "minGap": 0,
+ "maxGap": 0.01902815385345835,
+ "position": [
+ 0,
+ -2.6725065689598313e-9,
+ 0
+ ],
+ "quaternion": [
+ 1.5432791624149142e-17,
+ 0,
+ -1.284056869900529e-16,
+ 1
+ ]
+ },
+ {
+ "id": "bridge-workshop",
+ "adjustment": 0.007972344742127626,
+ "contacts": 16,
+ "minGap": 0,
+ "maxGap": 0.007419605491776459,
+ "position": [
+ 0,
+ 0.007972344742127626,
+ 5.2
+ ],
+ "quaternion": [
+ 0.0006589154154300379,
+ 0,
+ -0.00027284082118916614,
+ 0.9999997456941484
+ ]
+ }
+ ]
+ },
+ {
+ "code": "TASK-VIRTUAL-007",
+ "pass": true,
+ "mode": "isolated-v3-render-no-database-change",
+ "grounding": [
+ {
+ "id": "front-pump-rescue-vehicle",
+ "adjustment": -2.6725065689598313e-9,
+ "contacts": 22,
+ "minGap": 0,
+ "maxGap": 0.01902815385345835,
+ "position": [
+ 0,
+ -2.6725065689598313e-9,
+ 0
+ ],
+ "quaternion": [
+ 1.5432791624149142e-17,
+ 0,
+ -1.284056869900529e-16,
+ 1
+ ]
+ },
+ {
+ "id": "bridge-workshop",
+ "adjustment": 0.007972344742127626,
+ "contacts": 16,
+ "minGap": 0,
+ "maxGap": 0.007419605491776459,
+ "position": [
+ 0,
+ 0.007972344742127626,
+ 5.2
+ ],
+ "quaternion": [
+ 0.0006589154154300379,
+ 0,
+ -0.00027284082118916614,
+ 0.9999997456941484
+ ]
+ }
+ ]
+ },
+ {
+ "code": "TASK-VIRTUAL-008",
+ "pass": true,
+ "mode": "published-task-preview",
+ "grounding": [
+ {
+ "id": "front-pump-rescue-vehicle",
+ "adjustment": -2.6725065689598313e-9,
+ "contacts": 22,
+ "minGap": 0,
+ "maxGap": 0.01902815385345835,
+ "position": [
+ 0,
+ -2.6725065689598313e-9,
+ 0
+ ],
+ "quaternion": [
+ 1.5432791624149142e-17,
+ 0,
+ -1.284056869900529e-16,
+ 1
+ ]
+ },
+ {
+ "id": "bridge-workshop",
+ "adjustment": 0.007972344742127626,
+ "contacts": 16,
+ "minGap": 0,
+ "maxGap": 0.007419605491776459,
+ "position": [
+ 0,
+ 0.007972344742127626,
+ 5.2
+ ],
+ "quaternion": [
+ 0.0006589154154300379,
+ 0,
+ -0.00027284082118916614,
+ 0.9999997456941484
+ ]
+ }
+ ]
+ }
+ ],
+ "errors": [],
+ "remainingTasks": 4,
+ "databaseWrites": "preview validation only; no task/run creation or migration"
+}
\ No newline at end of file
diff --git a/reports/bridge-scripted-tasks-20260913/registered.json b/reports/bridge-scripted-tasks-20260913/registered.json
index 7c7181f..81fe560 100644
--- a/reports/bridge-scripted-tasks-20260913/registered.json
+++ b/reports/bridge-scripted-tasks-20260913/registered.json
@@ -39,12 +39,12 @@
"code": "TASK-VIRTUAL-008",
"id": "89",
"projectId": "441",
- "versionId": "518",
+ "versionId": "526",
"name": "重型支援桥平衡阀拆拼互换",
"scriptId": "bridge-balance-valve-swap",
- "scriptVersion": "2",
+ "scriptVersion": "3",
"steps": 16,
"previewUrl": "/teaching/virtual-training/preview/89",
- "presentation": "procedure"
+ "presentation": "original-3d"
}
]
\ No newline at end of file
diff --git a/reports/bridge-three-dimensional-20260913/TASK-VIRTUAL-005-original.png b/reports/bridge-three-dimensional-20260913/TASK-VIRTUAL-005-original.png
new file mode 100644
index 0000000..f08de03
Binary files /dev/null and b/reports/bridge-three-dimensional-20260913/TASK-VIRTUAL-005-original.png differ
diff --git a/reports/bridge-three-dimensional-20260913/TASK-VIRTUAL-006-diagnostic.json b/reports/bridge-three-dimensional-20260913/TASK-VIRTUAL-006-diagnostic.json
new file mode 100644
index 0000000..b4211b9
--- /dev/null
+++ b/reports/bridge-three-dimensional-20260913/TASK-VIRTUAL-006-diagnostic.json
@@ -0,0 +1,1109 @@
+{
+ "mounted": true,
+ "hasEnvironment": true,
+ "hasEnvironmentTarget": true,
+ "toneMappingExposure": 1.05,
+ "background": "a8cbe1",
+ "meshCount": 66,
+ "materials": [
+ {
+ "name": "M_3dfreehub_mat_2",
+ "color": "ffffff",
+ "metalness": 0,
+ "roughness": 0.5,
+ "envMapIntensity": 1,
+ "hasMap": true,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "M_3dfreehub_mat_3",
+ "color": "ffffff",
+ "metalness": 0,
+ "roughness": 0.5,
+ "envMapIntensity": 1,
+ "hasMap": true,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "M_3dfreehub_mat_4",
+ "color": "ffffff",
+ "metalness": 0,
+ "roughness": 0.5,
+ "envMapIntensity": 1,
+ "hasMap": true,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "M_3dfreehub_mat_5",
+ "color": "ffffff",
+ "metalness": 0,
+ "roughness": 0.5,
+ "envMapIntensity": 1,
+ "hasMap": true,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "Material__85",
+ "color": "695c5b",
+ "metalness": 0,
+ "roughness": 0.5,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "BaiSe",
+ "color": "ffffff",
+ "metalness": 0,
+ "roughness": 0.5,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "Cai1",
+ "color": "3d4b3b",
+ "metalness": 0.6,
+ "roughness": 0.5,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "HeiSe",
+ "color": "4f4f4f",
+ "metalness": 0.3,
+ "roughness": 0.5,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "JinShu",
+ "color": "929292",
+ "metalness": 0.6,
+ "roughness": 0.5,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "LanSe",
+ "color": "3b76d0",
+ "metalness": 0.6,
+ "roughness": 0.5,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "LvSe",
+ "color": "3d4b3b",
+ "metalness": 0.6,
+ "roughness": 0.5,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "Mat_black",
+ "color": "322e2e",
+ "metalness": 0,
+ "roughness": 0.5,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "Mat_supportBridgeBridge_01",
+ "color": "ffffff",
+ "metalness": 0,
+ "roughness": 0.5,
+ "envMapIntensity": 1,
+ "hasMap": true,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "Mat_supportBridgeBridge_02",
+ "color": "ffffff",
+ "metalness": 0,
+ "roughness": 0.5,
+ "envMapIntensity": 1,
+ "hasMap": true,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "Mat_supportBridge_05",
+ "color": "ffffff",
+ "metalness": 0,
+ "roughness": 0.5,
+ "envMapIntensity": 1,
+ "hasMap": true,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "Mat_white",
+ "color": "9da3a4",
+ "metalness": 0,
+ "roughness": 0.5,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "Material__1676",
+ "color": "d96e6e",
+ "metalness": 0.6,
+ "roughness": 0.5,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "MoShaJinShu",
+ "color": "cbcbcb",
+ "metalness": 0.8,
+ "roughness": 0.35,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "__",
+ "color": "ffffff",
+ "metalness": 0,
+ "roughness": 0.5,
+ "envMapIntensity": 1,
+ "hasMap": true,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "adskMatMat_supportBridge_05",
+ "color": "ffffff",
+ "metalness": 0,
+ "roughness": 0.5,
+ "envMapIntensity": 1,
+ "hasMap": true,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "adskMatMat_white",
+ "color": "9da3a4",
+ "metalness": 0,
+ "roughness": 0.5,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "ffffff",
+ "metalness": null,
+ "roughness": null,
+ "envMapIntensity": null,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "Material__579",
+ "color": "404040",
+ "metalness": 0,
+ "roughness": 0.5,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "ffffff",
+ "metalness": null,
+ "roughness": null,
+ "envMapIntensity": null,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "Material__1673",
+ "color": "ffffff",
+ "metalness": 0,
+ "roughness": 0.5,
+ "envMapIntensity": 1,
+ "hasMap": true,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "QianlvSe2",
+ "color": "749f62",
+ "metalness": 0,
+ "roughness": 0.6,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "WaiQiang",
+ "color": "ffffff",
+ "metalness": 0,
+ "roughness": 0.5,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "ffffff",
+ "metalness": null,
+ "roughness": null,
+ "envMapIntensity": null,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "ffffff",
+ "metalness": null,
+ "roughness": null,
+ "envMapIntensity": null,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "254b50",
+ "metalness": 0.55,
+ "roughness": 0.45,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "456068",
+ "metalness": 0.55,
+ "roughness": 0.45,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "456068",
+ "metalness": 0.55,
+ "roughness": 0.45,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "456068",
+ "metalness": 0.55,
+ "roughness": 0.45,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "456068",
+ "metalness": 0.55,
+ "roughness": 0.45,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "31464f",
+ "metalness": 0.55,
+ "roughness": 0.45,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "21b588",
+ "metalness": 0.55,
+ "roughness": 0.45,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "a6b9c3",
+ "metalness": 0.55,
+ "roughness": 0.45,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "a6b9c3",
+ "metalness": 0.55,
+ "roughness": 0.45,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "d9a149",
+ "metalness": 0.55,
+ "roughness": 0.45,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "d9a149",
+ "metalness": 0.55,
+ "roughness": 0.45,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "34474b",
+ "metalness": 0.55,
+ "roughness": 0.45,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "34474b",
+ "metalness": 0.55,
+ "roughness": 0.45,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "31464f",
+ "metalness": 0.55,
+ "roughness": 0.45,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "dd4545",
+ "metalness": 0.55,
+ "roughness": 0.45,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "31464f",
+ "metalness": 0.55,
+ "roughness": 0.45,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "21b588",
+ "metalness": 0.55,
+ "roughness": 0.45,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "31464f",
+ "metalness": 0.55,
+ "roughness": 0.45,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "21b588",
+ "metalness": 0.55,
+ "roughness": 0.45,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "31464f",
+ "metalness": 0.55,
+ "roughness": 0.45,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "21b588",
+ "metalness": 0.55,
+ "roughness": 0.45,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ }
+ ],
+ "server": {
+ "stepId": "BRIDGE-STEP-1",
+ "completed": [],
+ "registeredTargets": [
+ "scene:front-pump-rescue-vehicle",
+ "front-pump-hydraulic-pump",
+ "front-pump-power-take-off",
+ "front-pump-pto-switch",
+ "front-pump-ball-valve-switch",
+ "front-pump-aux-control-box",
+ "front-pump-aux-control-box-cover",
+ "front-pump-rescue-switch",
+ "bridge-engine",
+ "bridge-port-a",
+ "bridge-port-b",
+ "bridge-hose-a",
+ "bridge-hose-b",
+ "bridge-hose-line",
+ "bridge-return-line",
+ "bridge-return-valve",
+ "bridge-support-pto",
+ "bridge-supply",
+ "bridge-normal-control"
+ ],
+ "readOnly": false,
+ "animations": [
+ {
+ "modelId": "front-pump-field-terrain",
+ "versionId": "",
+ "bindings": 0,
+ "unresolved": 0,
+ "flowVisible": false,
+ "native": []
+ },
+ {
+ "modelId": "front-pump-step-vehicle",
+ "versionId": "",
+ "bindings": 0,
+ "unresolved": 0,
+ "flowVisible": false,
+ "native": []
+ }
+ ]
+ },
+ "bridgeWorkshop": {
+ "pending": false,
+ "operation": {
+ "targetId": "bridge-engine",
+ "kind": "identify",
+ "directionHint": "保持架桥车发动机运行",
+ "effects": [
+ {
+ "targetId": "bridge-engine",
+ "color": 2209160
+ }
+ ],
+ "index": 0,
+ "axis": [
+ 0,
+ 1,
+ 0
+ ],
+ "deltaDegrees": 0,
+ "toleranceDegrees": 6
+ },
+ "operationIndex": 0,
+ "targets": [
+ {
+ "id": "front-pump-hydraulic-pump",
+ "visible": true,
+ "position": [
+ 0,
+ 0,
+ 0
+ ],
+ "scale": [
+ 0.01,
+ 0.01,
+ 0.01
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ],
+ "home": [
+ 0,
+ 0,
+ 0
+ ],
+ "homeScale": [
+ 0.01,
+ 0.01,
+ 0.01
+ ]
+ },
+ {
+ "id": "bridge-engine",
+ "visible": true,
+ "position": [
+ -3,
+ 1.1,
+ 1.2
+ ],
+ "scale": [
+ 1,
+ 1,
+ 1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ],
+ "home": [
+ -3,
+ 1.1,
+ 1.2
+ ],
+ "homeScale": [
+ 1,
+ 1,
+ 1
+ ]
+ },
+ {
+ "id": "bridge-port-a",
+ "visible": true,
+ "position": [
+ -1.8,
+ 1.1,
+ 0
+ ],
+ "scale": [
+ 1,
+ 1,
+ 1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ],
+ "home": [
+ -1.8,
+ 1.1,
+ 0
+ ],
+ "homeScale": [
+ 1,
+ 1,
+ 1
+ ]
+ },
+ {
+ "id": "bridge-port-b",
+ "visible": true,
+ "position": [
+ 1.8,
+ 1.1,
+ 0
+ ],
+ "scale": [
+ 1,
+ 1,
+ 1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ],
+ "home": [
+ 1.8,
+ 1.1,
+ 0
+ ],
+ "homeScale": [
+ 1,
+ 1,
+ 1
+ ]
+ },
+ {
+ "id": "bridge-hose-a",
+ "visible": true,
+ "position": [
+ -1.8,
+ 1.1,
+ 0.85
+ ],
+ "scale": [
+ 1,
+ 1,
+ 1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ],
+ "home": [
+ -1.8,
+ 1.1,
+ 0.85
+ ],
+ "homeScale": [
+ 1,
+ 1,
+ 1
+ ]
+ },
+ {
+ "id": "bridge-hose-b",
+ "visible": true,
+ "position": [
+ 1.8,
+ 1.1,
+ 0.85
+ ],
+ "scale": [
+ 1,
+ 1,
+ 1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ],
+ "home": [
+ 1.8,
+ 1.1,
+ 0.85
+ ],
+ "homeScale": [
+ 1,
+ 1,
+ 1
+ ]
+ },
+ {
+ "id": "bridge-hose-line",
+ "visible": false,
+ "position": [
+ -1.8,
+ 1.1,
+ 0.2
+ ],
+ "scale": [
+ 1,
+ 1,
+ 1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ],
+ "home": [
+ -1.8,
+ 1.1,
+ 0.2
+ ],
+ "homeScale": [
+ 1,
+ 1,
+ 1
+ ]
+ },
+ {
+ "id": "bridge-return-line",
+ "visible": false,
+ "position": [
+ -1.8,
+ 0.95,
+ 0.2
+ ],
+ "scale": [
+ 1,
+ 1,
+ 1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ],
+ "home": [
+ -1.8,
+ 0.95,
+ 0.2
+ ],
+ "homeScale": [
+ 1,
+ 1,
+ 1
+ ]
+ },
+ {
+ "id": "bridge-return-valve",
+ "visible": true,
+ "position": [
+ 2.7,
+ 1.1,
+ 0.1
+ ],
+ "scale": [
+ 1,
+ 1,
+ 1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ],
+ "home": [
+ 2.7,
+ 1.1,
+ 0.1
+ ],
+ "homeScale": [
+ 1,
+ 1,
+ 1
+ ]
+ },
+ {
+ "id": "bridge-support-pto",
+ "visible": true,
+ "position": [
+ 2.7,
+ 1.1,
+ 1.1
+ ],
+ "scale": [
+ 1,
+ 1,
+ 1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ],
+ "home": [
+ 2.7,
+ 1.1,
+ 1.1
+ ],
+ "homeScale": [
+ 1,
+ 1,
+ 1
+ ]
+ },
+ {
+ "id": "bridge-supply",
+ "visible": true,
+ "position": [
+ 0,
+ 1,
+ 0
+ ],
+ "scale": [
+ 1,
+ 1,
+ 1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ],
+ "home": [
+ 0,
+ 1,
+ 0
+ ],
+ "homeScale": [
+ 1,
+ 1,
+ 1
+ ]
+ },
+ {
+ "id": "bridge-normal-control",
+ "visible": true,
+ "position": [
+ -2.7,
+ 1.1,
+ 0
+ ],
+ "scale": [
+ 1,
+ 1,
+ 1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ],
+ "home": [
+ -2.7,
+ 1.1,
+ 0
+ ],
+ "homeScale": [
+ 1,
+ 1,
+ 1
+ ]
+ }
+ ]
+ },
+ "publishedContentMounted": true,
+ "publishedContentName": "重型支援桥液压泵应急替代",
+ "publishedTrainingContent": {
+ "sceneId": "SCENE-FRONT-PUMP-RESCUE-01",
+ "objectCount": 2
+ },
+ "proceduralMachineVisible": false,
+ "publishedModelRootCount": 2,
+ "framing": {
+ "cameraPosition": [
+ 0,
+ 8.17,
+ 17.78
+ ],
+ "controlsTarget": [
+ 0,
+ 1.53,
+ 5.7
+ ],
+ "distance": 13.78,
+ "minDistance": 0.25,
+ "maxDistance": 800,
+ "fov": 45,
+ "near": 0.1,
+ "far": 800,
+ "fogNear": 70,
+ "fogFar": 240,
+ "modelSize": [
+ 140,
+ 28.34,
+ 116.19
+ ],
+ "modelCenter": [
+ 0,
+ -2.98,
+ 0
+ ],
+ "stepCameraPolicy": "focus",
+ "explosionItemCount": 36,
+ "structureNodeCount": 44,
+ "enablePan": true,
+ "outlineActive": false,
+ "labelsVisible": false,
+ "hideOthers": false,
+ "hiddenMeshCount": 0,
+ "keptTargets": [],
+ "targetOnScreen": {
+ "targetId": "bridge-engine",
+ "localX": 343,
+ "localY": 421,
+ "insideCanvas": true,
+ "visible": true,
+ "coveredBy": []
+ },
+ "keptOpacity": [],
+ "environmentAlignment": null,
+ "sceneObjects": [
+ {
+ "name": "野外山地训练场",
+ "min": [
+ -70,
+ -17.14,
+ -58.1
+ ],
+ "max": [
+ 70,
+ 11.19,
+ 58.1
+ ]
+ },
+ {
+ "name": "架桥车前泵互救操作整车模型",
+ "min": [
+ -0.92,
+ 0,
+ -4
+ ],
+ "max": [
+ 0.92,
+ 1.97,
+ 4
+ ]
+ },
+ {
+ "name": "补充操作示意 · 非实车尺寸",
+ "min": [
+ -3.6,
+ 0,
+ 4.4
+ ],
+ "max": [
+ 3.6,
+ 3.05,
+ 7
+ ]
+ }
+ ],
+ "labelSamples": [
+ {
+ "targetId": "scene:front-pump-rescue-vehicle",
+ "targetName": "",
+ "partName": "架桥车前泵互救操作整车模型"
+ },
+ {
+ "targetId": "front-pump-hydraulic-pump",
+ "targetName": "",
+ "partName": "液压泵"
+ },
+ {
+ "targetId": "front-pump-power-take-off",
+ "targetName": "",
+ "partName": "取力器"
+ },
+ {
+ "targetId": "front-pump-pto-switch",
+ "targetName": "",
+ "partName": "取力器开关"
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/reports/bridge-three-dimensional-20260913/TASK-VIRTUAL-006-reviewed.png b/reports/bridge-three-dimensional-20260913/TASK-VIRTUAL-006-reviewed.png
new file mode 100644
index 0000000..387280e
Binary files /dev/null and b/reports/bridge-three-dimensional-20260913/TASK-VIRTUAL-006-reviewed.png differ
diff --git a/reports/bridge-three-dimensional-20260913/TASK-VIRTUAL-006-start.png b/reports/bridge-three-dimensional-20260913/TASK-VIRTUAL-006-start.png
new file mode 100644
index 0000000..10cb9d2
Binary files /dev/null and b/reports/bridge-three-dimensional-20260913/TASK-VIRTUAL-006-start.png differ
diff --git a/reports/bridge-three-dimensional-20260913/TASK-VIRTUAL-006-step-2.png b/reports/bridge-three-dimensional-20260913/TASK-VIRTUAL-006-step-2.png
new file mode 100644
index 0000000..fdbe218
Binary files /dev/null and b/reports/bridge-three-dimensional-20260913/TASK-VIRTUAL-006-step-2.png differ
diff --git a/reports/bridge-three-dimensional-20260913/TASK-VIRTUAL-006-step-4.png b/reports/bridge-three-dimensional-20260913/TASK-VIRTUAL-006-step-4.png
new file mode 100644
index 0000000..7179673
Binary files /dev/null and b/reports/bridge-three-dimensional-20260913/TASK-VIRTUAL-006-step-4.png differ
diff --git a/reports/bridge-three-dimensional-20260913/TASK-VIRTUAL-006-step-5.png b/reports/bridge-three-dimensional-20260913/TASK-VIRTUAL-006-step-5.png
new file mode 100644
index 0000000..1b643f5
Binary files /dev/null and b/reports/bridge-three-dimensional-20260913/TASK-VIRTUAL-006-step-5.png differ
diff --git a/reports/bridge-three-dimensional-20260913/TASK-VIRTUAL-007-diagnostic.json b/reports/bridge-three-dimensional-20260913/TASK-VIRTUAL-007-diagnostic.json
new file mode 100644
index 0000000..8b04159
--- /dev/null
+++ b/reports/bridge-three-dimensional-20260913/TASK-VIRTUAL-007-diagnostic.json
@@ -0,0 +1,1401 @@
+{
+ "mounted": true,
+ "hasEnvironment": true,
+ "hasEnvironmentTarget": true,
+ "toneMappingExposure": 1.05,
+ "background": "a8cbe1",
+ "meshCount": 72,
+ "materials": [
+ {
+ "name": "M_3dfreehub_mat_2",
+ "color": "ffffff",
+ "metalness": 0,
+ "roughness": 0.5,
+ "envMapIntensity": 1,
+ "hasMap": true,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "M_3dfreehub_mat_3",
+ "color": "ffffff",
+ "metalness": 0,
+ "roughness": 0.5,
+ "envMapIntensity": 1,
+ "hasMap": true,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "M_3dfreehub_mat_4",
+ "color": "ffffff",
+ "metalness": 0,
+ "roughness": 0.5,
+ "envMapIntensity": 1,
+ "hasMap": true,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "M_3dfreehub_mat_5",
+ "color": "ffffff",
+ "metalness": 0,
+ "roughness": 0.5,
+ "envMapIntensity": 1,
+ "hasMap": true,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "Material__85",
+ "color": "695c5b",
+ "metalness": 0,
+ "roughness": 0.5,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "BaiSe",
+ "color": "ffffff",
+ "metalness": 0,
+ "roughness": 0.5,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "Cai1",
+ "color": "3d4b3b",
+ "metalness": 0.6,
+ "roughness": 0.5,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "HeiSe",
+ "color": "4f4f4f",
+ "metalness": 0.3,
+ "roughness": 0.5,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "JinShu",
+ "color": "929292",
+ "metalness": 0.6,
+ "roughness": 0.5,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "LanSe",
+ "color": "3b76d0",
+ "metalness": 0.6,
+ "roughness": 0.5,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "LvSe",
+ "color": "3d4b3b",
+ "metalness": 0.6,
+ "roughness": 0.5,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "Mat_black",
+ "color": "322e2e",
+ "metalness": 0,
+ "roughness": 0.5,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "Mat_supportBridgeBridge_01",
+ "color": "ffffff",
+ "metalness": 0,
+ "roughness": 0.5,
+ "envMapIntensity": 1,
+ "hasMap": true,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "Mat_supportBridgeBridge_02",
+ "color": "ffffff",
+ "metalness": 0,
+ "roughness": 0.5,
+ "envMapIntensity": 1,
+ "hasMap": true,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "Mat_supportBridge_05",
+ "color": "ffffff",
+ "metalness": 0,
+ "roughness": 0.5,
+ "envMapIntensity": 1,
+ "hasMap": true,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "Mat_white",
+ "color": "9da3a4",
+ "metalness": 0,
+ "roughness": 0.5,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "Material__1676",
+ "color": "d96e6e",
+ "metalness": 0.6,
+ "roughness": 0.5,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "MoShaJinShu",
+ "color": "cbcbcb",
+ "metalness": 0.8,
+ "roughness": 0.35,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "__",
+ "color": "ffffff",
+ "metalness": 0,
+ "roughness": 0.5,
+ "envMapIntensity": 1,
+ "hasMap": true,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "adskMatMat_supportBridge_05",
+ "color": "ffffff",
+ "metalness": 0,
+ "roughness": 0.5,
+ "envMapIntensity": 1,
+ "hasMap": true,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "adskMatMat_white",
+ "color": "9da3a4",
+ "metalness": 0,
+ "roughness": 0.5,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "ffffff",
+ "metalness": null,
+ "roughness": null,
+ "envMapIntensity": null,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "Material__579",
+ "color": "404040",
+ "metalness": 0,
+ "roughness": 0.5,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "ffffff",
+ "metalness": null,
+ "roughness": null,
+ "envMapIntensity": null,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "Material__1673",
+ "color": "ffffff",
+ "metalness": 0,
+ "roughness": 0.5,
+ "envMapIntensity": 1,
+ "hasMap": true,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "QianlvSe2",
+ "color": "749f62",
+ "metalness": 0,
+ "roughness": 0.6,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "WaiQiang",
+ "color": "ffffff",
+ "metalness": 0,
+ "roughness": 0.5,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "ffffff",
+ "metalness": null,
+ "roughness": null,
+ "envMapIntensity": null,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "ffffff",
+ "metalness": null,
+ "roughness": null,
+ "envMapIntensity": null,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "254b50",
+ "metalness": 0.55,
+ "roughness": 0.45,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "456068",
+ "metalness": 0.55,
+ "roughness": 0.45,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "456068",
+ "metalness": 0.55,
+ "roughness": 0.45,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "456068",
+ "metalness": 0.55,
+ "roughness": 0.45,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "456068",
+ "metalness": 0.55,
+ "roughness": 0.45,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "31464f",
+ "metalness": 0.55,
+ "roughness": 0.45,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "21b588",
+ "metalness": 0.55,
+ "roughness": 0.45,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "627980",
+ "metalness": 0.55,
+ "roughness": 0.45,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "c4ced2",
+ "metalness": 0.55,
+ "roughness": 0.45,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "c4ced2",
+ "metalness": 0.55,
+ "roughness": 0.45,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "c4ced2",
+ "metalness": 0.55,
+ "roughness": 0.45,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "c4ced2",
+ "metalness": 0.55,
+ "roughness": 0.45,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "31464f",
+ "metalness": 0.55,
+ "roughness": 0.45,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "d9a543",
+ "metalness": 0.55,
+ "roughness": 0.45,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "b89455",
+ "metalness": 0.55,
+ "roughness": 0.45,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "b89455",
+ "metalness": 0,
+ "roughness": 1,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "465963",
+ "metalness": 0.55,
+ "roughness": 0.45,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "465963",
+ "metalness": 0.55,
+ "roughness": 0.45,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "d1eaf1",
+ "metalness": 0.55,
+ "roughness": 0.45,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "d1eaf1",
+ "metalness": 0.55,
+ "roughness": 0.45,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "ddab4a",
+ "metalness": 0.55,
+ "roughness": 0.45,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "d5a945",
+ "metalness": 0.55,
+ "roughness": 0.45,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "e4b243",
+ "metalness": 0.55,
+ "roughness": 0.45,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "31464f",
+ "metalness": 0.55,
+ "roughness": 0.45,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "21b588",
+ "metalness": 0.55,
+ "roughness": 0.45,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ }
+ ],
+ "server": {
+ "stepId": "BRIDGE-STEP-1",
+ "completed": [],
+ "registeredTargets": [
+ "scene:front-pump-rescue-vehicle",
+ "front-pump-hydraulic-pump",
+ "front-pump-power-take-off",
+ "front-pump-pto-switch",
+ "front-pump-ball-valve-switch",
+ "front-pump-aux-control-box",
+ "front-pump-aux-control-box-cover",
+ "front-pump-rescue-switch",
+ "bridge-engine",
+ "bridge-old-pump",
+ "bridge-new-pump",
+ "bridge-pump-seat",
+ "bridge-pump-bolt-1",
+ "bridge-pump-bolt-2",
+ "bridge-pump-bolt-3",
+ "bridge-pump-bolt-4",
+ "bridge-tank-valve",
+ "bridge-paper",
+ "bridge-gasket",
+ "bridge-inlet",
+ "bridge-outlet",
+ "bridge-inlet-bag",
+ "bridge-outlet-bag",
+ "bridge-fill-cap",
+ "bridge-oil-can",
+ "bridge-oil-stream",
+ "bridge-test-control"
+ ],
+ "readOnly": false,
+ "animations": [
+ {
+ "modelId": "front-pump-field-terrain",
+ "versionId": "",
+ "bindings": 0,
+ "unresolved": 0,
+ "flowVisible": false,
+ "native": []
+ },
+ {
+ "modelId": "front-pump-step-vehicle",
+ "versionId": "",
+ "bindings": 0,
+ "unresolved": 0,
+ "flowVisible": false,
+ "native": []
+ }
+ ]
+ },
+ "bridgeWorkshop": {
+ "pending": false,
+ "operation": {
+ "targetId": "bridge-engine",
+ "kind": "identify",
+ "directionHint": "关闭架桥车发动机",
+ "effects": [
+ {
+ "targetId": "bridge-engine",
+ "color": 13195851
+ }
+ ],
+ "index": 0,
+ "axis": [
+ 0,
+ 1,
+ 0
+ ],
+ "deltaDegrees": 0,
+ "toleranceDegrees": 6
+ },
+ "operationIndex": 0,
+ "targets": [
+ {
+ "id": "front-pump-hydraulic-pump",
+ "visible": true,
+ "position": [
+ 0,
+ 0,
+ 0
+ ],
+ "scale": [
+ 0.01,
+ 0.01,
+ 0.01
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ],
+ "home": [
+ 0,
+ 0,
+ 0
+ ],
+ "homeScale": [
+ 0.01,
+ 0.01,
+ 0.01
+ ]
+ },
+ {
+ "id": "bridge-engine",
+ "visible": true,
+ "position": [
+ -3,
+ 1.1,
+ 1.2
+ ],
+ "scale": [
+ 1,
+ 1,
+ 1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ],
+ "home": [
+ -3,
+ 1.1,
+ 1.2
+ ],
+ "homeScale": [
+ 1,
+ 1,
+ 1
+ ]
+ },
+ {
+ "id": "bridge-old-pump",
+ "visible": true,
+ "position": [
+ 0,
+ 1.4,
+ 0
+ ],
+ "scale": [
+ 1,
+ 1,
+ 1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ],
+ "home": [
+ 0,
+ 1.4,
+ 0
+ ],
+ "homeScale": [
+ 1,
+ 1,
+ 1
+ ]
+ },
+ {
+ "id": "bridge-new-pump",
+ "visible": true,
+ "position": [
+ 2,
+ 1.4,
+ 0
+ ],
+ "scale": [
+ 1,
+ 1,
+ 1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ],
+ "home": [
+ 2,
+ 1.4,
+ 0
+ ],
+ "homeScale": [
+ 1,
+ 1,
+ 1
+ ]
+ },
+ {
+ "id": "bridge-pump-seat",
+ "visible": true,
+ "position": [
+ 0,
+ 1.4,
+ -0.45
+ ],
+ "scale": [
+ 1,
+ 1,
+ 1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ],
+ "home": [
+ 0,
+ 1.4,
+ -0.45
+ ],
+ "homeScale": [
+ 1,
+ 1,
+ 1
+ ]
+ },
+ {
+ "id": "bridge-pump-bolt-1",
+ "visible": true,
+ "position": [
+ -0.36,
+ 1.72,
+ 0.38
+ ],
+ "scale": [
+ 1,
+ 1,
+ 1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ],
+ "home": [
+ -0.36,
+ 1.72,
+ 0.38
+ ],
+ "homeScale": [
+ 1,
+ 1,
+ 1
+ ]
+ },
+ {
+ "id": "bridge-pump-bolt-2",
+ "visible": true,
+ "position": [
+ 0.36,
+ 1.72,
+ 0.38
+ ],
+ "scale": [
+ 1,
+ 1,
+ 1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ],
+ "home": [
+ 0.36,
+ 1.72,
+ 0.38
+ ],
+ "homeScale": [
+ 1,
+ 1,
+ 1
+ ]
+ },
+ {
+ "id": "bridge-pump-bolt-3",
+ "visible": true,
+ "position": [
+ -0.36,
+ 1.0799999999999998,
+ 0.38
+ ],
+ "scale": [
+ 1,
+ 1,
+ 1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ],
+ "home": [
+ -0.36,
+ 1.0799999999999998,
+ 0.38
+ ],
+ "homeScale": [
+ 1,
+ 1,
+ 1
+ ]
+ },
+ {
+ "id": "bridge-pump-bolt-4",
+ "visible": true,
+ "position": [
+ 0.36,
+ 1.0799999999999998,
+ 0.38
+ ],
+ "scale": [
+ 1,
+ 1,
+ 1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ],
+ "home": [
+ 0.36,
+ 1.0799999999999998,
+ 0.38
+ ],
+ "homeScale": [
+ 1,
+ 1,
+ 1
+ ]
+ },
+ {
+ "id": "bridge-tank-valve",
+ "visible": true,
+ "position": [
+ -2.7,
+ 1.1,
+ 0
+ ],
+ "scale": [
+ 1,
+ 1,
+ 1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ],
+ "home": [
+ -2.7,
+ 1.1,
+ 0
+ ],
+ "homeScale": [
+ 1,
+ 1,
+ 1
+ ]
+ },
+ {
+ "id": "bridge-paper",
+ "visible": true,
+ "position": [
+ -2.3,
+ 0.8,
+ 0.4
+ ],
+ "scale": [
+ 1,
+ 1,
+ 1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ],
+ "home": [
+ -2.3,
+ 0.8,
+ 0.4
+ ],
+ "homeScale": [
+ 1,
+ 1,
+ 1
+ ]
+ },
+ {
+ "id": "bridge-gasket",
+ "visible": false,
+ "position": [
+ -2.3,
+ 1.4,
+ 0
+ ],
+ "scale": [
+ 1,
+ 1,
+ 1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ],
+ "home": [
+ -2.3,
+ 1.4,
+ 0
+ ],
+ "homeScale": [
+ 1,
+ 1,
+ 1
+ ]
+ },
+ {
+ "id": "bridge-inlet",
+ "visible": true,
+ "position": [
+ -0.65,
+ 1.4,
+ 0
+ ],
+ "scale": [
+ 1,
+ 1,
+ 1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ],
+ "home": [
+ -0.65,
+ 1.4,
+ 0
+ ],
+ "homeScale": [
+ 1,
+ 1,
+ 1
+ ]
+ },
+ {
+ "id": "bridge-outlet",
+ "visible": true,
+ "position": [
+ 0.65,
+ 1.4,
+ 0
+ ],
+ "scale": [
+ 1,
+ 1,
+ 1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ],
+ "home": [
+ 0.65,
+ 1.4,
+ 0
+ ],
+ "homeScale": [
+ 1,
+ 1,
+ 1
+ ]
+ },
+ {
+ "id": "bridge-inlet-bag",
+ "visible": true,
+ "position": [
+ -1.25,
+ 1.4,
+ 0.65
+ ],
+ "scale": [
+ 1,
+ 1,
+ 1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ],
+ "home": [
+ -1.25,
+ 1.4,
+ 0.65
+ ],
+ "homeScale": [
+ 1,
+ 1,
+ 1
+ ]
+ },
+ {
+ "id": "bridge-outlet-bag",
+ "visible": true,
+ "position": [
+ 1.25,
+ 1.4,
+ 0.65
+ ],
+ "scale": [
+ 1,
+ 1,
+ 1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ],
+ "home": [
+ 1.25,
+ 1.4,
+ 0.65
+ ],
+ "homeScale": [
+ 1,
+ 1,
+ 1
+ ]
+ },
+ {
+ "id": "bridge-fill-cap",
+ "visible": true,
+ "position": [
+ 0,
+ 2,
+ 0
+ ],
+ "scale": [
+ 1,
+ 1,
+ 1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ],
+ "home": [
+ 0,
+ 2,
+ 0
+ ],
+ "homeScale": [
+ 1,
+ 1,
+ 1
+ ]
+ },
+ {
+ "id": "bridge-oil-can",
+ "visible": true,
+ "position": [
+ 1.4,
+ 1.8,
+ 0.5
+ ],
+ "scale": [
+ 1,
+ 1,
+ 1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ],
+ "home": [
+ 1.4,
+ 1.8,
+ 0.5
+ ],
+ "homeScale": [
+ 1,
+ 1,
+ 1
+ ]
+ },
+ {
+ "id": "bridge-oil-stream",
+ "visible": false,
+ "position": [
+ 0.1,
+ 2.1,
+ 0.15
+ ],
+ "scale": [
+ 1,
+ 1,
+ 1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ],
+ "home": [
+ 0.1,
+ 2.1,
+ 0.15
+ ],
+ "homeScale": [
+ 1,
+ 1,
+ 1
+ ]
+ },
+ {
+ "id": "bridge-test-control",
+ "visible": true,
+ "position": [
+ 3,
+ 1.1,
+ 1
+ ],
+ "scale": [
+ 1,
+ 1,
+ 1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ],
+ "home": [
+ 3,
+ 1.1,
+ 1
+ ],
+ "homeScale": [
+ 1,
+ 1,
+ 1
+ ]
+ }
+ ]
+ },
+ "publishedContentMounted": true,
+ "publishedContentName": "重型支援桥前泵换件修复",
+ "publishedTrainingContent": {
+ "sceneId": "SCENE-FRONT-PUMP-RESCUE-01",
+ "objectCount": 2
+ },
+ "proceduralMachineVisible": false,
+ "publishedModelRootCount": 2,
+ "framing": {
+ "cameraPosition": [
+ -4.15,
+ 8.08,
+ 18.38
+ ],
+ "controlsTarget": [
+ -4.15,
+ 1.44,
+ 6.3
+ ],
+ "distance": 13.78,
+ "minDistance": 0.25,
+ "maxDistance": 800,
+ "fov": 45,
+ "near": 0.1,
+ "far": 800,
+ "fogNear": 70,
+ "fogFar": 240,
+ "modelSize": [
+ 140,
+ 28.34,
+ 116.19
+ ],
+ "modelCenter": [
+ 0,
+ -2.98,
+ 0
+ ],
+ "stepCameraPolicy": "focus",
+ "explosionItemCount": 36,
+ "structureNodeCount": 44,
+ "enablePan": true,
+ "outlineActive": false,
+ "labelsVisible": false,
+ "hideOthers": false,
+ "hiddenMeshCount": 0,
+ "keptTargets": [],
+ "targetOnScreen": {
+ "targetId": "bridge-engine",
+ "localX": 628,
+ "localY": 395,
+ "insideCanvas": true,
+ "visible": true,
+ "coveredBy": []
+ },
+ "keptOpacity": [],
+ "environmentAlignment": null,
+ "sceneObjects": [
+ {
+ "name": "野外山地训练场",
+ "min": [
+ -70,
+ -17.14,
+ -58.1
+ ],
+ "max": [
+ 70,
+ 11.19,
+ 58.1
+ ]
+ },
+ {
+ "name": "架桥车前泵互救操作整车模型",
+ "min": [
+ -0.92,
+ 0,
+ -4
+ ],
+ "max": [
+ 0.92,
+ 1.97,
+ 4
+ ]
+ },
+ {
+ "name": "补充操作示意 · 非实车尺寸",
+ "min": [
+ -3.6,
+ 0,
+ 4.4
+ ],
+ "max": [
+ 3.6,
+ 3.05,
+ 7
+ ]
+ }
+ ],
+ "labelSamples": [
+ {
+ "targetId": "scene:front-pump-rescue-vehicle",
+ "targetName": "",
+ "partName": "架桥车前泵互救操作整车模型"
+ },
+ {
+ "targetId": "front-pump-hydraulic-pump",
+ "targetName": "",
+ "partName": "液压泵"
+ },
+ {
+ "targetId": "front-pump-power-take-off",
+ "targetName": "",
+ "partName": "取力器"
+ },
+ {
+ "targetId": "front-pump-pto-switch",
+ "targetName": "",
+ "partName": "取力器开关"
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/reports/bridge-three-dimensional-20260913/TASK-VIRTUAL-007-reviewed.png b/reports/bridge-three-dimensional-20260913/TASK-VIRTUAL-007-reviewed.png
new file mode 100644
index 0000000..6a46c37
Binary files /dev/null and b/reports/bridge-three-dimensional-20260913/TASK-VIRTUAL-007-reviewed.png differ
diff --git a/reports/bridge-three-dimensional-20260913/TASK-VIRTUAL-007-start.png b/reports/bridge-three-dimensional-20260913/TASK-VIRTUAL-007-start.png
new file mode 100644
index 0000000..6fb45a7
Binary files /dev/null and b/reports/bridge-three-dimensional-20260913/TASK-VIRTUAL-007-start.png differ
diff --git a/reports/bridge-three-dimensional-20260913/TASK-VIRTUAL-007-step-11.png b/reports/bridge-three-dimensional-20260913/TASK-VIRTUAL-007-step-11.png
new file mode 100644
index 0000000..8d481a9
Binary files /dev/null and b/reports/bridge-three-dimensional-20260913/TASK-VIRTUAL-007-step-11.png differ
diff --git a/reports/bridge-three-dimensional-20260913/TASK-VIRTUAL-007-step-2.png b/reports/bridge-three-dimensional-20260913/TASK-VIRTUAL-007-step-2.png
new file mode 100644
index 0000000..f8cd89d
Binary files /dev/null and b/reports/bridge-three-dimensional-20260913/TASK-VIRTUAL-007-step-2.png differ
diff --git a/reports/bridge-three-dimensional-20260913/TASK-VIRTUAL-007-step-4.png b/reports/bridge-three-dimensional-20260913/TASK-VIRTUAL-007-step-4.png
new file mode 100644
index 0000000..ca4b1a7
Binary files /dev/null and b/reports/bridge-three-dimensional-20260913/TASK-VIRTUAL-007-step-4.png differ
diff --git a/reports/bridge-three-dimensional-20260913/TASK-VIRTUAL-007-step-5.png b/reports/bridge-three-dimensional-20260913/TASK-VIRTUAL-007-step-5.png
new file mode 100644
index 0000000..93111fb
Binary files /dev/null and b/reports/bridge-three-dimensional-20260913/TASK-VIRTUAL-007-step-5.png differ
diff --git a/reports/bridge-three-dimensional-20260913/TASK-VIRTUAL-007-step-8.png b/reports/bridge-three-dimensional-20260913/TASK-VIRTUAL-007-step-8.png
new file mode 100644
index 0000000..099c456
Binary files /dev/null and b/reports/bridge-three-dimensional-20260913/TASK-VIRTUAL-007-step-8.png differ
diff --git a/reports/bridge-three-dimensional-20260913/TASK-VIRTUAL-008-diagnostic.json b/reports/bridge-three-dimensional-20260913/TASK-VIRTUAL-008-diagnostic.json
new file mode 100644
index 0000000..52902c1
--- /dev/null
+++ b/reports/bridge-three-dimensional-20260913/TASK-VIRTUAL-008-diagnostic.json
@@ -0,0 +1,1621 @@
+{
+ "mounted": true,
+ "hasEnvironment": true,
+ "hasEnvironmentTarget": true,
+ "toneMappingExposure": 1.05,
+ "background": "a8cbe1",
+ "meshCount": 78,
+ "materials": [
+ {
+ "name": "M_3dfreehub_mat_2",
+ "color": "ffffff",
+ "metalness": 0,
+ "roughness": 0.5,
+ "envMapIntensity": 1,
+ "hasMap": true,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "M_3dfreehub_mat_3",
+ "color": "ffffff",
+ "metalness": 0,
+ "roughness": 0.5,
+ "envMapIntensity": 1,
+ "hasMap": true,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "M_3dfreehub_mat_4",
+ "color": "ffffff",
+ "metalness": 0,
+ "roughness": 0.5,
+ "envMapIntensity": 1,
+ "hasMap": true,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "M_3dfreehub_mat_5",
+ "color": "ffffff",
+ "metalness": 0,
+ "roughness": 0.5,
+ "envMapIntensity": 1,
+ "hasMap": true,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "Material__85",
+ "color": "695c5b",
+ "metalness": 0,
+ "roughness": 0.5,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "BaiSe",
+ "color": "ffffff",
+ "metalness": 0,
+ "roughness": 0.5,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "Cai1",
+ "color": "3d4b3b",
+ "metalness": 0.6,
+ "roughness": 0.5,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "HeiSe",
+ "color": "4f4f4f",
+ "metalness": 0.3,
+ "roughness": 0.5,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "JinShu",
+ "color": "929292",
+ "metalness": 0.6,
+ "roughness": 0.5,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "LanSe",
+ "color": "3b76d0",
+ "metalness": 0.6,
+ "roughness": 0.5,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "LvSe",
+ "color": "3d4b3b",
+ "metalness": 0.6,
+ "roughness": 0.5,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "Mat_black",
+ "color": "322e2e",
+ "metalness": 0,
+ "roughness": 0.5,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "Mat_supportBridgeBridge_01",
+ "color": "ffffff",
+ "metalness": 0,
+ "roughness": 0.5,
+ "envMapIntensity": 1,
+ "hasMap": true,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "Mat_supportBridgeBridge_02",
+ "color": "ffffff",
+ "metalness": 0,
+ "roughness": 0.5,
+ "envMapIntensity": 1,
+ "hasMap": true,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "Mat_supportBridge_05",
+ "color": "ffffff",
+ "metalness": 0,
+ "roughness": 0.5,
+ "envMapIntensity": 1,
+ "hasMap": true,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "Mat_white",
+ "color": "9da3a4",
+ "metalness": 0,
+ "roughness": 0.5,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "Material__1676",
+ "color": "d96e6e",
+ "metalness": 0.6,
+ "roughness": 0.5,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "MoShaJinShu",
+ "color": "cbcbcb",
+ "metalness": 0.8,
+ "roughness": 0.35,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "__",
+ "color": "ffffff",
+ "metalness": 0,
+ "roughness": 0.5,
+ "envMapIntensity": 1,
+ "hasMap": true,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "adskMatMat_supportBridge_05",
+ "color": "ffffff",
+ "metalness": 0,
+ "roughness": 0.5,
+ "envMapIntensity": 1,
+ "hasMap": true,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "adskMatMat_white",
+ "color": "9da3a4",
+ "metalness": 0,
+ "roughness": 0.5,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "ffffff",
+ "metalness": null,
+ "roughness": null,
+ "envMapIntensity": null,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "Material__579",
+ "color": "404040",
+ "metalness": 0,
+ "roughness": 0.5,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "ffffff",
+ "metalness": null,
+ "roughness": null,
+ "envMapIntensity": null,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "Material__1673",
+ "color": "ffffff",
+ "metalness": 0,
+ "roughness": 0.5,
+ "envMapIntensity": 1,
+ "hasMap": true,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "QianlvSe2",
+ "color": "749f62",
+ "metalness": 0,
+ "roughness": 0.6,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "WaiQiang",
+ "color": "ffffff",
+ "metalness": 0,
+ "roughness": 0.5,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "ffffff",
+ "metalness": null,
+ "roughness": null,
+ "envMapIntensity": null,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "ffffff",
+ "metalness": null,
+ "roughness": null,
+ "envMapIntensity": null,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "254b50",
+ "metalness": 0.55,
+ "roughness": 0.45,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "456068",
+ "metalness": 0.55,
+ "roughness": 0.45,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "456068",
+ "metalness": 0.55,
+ "roughness": 0.45,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "456068",
+ "metalness": 0.55,
+ "roughness": 0.45,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "456068",
+ "metalness": 0.55,
+ "roughness": 0.45,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "31464f",
+ "metalness": 0.55,
+ "roughness": 0.45,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "21b588",
+ "metalness": 0.55,
+ "roughness": 0.45,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "526767",
+ "metalness": 0.55,
+ "roughness": 0.45,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "3c6c86",
+ "metalness": 0.55,
+ "roughness": 0.45,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "223438",
+ "metalness": 0.55,
+ "roughness": 0.45,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "223438",
+ "metalness": 0.55,
+ "roughness": 0.45,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "bdcbd1",
+ "metalness": 0.55,
+ "roughness": 0.45,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "bdcbd1",
+ "metalness": 0.55,
+ "roughness": 0.45,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "bdcbd1",
+ "metalness": 0.55,
+ "roughness": 0.45,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "bdcbd1",
+ "metalness": 0.55,
+ "roughness": 0.45,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "607985",
+ "metalness": 0.55,
+ "roughness": 0.45,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "d1eaf1",
+ "metalness": 0.55,
+ "roughness": 0.45,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "e4ece7",
+ "metalness": 0.55,
+ "roughness": 0.45,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "d9a441",
+ "metalness": 0.55,
+ "roughness": 0.45,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "d9a441",
+ "metalness": 0.55,
+ "roughness": 0.45,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "526767",
+ "metalness": 0.55,
+ "roughness": 0.45,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "8b783d",
+ "metalness": 0.55,
+ "roughness": 0.45,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "223438",
+ "metalness": 0.55,
+ "roughness": 0.45,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "223438",
+ "metalness": 0.55,
+ "roughness": 0.45,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "bdcbd1",
+ "metalness": 0.55,
+ "roughness": 0.45,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "bdcbd1",
+ "metalness": 0.55,
+ "roughness": 0.45,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "bdcbd1",
+ "metalness": 0.55,
+ "roughness": 0.45,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "bdcbd1",
+ "metalness": 0.55,
+ "roughness": 0.45,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "607985",
+ "metalness": 0.55,
+ "roughness": 0.45,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "d1eaf1",
+ "metalness": 0.55,
+ "roughness": 0.45,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "e4ece7",
+ "metalness": 0.55,
+ "roughness": 0.45,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "d9a441",
+ "metalness": 0.55,
+ "roughness": 0.45,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ },
+ {
+ "name": "(未命名)",
+ "color": "d9a441",
+ "metalness": 0.55,
+ "roughness": 0.45,
+ "envMapIntensity": 1,
+ "hasMap": false,
+ "preset": null,
+ "rule": null,
+ "authored": null
+ }
+ ],
+ "server": {
+ "stepId": "BRIDGE-STEP-1",
+ "completed": [],
+ "registeredTargets": [
+ "scene:front-pump-rescue-vehicle",
+ "front-pump-hydraulic-pump",
+ "front-pump-power-take-off",
+ "front-pump-pto-switch",
+ "front-pump-ball-valve-switch",
+ "front-pump-aux-control-box",
+ "front-pump-aux-control-box-cover",
+ "front-pump-rescue-switch",
+ "bridge-engine",
+ "bridge-small-seat",
+ "bridge-small-valve",
+ "bridge-small-bolt-1",
+ "bridge-small-bolt-2",
+ "bridge-small-bolt-3",
+ "bridge-small-bolt-4",
+ "bridge-small-pipe",
+ "bridge-small-bag",
+ "bridge-small-cloth",
+ "bridge-small-plug-1",
+ "bridge-small-plug-2",
+ "bridge-large-seat",
+ "bridge-large-valve",
+ "bridge-large-bolt-1",
+ "bridge-large-bolt-2",
+ "bridge-large-bolt-3",
+ "bridge-large-bolt-4",
+ "bridge-large-pipe",
+ "bridge-large-bag",
+ "bridge-large-cloth",
+ "bridge-large-plug-1",
+ "bridge-large-plug-2"
+ ],
+ "readOnly": false,
+ "animations": [
+ {
+ "modelId": "front-pump-field-terrain",
+ "versionId": "",
+ "bindings": 0,
+ "unresolved": 0,
+ "flowVisible": false,
+ "native": []
+ },
+ {
+ "modelId": "front-pump-step-vehicle",
+ "versionId": "",
+ "bindings": 0,
+ "unresolved": 0,
+ "flowVisible": false,
+ "native": []
+ }
+ ]
+ },
+ "bridgeWorkshop": {
+ "pending": false,
+ "operation": {
+ "targetId": "bridge-small-cloth",
+ "kind": "identify",
+ "directionHint": "清洗并擦净阀体",
+ "effects": [
+ {
+ "targetId": "bridge-small-cloth",
+ "offset": [
+ 0.7,
+ 0,
+ -0.7
+ ]
+ },
+ {
+ "targetId": "bridge-small-valve",
+ "color": 8492701
+ }
+ ],
+ "index": 0,
+ "axis": [
+ 0,
+ 1,
+ 0
+ ],
+ "deltaDegrees": 0,
+ "toleranceDegrees": 6
+ },
+ "operationIndex": 0,
+ "targets": [
+ {
+ "id": "front-pump-hydraulic-pump",
+ "visible": true,
+ "position": [
+ 0,
+ 0,
+ 0
+ ],
+ "scale": [
+ 0.01,
+ 0.01,
+ 0.01
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ],
+ "home": [
+ 0,
+ 0,
+ 0
+ ],
+ "homeScale": [
+ 0.01,
+ 0.01,
+ 0.01
+ ]
+ },
+ {
+ "id": "bridge-engine",
+ "visible": true,
+ "position": [
+ -3,
+ 1.1,
+ 1.2
+ ],
+ "scale": [
+ 1,
+ 1,
+ 1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ],
+ "home": [
+ -3,
+ 1.1,
+ 1.2
+ ],
+ "homeScale": [
+ 1,
+ 1,
+ 1
+ ]
+ },
+ {
+ "id": "bridge-small-seat",
+ "visible": true,
+ "position": [
+ -1.6,
+ 1.1,
+ -0.15
+ ],
+ "scale": [
+ 1,
+ 1,
+ 1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ],
+ "home": [
+ -1.6,
+ 1.1,
+ -0.15
+ ],
+ "homeScale": [
+ 1,
+ 1,
+ 1
+ ]
+ },
+ {
+ "id": "bridge-small-valve",
+ "visible": true,
+ "position": [
+ -1.6,
+ 1.1,
+ 0.15
+ ],
+ "scale": [
+ 1,
+ 1,
+ 1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ],
+ "home": [
+ -1.6,
+ 1.1,
+ 0.15
+ ],
+ "homeScale": [
+ 1,
+ 1,
+ 1
+ ]
+ },
+ {
+ "id": "bridge-small-bolt-1",
+ "visible": true,
+ "position": [
+ -1.9200000000000002,
+ 1.29,
+ 0.42
+ ],
+ "scale": [
+ 1,
+ 1,
+ 1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ],
+ "home": [
+ -1.9200000000000002,
+ 1.29,
+ 0.42
+ ],
+ "homeScale": [
+ 1,
+ 1,
+ 1
+ ]
+ },
+ {
+ "id": "bridge-small-bolt-2",
+ "visible": true,
+ "position": [
+ -1.28,
+ 1.29,
+ 0.42
+ ],
+ "scale": [
+ 1,
+ 1,
+ 1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ],
+ "home": [
+ -1.28,
+ 1.29,
+ 0.42
+ ],
+ "homeScale": [
+ 1,
+ 1,
+ 1
+ ]
+ },
+ {
+ "id": "bridge-small-bolt-3",
+ "visible": true,
+ "position": [
+ -1.9200000000000002,
+ 0.9100000000000001,
+ 0.42
+ ],
+ "scale": [
+ 1,
+ 1,
+ 1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ],
+ "home": [
+ -1.9200000000000002,
+ 0.9100000000000001,
+ 0.42
+ ],
+ "homeScale": [
+ 1,
+ 1,
+ 1
+ ]
+ },
+ {
+ "id": "bridge-small-bolt-4",
+ "visible": true,
+ "position": [
+ -1.28,
+ 0.9100000000000001,
+ 0.42
+ ],
+ "scale": [
+ 1,
+ 1,
+ 1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ],
+ "home": [
+ -1.28,
+ 0.9100000000000001,
+ 0.42
+ ],
+ "homeScale": [
+ 1,
+ 1,
+ 1
+ ]
+ },
+ {
+ "id": "bridge-small-pipe",
+ "visible": true,
+ "position": [
+ -1.2000000000000002,
+ 1.1,
+ 0.1
+ ],
+ "scale": [
+ 1,
+ 1,
+ 1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ],
+ "home": [
+ -1.2000000000000002,
+ 1.1,
+ 0.1
+ ],
+ "homeScale": [
+ 1,
+ 1,
+ 1
+ ]
+ },
+ {
+ "id": "bridge-small-bag",
+ "visible": true,
+ "position": [
+ -0.6500000000000001,
+ 1.1,
+ 0.75
+ ],
+ "scale": [
+ 1,
+ 1,
+ 1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ],
+ "home": [
+ -0.6500000000000001,
+ 1.1,
+ 0.75
+ ],
+ "homeScale": [
+ 1,
+ 1,
+ 1
+ ]
+ },
+ {
+ "id": "bridge-small-cloth",
+ "visible": true,
+ "position": [
+ -2.3,
+ 0.85,
+ 0.9
+ ],
+ "scale": [
+ 1,
+ 1,
+ 1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ],
+ "home": [
+ -2.3,
+ 0.85,
+ 0.9
+ ],
+ "homeScale": [
+ 1,
+ 1,
+ 1
+ ]
+ },
+ {
+ "id": "bridge-small-plug-1",
+ "visible": true,
+ "position": [
+ -1.82,
+ 1.6500000000000001,
+ 0.5
+ ],
+ "scale": [
+ 1,
+ 1,
+ 1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ],
+ "home": [
+ -1.82,
+ 1.1,
+ 0
+ ],
+ "homeScale": [
+ 1,
+ 1,
+ 1
+ ]
+ },
+ {
+ "id": "bridge-small-plug-2",
+ "visible": true,
+ "position": [
+ -1.3800000000000001,
+ 1.6500000000000001,
+ 0.5
+ ],
+ "scale": [
+ 1,
+ 1,
+ 1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ],
+ "home": [
+ -1.3800000000000001,
+ 1.1,
+ 0
+ ],
+ "homeScale": [
+ 1,
+ 1,
+ 1
+ ]
+ },
+ {
+ "id": "bridge-large-seat",
+ "visible": true,
+ "position": [
+ 1.6,
+ 1.1,
+ -0.15
+ ],
+ "scale": [
+ 1,
+ 1,
+ 1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ],
+ "home": [
+ 1.6,
+ 1.1,
+ -0.15
+ ],
+ "homeScale": [
+ 1,
+ 1,
+ 1
+ ]
+ },
+ {
+ "id": "bridge-large-valve",
+ "visible": true,
+ "position": [
+ 1.6,
+ 1.1,
+ 0.15
+ ],
+ "scale": [
+ 1,
+ 1,
+ 1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ],
+ "home": [
+ 1.6,
+ 1.1,
+ 0.15
+ ],
+ "homeScale": [
+ 1,
+ 1,
+ 1
+ ]
+ },
+ {
+ "id": "bridge-large-bolt-1",
+ "visible": true,
+ "position": [
+ 1.28,
+ 1.29,
+ 0.42
+ ],
+ "scale": [
+ 1,
+ 1,
+ 1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ],
+ "home": [
+ 1.28,
+ 1.29,
+ 0.42
+ ],
+ "homeScale": [
+ 1,
+ 1,
+ 1
+ ]
+ },
+ {
+ "id": "bridge-large-bolt-2",
+ "visible": true,
+ "position": [
+ 1.9200000000000002,
+ 1.29,
+ 0.42
+ ],
+ "scale": [
+ 1,
+ 1,
+ 1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ],
+ "home": [
+ 1.9200000000000002,
+ 1.29,
+ 0.42
+ ],
+ "homeScale": [
+ 1,
+ 1,
+ 1
+ ]
+ },
+ {
+ "id": "bridge-large-bolt-3",
+ "visible": true,
+ "position": [
+ 1.28,
+ 0.9100000000000001,
+ 0.42
+ ],
+ "scale": [
+ 1,
+ 1,
+ 1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ],
+ "home": [
+ 1.28,
+ 0.9100000000000001,
+ 0.42
+ ],
+ "homeScale": [
+ 1,
+ 1,
+ 1
+ ]
+ },
+ {
+ "id": "bridge-large-bolt-4",
+ "visible": true,
+ "position": [
+ 1.9200000000000002,
+ 0.9100000000000001,
+ 0.42
+ ],
+ "scale": [
+ 1,
+ 1,
+ 1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ],
+ "home": [
+ 1.9200000000000002,
+ 0.9100000000000001,
+ 0.42
+ ],
+ "homeScale": [
+ 1,
+ 1,
+ 1
+ ]
+ },
+ {
+ "id": "bridge-large-pipe",
+ "visible": true,
+ "position": [
+ 2,
+ 1.1,
+ 0.1
+ ],
+ "scale": [
+ 1,
+ 1,
+ 1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ],
+ "home": [
+ 2,
+ 1.1,
+ 0.1
+ ],
+ "homeScale": [
+ 1,
+ 1,
+ 1
+ ]
+ },
+ {
+ "id": "bridge-large-bag",
+ "visible": true,
+ "position": [
+ 2.55,
+ 1.1,
+ 0.75
+ ],
+ "scale": [
+ 1,
+ 1,
+ 1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ],
+ "home": [
+ 2.55,
+ 1.1,
+ 0.75
+ ],
+ "homeScale": [
+ 1,
+ 1,
+ 1
+ ]
+ },
+ {
+ "id": "bridge-large-cloth",
+ "visible": true,
+ "position": [
+ 0.9000000000000001,
+ 0.85,
+ 0.9
+ ],
+ "scale": [
+ 1,
+ 1,
+ 1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ],
+ "home": [
+ 0.9000000000000001,
+ 0.85,
+ 0.9
+ ],
+ "homeScale": [
+ 1,
+ 1,
+ 1
+ ]
+ },
+ {
+ "id": "bridge-large-plug-1",
+ "visible": true,
+ "position": [
+ 1.3800000000000001,
+ 1.6500000000000001,
+ 0.5
+ ],
+ "scale": [
+ 1,
+ 1,
+ 1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ],
+ "home": [
+ 1.3800000000000001,
+ 1.1,
+ 0
+ ],
+ "homeScale": [
+ 1,
+ 1,
+ 1
+ ]
+ },
+ {
+ "id": "bridge-large-plug-2",
+ "visible": true,
+ "position": [
+ 1.82,
+ 1.6500000000000001,
+ 0.5
+ ],
+ "scale": [
+ 1,
+ 1,
+ 1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ],
+ "home": [
+ 1.82,
+ 1.1,
+ 0
+ ],
+ "homeScale": [
+ 1,
+ 1,
+ 1
+ ]
+ }
+ ]
+ },
+ "publishedContentMounted": true,
+ "publishedContentName": "重型支援桥平衡阀拆拼互换",
+ "publishedTrainingContent": {
+ "sceneId": "SCENE-FRONT-PUMP-RESCUE-01",
+ "objectCount": 2
+ },
+ "proceduralMachineVisible": false,
+ "publishedModelRootCount": 2,
+ "framing": {
+ "cameraPosition": [
+ 0,
+ 8.17,
+ 17.78
+ ],
+ "controlsTarget": [
+ 0,
+ 1.53,
+ 5.7
+ ],
+ "distance": 13.78,
+ "minDistance": 0.25,
+ "maxDistance": 800,
+ "fov": 45,
+ "near": 0.1,
+ "far": 800,
+ "fogNear": 70,
+ "fogFar": 240,
+ "modelSize": [
+ 140,
+ 28.34,
+ 116.19
+ ],
+ "modelCenter": [
+ 0,
+ -2.98,
+ 0
+ ],
+ "stepCameraPolicy": "focus",
+ "explosionItemCount": 36,
+ "structureNodeCount": 44,
+ "enablePan": true,
+ "outlineActive": false,
+ "labelsVisible": false,
+ "hideOthers": false,
+ "hiddenMeshCount": 0,
+ "keptTargets": [],
+ "targetOnScreen": {
+ "targetId": "bridge-small-cloth",
+ "localX": 397,
+ "localY": 435,
+ "insideCanvas": true,
+ "visible": true,
+ "coveredBy": []
+ },
+ "keptOpacity": [],
+ "environmentAlignment": null,
+ "sceneObjects": [
+ {
+ "name": "野外山地训练场",
+ "min": [
+ -70,
+ -17.14,
+ -58.1
+ ],
+ "max": [
+ 70,
+ 11.19,
+ 58.1
+ ]
+ },
+ {
+ "name": "架桥车前泵互救操作整车模型",
+ "min": [
+ -0.92,
+ 0,
+ -4
+ ],
+ "max": [
+ 0.92,
+ 1.97,
+ 4
+ ]
+ },
+ {
+ "name": "补充操作示意 · 非实车尺寸",
+ "min": [
+ -3.6,
+ 0,
+ 4.4
+ ],
+ "max": [
+ 3.6,
+ 3.05,
+ 7
+ ]
+ }
+ ],
+ "labelSamples": [
+ {
+ "targetId": "scene:front-pump-rescue-vehicle",
+ "targetName": "",
+ "partName": "架桥车前泵互救操作整车模型"
+ },
+ {
+ "targetId": "front-pump-hydraulic-pump",
+ "targetName": "",
+ "partName": "液压泵"
+ },
+ {
+ "targetId": "front-pump-power-take-off",
+ "targetName": "",
+ "partName": "取力器"
+ },
+ {
+ "targetId": "front-pump-pto-switch",
+ "targetName": "",
+ "partName": "取力器开关"
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/reports/bridge-three-dimensional-20260913/TASK-VIRTUAL-008-original.png b/reports/bridge-three-dimensional-20260913/TASK-VIRTUAL-008-original.png
new file mode 100644
index 0000000..1ba9066
Binary files /dev/null and b/reports/bridge-three-dimensional-20260913/TASK-VIRTUAL-008-original.png differ
diff --git a/reports/bridge-three-dimensional-20260913/TASK-VIRTUAL-008-reviewed.png b/reports/bridge-three-dimensional-20260913/TASK-VIRTUAL-008-reviewed.png
new file mode 100644
index 0000000..91a5df8
Binary files /dev/null and b/reports/bridge-three-dimensional-20260913/TASK-VIRTUAL-008-reviewed.png differ
diff --git a/reports/bridge-three-dimensional-20260913/TASK-VIRTUAL-008-start.png b/reports/bridge-three-dimensional-20260913/TASK-VIRTUAL-008-start.png
new file mode 100644
index 0000000..348b441
Binary files /dev/null and b/reports/bridge-three-dimensional-20260913/TASK-VIRTUAL-008-start.png differ
diff --git a/reports/bridge-three-dimensional-20260913/TASK-VIRTUAL-008-step-11.png b/reports/bridge-three-dimensional-20260913/TASK-VIRTUAL-008-step-11.png
new file mode 100644
index 0000000..927a976
Binary files /dev/null and b/reports/bridge-three-dimensional-20260913/TASK-VIRTUAL-008-step-11.png differ
diff --git a/reports/bridge-three-dimensional-20260913/TASK-VIRTUAL-008-step-16.png b/reports/bridge-three-dimensional-20260913/TASK-VIRTUAL-008-step-16.png
new file mode 100644
index 0000000..611b411
Binary files /dev/null and b/reports/bridge-three-dimensional-20260913/TASK-VIRTUAL-008-step-16.png differ
diff --git a/reports/bridge-three-dimensional-20260913/TASK-VIRTUAL-008-step-2.png b/reports/bridge-three-dimensional-20260913/TASK-VIRTUAL-008-step-2.png
new file mode 100644
index 0000000..cdc168b
Binary files /dev/null and b/reports/bridge-three-dimensional-20260913/TASK-VIRTUAL-008-step-2.png differ
diff --git a/reports/bridge-three-dimensional-20260913/TASK-VIRTUAL-008-step-4.png b/reports/bridge-three-dimensional-20260913/TASK-VIRTUAL-008-step-4.png
new file mode 100644
index 0000000..5399288
Binary files /dev/null and b/reports/bridge-three-dimensional-20260913/TASK-VIRTUAL-008-step-4.png differ
diff --git a/reports/bridge-three-dimensional-20260913/TASK-VIRTUAL-008-step-5.png b/reports/bridge-three-dimensional-20260913/TASK-VIRTUAL-008-step-5.png
new file mode 100644
index 0000000..9b8fb3e
Binary files /dev/null and b/reports/bridge-three-dimensional-20260913/TASK-VIRTUAL-008-step-5.png differ
diff --git a/reports/bridge-three-dimensional-20260913/TASK-VIRTUAL-008-step-8.png b/reports/bridge-three-dimensional-20260913/TASK-VIRTUAL-008-step-8.png
new file mode 100644
index 0000000..1c5a0e3
Binary files /dev/null and b/reports/bridge-three-dimensional-20260913/TASK-VIRTUAL-008-step-8.png differ
diff --git a/reports/bridge-three-dimensional-20260913/acceptance.json b/reports/bridge-three-dimensional-20260913/acceptance.json
new file mode 100644
index 0000000..f78f4bf
--- /dev/null
+++ b/reports/bridge-three-dimensional-20260913/acceptance.json
@@ -0,0 +1,9 @@
+{
+ "pass": true,
+ "checks": [
+ "TASK-VIRTUAL-006: 7 steps, 11 3D operations; preview server validation passed",
+ "TASK-VIRTUAL-007: 11 steps, 27 3D operations; preview server validation passed",
+ "TASK-VIRTUAL-008: 16 steps, 50 3D operations; preview server validation passed"
+ ],
+ "errors": []
+}
\ No newline at end of file
diff --git a/reports/bridge-three-dimensional-20260913/cleanup.json b/reports/bridge-three-dimensional-20260913/cleanup.json
new file mode 100644
index 0000000..d261869
--- /dev/null
+++ b/reports/bridge-three-dimensional-20260913/cleanup.json
@@ -0,0 +1,51 @@
+{
+ "result": "PASS",
+ "softDeletedTasks": 7,
+ "keptTaskIds": [
+ 86,
+ 87,
+ 88,
+ 89
+ ],
+ "counts": {
+ "ut_teaching_assignment": 7,
+ "ut_teaching_command_receipt": 189,
+ "ut_teaching_event": 210,
+ "ut_teaching_member": 7,
+ "ut_teaching_run": 7,
+ "ut_teaching_run_member": 7,
+ "ut_teaching_step_run": 66
+ },
+ "backupSha256": "73d20cfdb2687d1980196184d5b367adf09b6fde16576127ee32bf49b1efbf8f",
+ "softDeletedProjects": [
+ "446",
+ "447",
+ "448",
+ "449",
+ "450",
+ "451",
+ "452"
+ ],
+ "remaining": [
+ {
+ "id": "89",
+ "code": "TASK-VIRTUAL-008",
+ "scriptVersion": "3"
+ },
+ {
+ "id": "88",
+ "code": "TASK-VIRTUAL-007",
+ "scriptVersion": "2"
+ },
+ {
+ "id": "87",
+ "code": "TASK-VIRTUAL-006",
+ "scriptVersion": "2"
+ },
+ {
+ "id": "86",
+ "code": "TASK-VIRTUAL-005",
+ "scriptVersion": "2"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/reports/bridge-three-dimensional-20260913/failure.png b/reports/bridge-three-dimensional-20260913/failure.png
new file mode 100644
index 0000000..9da0a26
Binary files /dev/null and b/reports/bridge-three-dimensional-20260913/failure.png differ
diff --git a/reports/bridge-three-dimensional-20260913/fixtures-1789314723229.json b/reports/bridge-three-dimensional-20260913/fixtures-1789314723229.json
new file mode 100644
index 0000000..87a05da
--- /dev/null
+++ b/reports/bridge-three-dimensional-20260913/fixtures-1789314723229.json
@@ -0,0 +1,7 @@
+[
+ {
+ "code": "TASK-VIRTUAL-006",
+ "projectId": "446",
+ "taskId": "106"
+ }
+]
\ No newline at end of file
diff --git a/reports/bridge-three-dimensional-20260913/fixtures-1789314864375.json b/reports/bridge-three-dimensional-20260913/fixtures-1789314864375.json
new file mode 100644
index 0000000..9f92c3b
--- /dev/null
+++ b/reports/bridge-three-dimensional-20260913/fixtures-1789314864375.json
@@ -0,0 +1,19 @@
+[
+ {
+ "code": "TASK-VIRTUAL-006",
+ "projectId": "447",
+ "taskId": "107",
+ "passed": true
+ },
+ {
+ "code": "TASK-VIRTUAL-007",
+ "projectId": "448",
+ "taskId": "108",
+ "passed": true
+ },
+ {
+ "code": "TASK-VIRTUAL-008",
+ "projectId": "449",
+ "taskId": "109"
+ }
+]
\ No newline at end of file
diff --git a/reports/bridge-three-dimensional-20260913/fixtures-1789315822880.json b/reports/bridge-three-dimensional-20260913/fixtures-1789315822880.json
new file mode 100644
index 0000000..cb1bf7e
--- /dev/null
+++ b/reports/bridge-three-dimensional-20260913/fixtures-1789315822880.json
@@ -0,0 +1,20 @@
+[
+ {
+ "code": "TASK-VIRTUAL-006",
+ "projectId": "450",
+ "taskId": "110",
+ "passed": true
+ },
+ {
+ "code": "TASK-VIRTUAL-007",
+ "projectId": "451",
+ "taskId": "111",
+ "passed": true
+ },
+ {
+ "code": "TASK-VIRTUAL-008",
+ "projectId": "452",
+ "taskId": "112",
+ "passed": true
+ }
+]
\ No newline at end of file
diff --git a/reports/bridge-three-dimensional-20260913/index.html b/reports/bridge-three-dimensional-20260913/index.html
new file mode 100644
index 0000000..ca9da87
--- /dev/null
+++ b/reports/bridge-three-dimensional-20260913/index.html
@@ -0,0 +1 @@
+桥梁三套流程三维验收桥梁三套流程三维验收
2026-09-14 · 三维实现与正式训练验证通过
006、007 的原任务已有学员运行,现有接口禁止撤回覆盖。三维实现已完成;这两条原任务的入口迁移仍待确定已有试用记录的处理方式。008 原入口已更新,005 保留原流程。
| 任务 | 三维操作 | 原入口状态 |
|---|
| 005 液压泵应急切换 | 原 5 步机制保留并回归验证 | 保持原三维入口 |
| 006 液压泵应急替代 | 7 步 / 11 项接头、软管、阀门与开关 | 已有提交记录,等待换版处理 |
| 007 前泵换件修复 | 11 步 / 27 项螺栓、旧泵、新泵、纸垫与加油 | 已有进行中记录,等待换版处理 |
| 008 平衡阀拆拼互换 | 16 步 / 50 项拆卸、封堵、互换与连接 | 原任务 89 已更新到脚本 v3 |
验证内容
- TASK-VIRTUAL-006: 7 steps, 11 3D operations; preview server validation passed
- TASK-VIRTUAL-007: 11 steps, 27 3D operations; preview server validation passed
- TASK-VIRTUAL-008: 16 steps, 50 3D operations; preview server validation passed
- 保存失败保留当前步骤与未完成状态,允许重试
- TASK-VIRTUAL-006 刷新恢复模型位置、封堵显示状态与步骤进度
- TASK-VIRTUAL-006 三维操作、提交与教员评定通过
- TASK-VIRTUAL-007 刷新恢复模型位置、封堵显示状态与步骤进度
- TASK-VIRTUAL-007 三维操作、提交与教员评定通过
- TASK-VIRTUAL-008 刷新恢复模型位置、封堵显示状态与步骤进度
- TASK-VIRTUAL-008 三维操作、提交与教员评定通过
- TASK-VIRTUAL-005 原任务入口通过,原运行与成绩未变化
- TASK-VIRTUAL-008 原任务入口通过,原运行与成绩未变化
- 前端生产构建通过;后端 ut_tran 测试 422 项通过。
- 逐项校验零件位移、显示与缩放,验证刷新恢复、失败重试、服务端保存、提交与教员评定。
- 验收副本 7 条及关联运行已软删除,原四条任务与其原有运行保持保留。
实现边界
与 005 共用 HTML+JS 三维工作区和结构树、聚焦、高亮、标签、隔离、爆炸工具。整车与液压泵使用原 GLB;原模型没有的软管、封口袋、纸垫和平衡阀等采用明确标注的补充操作示意,不能当作实车精确结构或扭矩、受力测量。
平衡阀第 11、15 步原稿指令冲突,必须记录处理依据后交教员核对;没有自动认定机械操作正确。教员预览不产生学员成绩;学员正式训练通过现有接口保存并评分。
006:接管与应急替代

007:换泵与零件状态恢复

008:原任务三维入口

008:平衡阀互换与教员评定

原始结果
预览验证 · 学员训练验证 · 原入口回归 · 测试数据清理
\ No newline at end of file
diff --git a/reports/bridge-three-dimensional-20260913/originals.json b/reports/bridge-three-dimensional-20260913/originals.json
new file mode 100644
index 0000000..48c09fe
--- /dev/null
+++ b/reports/bridge-three-dimensional-20260913/originals.json
@@ -0,0 +1,7 @@
+{
+ "pass": true,
+ "checks": [
+ "TASK-VIRTUAL-005 原任务入口通过,原运行与成绩未变化",
+ "TASK-VIRTUAL-008 原任务入口通过,原运行与成绩未变化"
+ ]
+}
\ No newline at end of file
diff --git a/reports/bridge-three-dimensional-20260913/run-acceptance.json b/reports/bridge-three-dimensional-20260913/run-acceptance.json
new file mode 100644
index 0000000..42a810d
--- /dev/null
+++ b/reports/bridge-three-dimensional-20260913/run-acceptance.json
@@ -0,0 +1,30 @@
+{
+ "pass": true,
+ "checks": [
+ "保存失败保留当前步骤与未完成状态,允许重试",
+ "TASK-VIRTUAL-006 刷新恢复模型位置、封堵显示状态与步骤进度",
+ "TASK-VIRTUAL-006 三维操作、提交与教员评定通过",
+ "TASK-VIRTUAL-007 刷新恢复模型位置、封堵显示状态与步骤进度",
+ "TASK-VIRTUAL-007 三维操作、提交与教员评定通过",
+ "TASK-VIRTUAL-008 刷新恢复模型位置、封堵显示状态与步骤进度",
+ "TASK-VIRTUAL-008 三维操作、提交与教员评定通过"
+ ],
+ "runs": [
+ {
+ "taskId": "110",
+ "runId": "108",
+ "code": "TASK-VIRTUAL-006"
+ },
+ {
+ "taskId": "111",
+ "runId": "109",
+ "code": "TASK-VIRTUAL-007"
+ },
+ {
+ "taskId": "112",
+ "runId": "110",
+ "code": "TASK-VIRTUAL-008"
+ }
+ ],
+ "errors": []
+}
\ No newline at end of file
diff --git a/reports/bridge-three-dimensional-20260913/run-attempts.jsonl b/reports/bridge-three-dimensional-20260913/run-attempts.jsonl
new file mode 100644
index 0000000..4be3805
--- /dev/null
+++ b/reports/bridge-three-dimensional-20260913/run-attempts.jsonl
@@ -0,0 +1,3 @@
+{"runs":[{"taskId":"107","runId":"105","code":"TASK-VIRTUAL-006"},{"taskId":"108","runId":"106","code":"TASK-VIRTUAL-007"}],"userId":"172"}
+{"runs":[{"taskId":"110","runId":"107","code":"TASK-VIRTUAL-006"}],"userId":"173"}
+{"runs":[{"taskId":"110","runId":"108","code":"TASK-VIRTUAL-006"},{"taskId":"111","runId":"109","code":"TASK-VIRTUAL-007"},{"taskId":"112","runId":"110","code":"TASK-VIRTUAL-008"}],"userId":"174"}
diff --git a/reports/bridge-three-dimensional-20260913/run-diagnostic.json b/reports/bridge-three-dimensional-20260913/run-diagnostic.json
new file mode 100644
index 0000000..ec747fa
--- /dev/null
+++ b/reports/bridge-three-dimensional-20260913/run-diagnostic.json
@@ -0,0 +1 @@
+null
\ No newline at end of file
diff --git a/reports/bridge-three-dimensional-20260913/run-failure.png b/reports/bridge-three-dimensional-20260913/run-failure.png
new file mode 100644
index 0000000..9868760
Binary files /dev/null and b/reports/bridge-three-dimensional-20260913/run-failure.png differ
diff --git a/reports/bridge-three-dimensional-20260913/run-fixtures.json b/reports/bridge-three-dimensional-20260913/run-fixtures.json
new file mode 100644
index 0000000..02c4fa8
--- /dev/null
+++ b/reports/bridge-three-dimensional-20260913/run-fixtures.json
@@ -0,0 +1,17 @@
+[
+ {
+ "taskId": "110",
+ "runId": "108",
+ "code": "TASK-VIRTUAL-006"
+ },
+ {
+ "taskId": "111",
+ "runId": "109",
+ "code": "TASK-VIRTUAL-007"
+ },
+ {
+ "taskId": "112",
+ "runId": "110",
+ "code": "TASK-VIRTUAL-008"
+ }
+]
\ No newline at end of file
diff --git a/tools/bridge-grounding-live.mjs b/tools/bridge-grounding-live.mjs
new file mode 100644
index 0000000..f5e0c87
--- /dev/null
+++ b/tools/bridge-grounding-live.mjs
@@ -0,0 +1,52 @@
+import fs from 'node:fs';
+import assert from 'node:assert/strict';
+import { chromium, expect } from '@playwright/test';
+import { login, call } from './role-permissions-live.mjs';
+import { scripts, scriptDefinition } from '../../unreal_tran_web/src/features/virtual-training-scripts/definition.js';
+const dir='reports/bridge-grounding-20260914';fs.mkdirSync(dir,{recursive:true});
+const session=await login('root'),checks=[],errors=[],writes=[];
+const api=async path=>{const r=await call('tran/v1/'+path,session.accessToken);assert.equal(r.status,200);return r.data;};
+const before=await api('teaching/assignments?channel=VIRTUAL&assignmentKind=TRAINING&size=100');
+const browser=await chromium.launch({channel:'msedge',headless:true,args:['--enable-unsafe-swiftshader']});
+const page=await browser.newPage({viewport:{width:1920,height:1000}});
+await page.addInitScript(s=>{sessionStorage.setItem('unreal-tran:web:access-token:v1',s.accessToken);localStorage.setItem('unreal-tran:web:preferences:v1',JSON.stringify({themeMode:'military'}));},session);
+page.on('pageerror',e=>errors.push(e.message));
+page.on('request',r=>{if(r.method()!=='GET'&&r.url().includes('/api/tran/'))writes.push(r.url());});
+const diag=()=>page.evaluate(()=>globalThis.__trainingSceneDiagnostics());
+const ready=async()=>{await expect(page.locator('[data-role="loading"]')).toHaveClass(/is-hidden/,{timeout:120000});await page.waitForTimeout(1300);};
+const verify=d=>{
+ assert.ok(d.bridgeGrounding?.length);assert.ok(d.framing.environmentAlignment.workArea.changedVertices>0);
+ for(const p of d.bridgeGrounding){assert.ok(Math.abs(p.minGap)<1e-6);assert.ok(p.maxGap<0.03,JSON.stringify(p));}
+ const vehicle=d.framing.sceneObjects[1];assert.ok(Math.abs(vehicle.min[1])<0.03,JSON.stringify(vehicle));return vehicle;
+};
+try{
+ for(const id of [86,87,88,89]){
+ const task=before.records.find(t=>Number(t.id)===id),script=scripts.find(s=>s.code===task.code);
+ const isolated=task.definitionSnapshot.runtime.scriptVersion!==script.version;
+ // Older published tasks remain untouched: only this browser's GET response is replaced for rendering QA.
+ if(isolated)await page.route(`**/api/tran/v1/teaching/assignments/${id}`,async route=>{
+ const response=await route.fetch(),body=await response.json();body.data.definitionSnapshot=scriptDefinition(script);await route.fulfill({response,json:body});
+ });
+ await page.goto(`http://127.0.0.1:6180/teaching/virtual-training/preview/${id}`);await ready();
+ const initial=await diag(),pose=verify(initial);
+ await page.locator('[data-action="viewer-reset-view"]').click();await page.waitForTimeout(700);
+ assert.deepEqual(verify(await diag()),pose);
+ await page.screenshot({path:`${dir}/${task.code}.png`});
+ if(!isolated){
+ const response=page.waitForResponse(r=>r.url().includes('/preview/validate'));
+ await page.locator('[data-role="part-label"]').click();assert.equal((await response).status(),200);
+ await expect(page.locator('[data-action="next"]')).toBeEnabled();await page.locator('[data-action="next"]').click();
+ await page.locator('[data-action="viewer-reset-view"]').click();await page.waitForTimeout(700);
+ assert.deepEqual(verify(await diag()),pose);
+ }
+ await page.reload();await ready();assert.deepEqual(verify(await diag()),pose);
+ checks.push({code:task.code,pass:true,mode:isolated?'isolated-v3-render-no-database-change':'published-task-preview',grounding:initial.bridgeGrounding});
+ await page.unrouteAll({behavior:'wait'});
+ }
+ assert.deepEqual(errors,[]);assert.ok(writes.every(url=>url.endsWith('/preview/validate')));
+ const after=await api('teaching/assignments?channel=VIRTUAL&assignmentKind=TRAINING&size=100');
+ assert.equal(after.total,before.total);assert.deepEqual(after.records.map(t=>[t.id,t.version,t.contentVersionId]),before.records.map(t=>[t.id,t.version,t.contentVersionId]));
+ fs.writeFileSync(`${dir}/result.json`,JSON.stringify({pass:true,checks,errors,remainingTasks:after.total,databaseWrites:'preview validation only; no task/run creation or migration'},null,2));
+ fs.writeFileSync(`${dir}/index.html`,`桥梁车辆贴地修复桥梁车辆贴地修复 · 验证通过
仅对四套桥梁脚本的训练位置平整地形,按轮胎与桌脚接触点贴地;原 GLB 文件和其他场景不变。验证复位、重新加载,以及 005/008 原任务切换步骤后车辆保持地面位置。
006/007 的三维版使用浏览器内隔离渲染验证,未变更旧任务入口或已有记录。列表仍为 ${after.total} 条,没有新增测试任务。
前端构建与贴地/正式路由测试通过。原始验证结果
${checks.map(c=>`${c.code}
${c.mode}
`).join('')}`);
+}catch(error){await page.screenshot({path:`${dir}/failure.png`}).catch(()=>{});fs.writeFileSync(`${dir}/result.json`,JSON.stringify({pass:false,error:error.message,checks,errors},null,2));throw error;}
+finally{await browser.close();}
diff --git a/tools/bridge-three-dimensional-assertions.mjs b/tools/bridge-three-dimensional-assertions.mjs
new file mode 100644
index 0000000..7c4aabb
--- /dev/null
+++ b/tools/bridge-three-dimensional-assertions.mjs
@@ -0,0 +1,14 @@
+import assert from 'node:assert/strict';
+import { expect } from '@playwright/test';
+
+export async function verifyVisualEffects(page, operation) {
+ await expect.poll(async()=>page.evaluate(()=>globalThis.__trainingSceneDiagnostics().bridgeWorkshop.pending)).toBe(false);
+ const targets = await page.evaluate(()=>globalThis.__trainingSceneDiagnostics().bridgeWorkshop.targets);
+ for (const effect of operation.effects || []) {
+ const target = targets.find(item=>item.id===effect.targetId);
+ assert.ok(target, `Missing visual target ${effect.targetId}`);
+ if (typeof effect.visible==='boolean') assert.equal(target.visible,effect.visible,`${effect.targetId} visibility`);
+ if (effect.offset) assert.ok(target.position.every((v,i)=>Math.abs(v-target.home[i]-effect.offset[i])<0.001),`${effect.targetId} displacement`);
+ if (effect.scale) assert.ok(target.scale.every((v,i)=>Math.abs(v-target.homeScale[i]*effect.scale[i])<0.001),`${effect.targetId} scale`);
+ }
+}
diff --git a/tools/bridge-three-dimensional-live.mjs b/tools/bridge-three-dimensional-live.mjs
new file mode 100644
index 0000000..727d31e
--- /dev/null
+++ b/tools/bridge-three-dimensional-live.mjs
@@ -0,0 +1,69 @@
+import { chromium, expect } from '@playwright/test';
+import fs from 'node:fs';
+import assert from 'node:assert/strict';
+import crypto from 'node:crypto';
+import { login, call } from './role-permissions-live.mjs';
+import { scripts, scriptDefinition } from '../../unreal_tran_web/src/features/virtual-training-scripts/definition.js';
+import { verifyVisualEffects } from './bridge-three-dimensional-assertions.mjs';
+
+const dir='reports/bridge-three-dimensional-20260913';fs.mkdirSync(dir,{recursive:true});
+const session=await login('root'), fixtures=[], checks=[], errors=[];
+const api=async(path,data,method)=>{const r=await call(path,session.accessToken,data,method);assert.equal(r.status,200,`${path}: ${r.message}`);return r.data;};
+const fixtureFile=`${dir}/fixtures-${Date.now()}.json`;
+const saveFixtures=()=>fs.writeFileSync(fixtureFile,JSON.stringify(fixtures,null,2));
+const browser=await chromium.launch({channel:'msedge',headless:true,args:['--enable-unsafe-swiftshader']});
+const page=await browser.newPage({viewport:{width:1600,height:1000}});
+await page.addInitScript(s=>sessionStorage.setItem('unreal-tran:web:access-token:v1',s.accessToken),session);
+page.on('pageerror',e=>errors.push(e.message));
+const waitReady=async()=>{await expect(page.locator('[data-role="loading"]')).toHaveClass(/is-hidden/,{timeout:120000});await page.waitForFunction(()=>globalThis.__trainingSceneDiagnostics()?.bridgeWorkshop?.targets.length>0);await page.waitForTimeout(1800);};
+try {
+ for(const script of scripts.filter(s=>s.version==='3' && (!process.env.BRIDGE_CODE || process.env.BRIDGE_CODE===s.code))) {
+ const content=await api('tran/v1/content/projects',{type:'TRAINING',name:`三维验收·${script.title}`,description:'Temporary 3D acceptance fixture',categoryCode:'MAINTENANCE',trainingMode:'VIRTUAL',content:scriptDefinition(script),dependencies:[],assets:[]});
+ const fixture={code:script.code,projectId:content.project.id};fixtures.push(fixture);saveFixtures();
+ const project=(await api(`tran/v1/content/projects/${fixture.projectId}/publish`,{version:content.project.version})).project;
+ let task=await api('tran/v1/teaching/assignments',{code:`CHECK-3D-${Date.now()}-${script.code}`,name:`三维验收·${script.title}`,description:'Temporary acceptance fixture',channel:'VIRTUAL',assignmentKind:'TRAINING',executionMode:'PRACTICE',audienceType:'COMMON',collaborationMode:'INDIVIDUAL',digitalHumanAllowed:false,contentProjectId:project.id,contentVersionId:project.publishedVersionId,members:[]});
+ fixture.taskId=task.id;saveFixtures();
+ task=await api(`tran/v1/teaching/assignments/${task.id}/publish`,{version:task.version});
+ await page.goto(`http://127.0.0.1:6180/teaching/virtual-training/preview/${task.id}`);await waitReady();
+ await expect(page.locator('.bridge-procedure')).toHaveCount(0);
+ const bar=page.locator('[data-role="model-commandbar"]');
+ for(const action of ['toggle-structure-tree','focus-selected-part','viewer-reset-view','toggle-part-labels','toggle-issue-highlight','toggle-hide-others','toggle-explosion'])await expect(bar.locator(`[data-action="${action}"]`)).toBeVisible();
+ await page.screenshot({path:`${dir}/${script.code}-start.png`});
+ fs.writeFileSync(`${dir}/${script.code}-diagnostic.json`,JSON.stringify(await page.evaluate(()=>globalThis.__trainingSceneDiagnostics()),null,2));
+ for(let index=0;indexpage.evaluate(()=>globalThis.__trainingSceneDiagnostics().bridgeWorkshop.operationIndex)).toBe(k);
+ if(k===step.action.mechanism.steps.length-1){
+ const response=page.waitForResponse(r=>r.url().includes(`/assignments/${task.id}/preview/validate`));
+ await page.locator('[data-role="part-label"]').click();
+ assert.equal((await response).status(),200);
+ }else{
+ await page.locator('[data-role="part-label"]').click();
+ await expect.poll(async()=>page.evaluate(()=>globalThis.__trainingSceneDiagnostics().bridgeWorkshop.operationIndex)).toBe(k+1);
+ }
+ await verifyVisualEffects(page,op);
+ console.log(script.code,index+1,k+1,op.targetId);
+ }
+ await expect(page.locator('[data-action="next"]')).toBeEnabled();
+ if([1,3,4,7,10,15].includes(index))await page.screenshot({path:`${dir}/${script.code}-step-${index+1}.png`});
+ if(indexs.action.mechanism.steps).length} 3D operations; preview server validation passed`);
+ fixture.passed=true;saveFixtures();
+ }
+ assert.deepEqual(errors,[]);
+ fs.writeFileSync(`${dir}/acceptance.json`,JSON.stringify({pass:true,checks,errors},null,2));
+} catch(error){
+ console.log('Feedback',await page.locator('.el-message').allTextContents());
+ await page.screenshot({path:`${dir}/failure.png`}).catch(()=>{});
+ fs.writeFileSync(`${dir}/acceptance.json`,JSON.stringify({pass:false,error:error.message,checks,errors},null,2));throw error;
+}finally{await browser.close();saveFixtures();}
diff --git a/tools/bridge-three-dimensional-originals.mjs b/tools/bridge-three-dimensional-originals.mjs
new file mode 100644
index 0000000..9c078ee
--- /dev/null
+++ b/tools/bridge-three-dimensional-originals.mjs
@@ -0,0 +1,30 @@
+import {chromium,expect} from '@playwright/test';
+import assert from 'node:assert/strict';
+import fs from 'node:fs';
+import {login,call} from './role-permissions-live.mjs';
+const dir='reports/bridge-three-dimensional-20260913', s=await login('root'),checks=[];
+const api=async p=>{const r=await call('tran/v1/'+p,s.accessToken);assert.equal(r.status,200);return r.data;};
+const browser=await chromium.launch({channel:'msedge',headless:true,args:['--enable-unsafe-swiftshader']});
+try {
+ const page=await browser.newPage({viewport:{width:1600,height:1000}});
+ await page.addInitScript(s=>{sessionStorage.setItem('unreal-tran:web:access-token:v1',s.accessToken);localStorage.setItem('unreal-tran:web:preferences:v1',JSON.stringify({themeMode:'military'}));},s);
+ for(const id of [86,89]) {
+ const task=await api('teaching/assignments/'+id), before=await api('teaching/runs?assignmentId='+id+'&size=100');
+ await page.goto('http://127.0.0.1:6180/teaching/virtual-training/preview/'+id);
+ await expect(page.locator('[data-role="loading"]')).toHaveClass(/is-hidden/,{timeout:120000});await page.waitForTimeout(1500);
+ const steps=id===86?task.definitionSnapshot.steps:task.definitionSnapshot.steps.slice(0,1);
+ for(let i=0;ir.url().includes('/preview/validate'));await page.locator('[data-role="part-label"]').click();assert.equal((await response).status(),200);}
+ else{await page.locator('[data-role="part-label"]').click();await page.waitForTimeout(1000);}
+ }
+ await expect(page.locator('[data-action="next"]')).toBeEnabled();
+ if(iJSON.parse(JSON.stringify(value,(key,item)=>key==='serverNow'?undefined:item));
+ assert.deepEqual(stable((await api('teaching/runs?assignmentId='+id+'&size=100')).records),stable(before.records));
+ checks.push(`${task.code} 原任务入口通过,原运行与成绩未变化`);
+ }
+ fs.writeFileSync(`${dir}/originals.json`,JSON.stringify({pass:true,checks},null,2));
+}finally{await browser.close();}
diff --git a/tools/bridge-three-dimensional-run.mjs b/tools/bridge-three-dimensional-run.mjs
new file mode 100644
index 0000000..a118800
--- /dev/null
+++ b/tools/bridge-three-dimensional-run.mjs
@@ -0,0 +1,77 @@
+import {chromium,expect} from '@playwright/test';
+import assert from 'node:assert/strict';
+import crypto from 'node:crypto';
+import fs from 'node:fs';
+import {login,call} from './role-permissions-live.mjs';
+import { scripts } from '../../unreal_tran_web/src/features/virtual-training-scripts/definition.js';
+import { verifyVisualEffects } from './bridge-three-dimensional-assertions.mjs';
+
+const dir='reports/bridge-three-dimensional-20260913';
+const root=await login('root');
+const api=async(path,data,method)=>{const r=await call(path,root.accessToken,data,method);assert.equal(r.status,200,`${path}: ${r.message}`);return r.data;};
+const roles=await api('auth/v1/roles/all'),role=(roles.records||roles).find(r=>r.code==='student');
+const password='Br!'+crypto.randomBytes(8).toString('hex');
+const created=await api('auth/v1/users',{username:'bridge3d_'+Date.now().toString(36),password,displayName:'三维流程验收',departmentId:'5',roleIds:[role.id],defaultRoleId:role.id,enabled:true,remark:'临时验收账号'});
+const userId=(created.user||created).id;
+const signed=await call('auth/v1/auth/login',null,{userId,password,roleCode:'student',rememberMe:false});assert.equal(signed.status,200);
+const learner=async(path,data)=>{const r=await call('tran/v1/'+path,signed.data.accessToken,data);assert.equal(r.status,200,`${path}: ${r.message}`);return r.data;};
+const file=fs.readdirSync(dir).filter(n=>/^fixtures-\d+\.json$/.test(n)).sort().at(-1);
+const fixtures=JSON.parse(fs.readFileSync(`${dir}/${file}`,'utf8'));
+const checks=[],runs=[],errors=[];
+const browser=await chromium.launch({channel:'msedge',headless:true,args:['--enable-unsafe-swiftshader']});
+const page=await browser.newPage({viewport:{width:1600,height:1000}});
+await page.addInitScript(s=>{sessionStorage.setItem('unreal-tran:web:access-token:v1',s.accessToken);localStorage.setItem('unreal-tran:web:preferences:v1',JSON.stringify({themeMode:'military'}));},signed.data);
+page.on('pageerror',e=>errors.push(e.message));
+const ready=async()=>{await page.waitForFunction(()=>globalThis.__trainingSceneDiagnostics?.()?.bridgeWorkshop?.targets.length>0,{},{timeout:120000});await page.waitForTimeout(1200);};
+const diag=()=>page.evaluate(()=>globalThis.__trainingSceneDiagnostics());
+try{
+ for(const fixture of fixtures.filter(f=>!process.env.BRIDGE_CODE||process.env.BRIDGE_CODE===f.code)){
+ const task=await learner(`teaching/assignments/${fixture.taskId}`);
+ const script=scripts.find(s=>s.code===fixture.code);
+ assert.deepEqual(task.definitionSnapshot.steps.map(s=>s.action.mechanism.steps),script.definition.steps.map(s=>s.action.mechanism.steps),'Learner projection must retain visual actions');
+ let run=await learner(`teaching/assignments/${task.id}/accept`,{assignmentVersion:task.version,teamCode:'NEUTRAL',positionCode:'LEARNER'});
+ runs.push({taskId:task.id,runId:run.id,code:fixture.code});fs.writeFileSync(`${dir}/run-fixtures.json`,JSON.stringify(runs,null,2));
+ await page.goto(`http://127.0.0.1:6180/teaching/virtual-training/runs/${run.id}`);await ready();
+ for(let index=0;index(await diag()).bridgeWorkshop.operation.targetId).toBe(ops[k].targetId);
+ if(index===0&&k===ops.length-1&&fixture.code==='TASK-VIRTUAL-006'){
+ await page.route(`**/teaching/runs/${run.id}/progress`,route=>route.fulfill({status:503,contentType:'application/json',body:JSON.stringify({code:'SERVICE_UNAVAILABLE',message:'验收模拟保存失败'})}),{times:1});
+ const response=page.waitForResponse(r=>r.url().includes(`/runs/${run.id}/progress`));
+ await page.locator('[data-role="part-label"]').click();assert.equal((await response).status(),503);
+ await expect.poll(async()=>(await diag()).bridgeWorkshop.pending).toBe(false);
+ assert.equal((await learner(`teaching/runs/${run.id}`)).progressPercent,0);
+ await expect(page.locator('[data-action="next"]')).toBeDisabled();checks.push('保存失败保留当前步骤与未完成状态,允许重试');
+ }
+ if(k===ops.length-1){const r=page.waitForResponse(r=>r.url().includes(`/runs/${run.id}/progress`));await page.locator('[data-role="part-label"]').click();assert.equal((await r).status(),200);}
+ else{await page.locator('[data-role="part-label"]').click();await expect.poll(async()=>(await diag()).bridgeWorkshop.operationIndex).toBe(k+1);}
+ await verifyVisualEffects(page,ops[k]);
+ }
+ await expect(page.locator('[data-action="next"]')).toBeEnabled();
+ const saved=await learner(`teaching/runs/${run.id}/steps`);assert.equal(saved.filter(s=>s.statusCode==='COMPLETED').length,index+1);
+ if(index===3){
+ const before=(await diag()).bridgeWorkshop.targets;
+ await page.reload();await ready();
+ const after=(await diag()).bridgeWorkshop.targets;
+ for(const b of before){const a=after.find(v=>v.id===b.id);assert.equal(a.visible,b.visible);assert.ok(a.position.every((v,i)=>Math.abs(v-b.position[i])<0.001),`Restore ${b.id}`);}
+ checks.push(`${fixture.code} 刷新恢复模型位置、封堵显示状态与步骤进度`);
+ }else if(index(await learner(`teaching/runs/${run.id}`)).status).toBe('SUBMITTED');
+ run=await learner(`teaching/runs/${run.id}`);assert.equal(run.score,null);
+ run=await api(`tran/v1/teaching/runs/${run.id}/review`,{version:run.version,commandId:crypto.randomUUID(),score:85,passed:true,feedback:'自动化验收示例评分',rubric:{testFixture:true}});
+ assert.equal((await learner(`teaching/runs/${run.id}`)).score,85);
+ await page.reload();await ready();await expect(page.locator('.virtual-server-status')).toContainText('85');
+ await page.screenshot({path:`${dir}/${fixture.code}-reviewed.png`});
+ checks.push(`${fixture.code} 三维操作、提交与教员评定通过`);
+ }
+ assert.deepEqual(errors,[]);fs.writeFileSync(`${dir}/run-acceptance.json`,JSON.stringify({pass:true,checks,runs,errors},null,2));
+}catch(error){await page.screenshot({path:`${dir}/run-failure.png`}).catch(()=>{});fs.writeFileSync(`${dir}/run-diagnostic.json`,JSON.stringify(await diag().catch(()=>null),null,2));fs.writeFileSync(`${dir}/run-acceptance.json`,JSON.stringify({pass:false,error:error.message,checks,runs,errors},null,2));throw error;}
+finally{fs.appendFileSync(`${dir}/run-attempts.jsonl`,JSON.stringify({runs,userId})+'\n');await browser.close();const user=await api(`auth/v1/users/${userId}`);await api(`auth/v1/users/${userId}`,{version:user.version},'DELETE');}
diff --git a/tools/register-bridge-scripted-tasks.mjs b/tools/register-bridge-scripted-tasks.mjs
index bffa6df..207215b 100644
--- a/tools/register-bridge-scripted-tasks.mjs
+++ b/tools/register-bridge-scripted-tasks.mjs
@@ -10,7 +10,7 @@ const api = async (endpoint, body, method) => {
assert.equal(r.status, 200, `${endpoint}: ${r.message}`); return r.data;
};
const registered = [];
-for (const script of scripts) {
+for (const script of scripts.filter(item=>!process.env.BRIDGE_CODE || item.code===process.env.BRIDGE_CODE)) {
const tasks = await api(`teaching/assignments?channel=VIRTUAL&assignmentKind=TRAINING&keyword=${script.code}&size=100`);
let task = tasks.records.find(item => item.code === script.code);
if (task) assert.equal(task.definitionSnapshot.runtime?.scriptId, script.id, 'Refuse to replace an unrelated task');
@@ -25,10 +25,10 @@ for (const script of scripts) {
const correct = task?.definitionSnapshot.runtime?.definitionSource === 'SCRIPT'
&& task?.definitionSnapshot.runtime?.scriptVersion === script.version && task.executionMode === 'PRACTICE';
if (task?.status === 'PUBLISHED' && !correct) task = await api(`teaching/assignments/${task.id}/withdraw`,
- { version: task.version, reason: '静态 JS 作为流程来源,恢复普通训练与成绩评定' });
+ { version: task.version, reason: `更新脚本 v${script.version},使用对应三维流程与正式训练记录` });
const projectCommand = { type: 'TRAINING', name: script.title, description: `原稿:${script.source}`,
categoryCode: 'MAINTENANCE', trainingMode: 'VIRTUAL', content: scriptDefinition(script), dependencies: [], assets: [],
- changeSummary: '脚本来源 v2:复用正式教学运行、步骤记录与成绩评定' };
+ changeSummary: `脚本来源 v${script.version}:复用三维工作区、正式教学运行、步骤记录与成绩评定` };
if (!detail) detail = await api('content/projects', projectCommand);
else if (detail.currentVersion.content?.runtime?.definitionSource !== 'SCRIPT'
|| detail.currentVersion.content?.runtime?.scriptVersion !== script.version) {
@@ -56,4 +56,6 @@ for (const script of scripts) {
console.log(JSON.stringify(registered.at(-1)));
}
fs.mkdirSync('reports/bridge-scripted-tasks-20260913', { recursive: true });
-fs.writeFileSync('reports/bridge-scripted-tasks-20260913/registered.json', JSON.stringify(registered, null, 2));
+const reportPath='reports/bridge-scripted-tasks-20260913/registered.json';
+const previous=process.env.BRIDGE_CODE && fs.existsSync(reportPath) ? JSON.parse(fs.readFileSync(reportPath,'utf8')).filter(item=>!registered.some(updated=>updated.code===item.code)) : [];
+fs.writeFileSync(reportPath, JSON.stringify([...previous,...registered].sort((a,b)=>a.code.localeCompare(b.code)), null, 2));
diff --git a/tools/render-bridge-three-dimensional-report.mjs b/tools/render-bridge-three-dimensional-report.mjs
new file mode 100644
index 0000000..b74004e
--- /dev/null
+++ b/tools/render-bridge-three-dimensional-report.mjs
@@ -0,0 +1,9 @@
+import fs from 'node:fs';
+const dir='reports/bridge-three-dimensional-20260913';
+const read=name=>JSON.parse(fs.readFileSync(`${dir}/${name}.json`,'utf8'));
+const preview=read('acceptance'),run=read('run-acceptance'),originals=read('originals'),cleanup=read('cleanup');
+const esc=value=>String(value).replaceAll('&','&').replaceAll('<','<').replaceAll('>','>');
+const checks=[...preview.checks,...run.checks,...originals.checks];
+const codePass=preview.pass&&run.pass&&originals.pass;
+const images=[['TASK-VIRTUAL-006-reviewed.png','006:接管与应急替代'],['TASK-VIRTUAL-007-reviewed.png','007:换泵与零件状态恢复'],['TASK-VIRTUAL-008-original.png','008:原任务三维入口'],['TASK-VIRTUAL-008-reviewed.png','008:平衡阀互换与教员评定']];
+fs.writeFileSync(`${dir}/index.html`,`桥梁三套流程三维验收桥梁三套流程三维验收
2026-09-14 · ${codePass?'三维实现与正式训练验证通过':'存在未通过项,请查阅原始结果'}
006、007 的原任务已有学员运行,现有接口禁止撤回覆盖。三维实现已完成;这两条原任务的入口迁移仍待确定已有试用记录的处理方式。008 原入口已更新,005 保留原流程。
| 任务 | 三维操作 | 原入口状态 |
|---|
| 005 液压泵应急切换 | 原 5 步机制保留并回归验证 | 保持原三维入口 |
| 006 液压泵应急替代 | 7 步 / 11 项接头、软管、阀门与开关 | 已有提交记录,等待换版处理 |
| 007 前泵换件修复 | 11 步 / 27 项螺栓、旧泵、新泵、纸垫与加油 | 已有进行中记录,等待换版处理 |
| 008 平衡阀拆拼互换 | 16 步 / 50 项拆卸、封堵、互换与连接 | 原任务 89 已更新到脚本 v3 |
验证内容
${checks.map(c=>`- ${esc(c)}
`).join('')}- 前端生产构建通过;后端 ut_tran 测试 422 项通过。
- 逐项校验零件位移、显示与缩放,验证刷新恢复、失败重试、服务端保存、提交与教员评定。
- 验收副本 ${cleanup.softDeletedTasks} 条及关联运行已软删除,原四条任务与其原有运行保持保留。
实现边界
与 005 共用 HTML+JS 三维工作区和结构树、聚焦、高亮、标签、隔离、爆炸工具。整车与液压泵使用原 GLB;原模型没有的软管、封口袋、纸垫和平衡阀等采用明确标注的补充操作示意,不能当作实车精确结构或扭矩、受力测量。
平衡阀第 11、15 步原稿指令冲突,必须记录处理依据后交教员核对;没有自动认定机械操作正确。教员预览不产生学员成绩;学员正式训练通过现有接口保存并评分。
${images.map(([file,title])=>`${title}
`).join('')}原始结果
预览验证 · 学员训练验证 · 原入口回归 · 测试数据清理
`);