diff --git a/resources/views/rd/fire-shutter-drawing/index.blade.php b/resources/views/rd/fire-shutter-drawing/index.blade.php index 32f677d2..92b5a4f2 100644 --- a/resources/views/rd/fire-shutter-drawing/index.blade.php +++ b/resources/views/rd/fire-shutter-drawing/index.blade.php @@ -1089,27 +1089,44 @@ function fs3dBuild() { stubPin.position.set(bkInnerFaceX - nonMotorSide * stubPinVisible / 2, 0, 0); meshes.shaft.add(stubPin); - // 모터측 환봉 (모터측 브라켓에서 안쪽으로 200mm 돌출) - const stubPinMT = new THREE.Mesh(stubPinGeo.clone(), stubPinMat); + // 모터측: 3인치 연결관 + 복주머니 (브라켓 체결) + const reducerR = 38; // 3인치 관 반지름 (ø76mm ≈ 3") + const reducerLen = stubPinVisible - 40; // 연결관 길이 (복주머니 공간 제외) + const bokjuR = reducerR + 8; // 복주머니 외경 (연결관보다 약간 큼) + const bokjuLen = 35; // 복주머니 길이 + const bokjuMat = new THREE.MeshStandardMaterial({ color: 0x6b7280, metalness: 0.6, roughness: 0.3 }); + const mtBkInnerFaceX = motorDir * (W1 / 2 - motorBkD); - stubPinMT.position.set(mtBkInnerFaceX - motorDir * stubPinVisible / 2, 0, 0); - meshes.shaft.add(stubPinMT); + // 복주머니 (브라켓 내면에서 바로 안쪽, 브라켓과 직접 결합) + const bokjuGeo = new THREE.CylinderGeometry(bokjuR, bokjuR, bokjuLen, 24); + bokjuGeo.rotateZ(Math.PI / 2); + const bokju = new THREE.Mesh(bokjuGeo, bokjuMat); + bokju.position.set(mtBkInnerFaceX - motorDir * bokjuLen / 2, 0, 0); + meshes.shaft.add(bokju); + + // 3인치 연결관 (복주머니 ~ 메인 샤프트 플랜지) + const reducerGeo = new THREE.CylinderGeometry(reducerR, reducerR, reducerLen, 24); + reducerGeo.rotateZ(Math.PI / 2); + const reducer = new THREE.Mesh(reducerGeo, stubPinMat); + const reducerStartX = mtBkInnerFaceX - motorDir * bokjuLen; + reducer.position.set(reducerStartX - motorDir * reducerLen / 2, 0, 0); + meshes.shaft.add(reducer); // --- Main Shaft (원형관, 양쪽 플랜지 사이) --- const msGeo = new THREE.CylinderGeometry(shaftR, shaftR, mainShaftLen, 32); msGeo.rotateZ(Math.PI / 2); const msMesh = new THREE.Mesh(msGeo, shaftMat); - msMesh.position.set(0, 0, 0); // 중앙 배치 + msMesh.position.set(0, 0, 0); meshes.shaft.add(msMesh); - // 비모터측 플랜지 (샤프트 끝에 용접) + // 비모터측 플랜지 (샤프트 내경에 삽입 용접) const flangeGeo = new THREE.CylinderGeometry(flangeR, flangeR, flangeThick, 32); flangeGeo.rotateZ(Math.PI / 2); const flangeNM = new THREE.Mesh(flangeGeo, flangeMat); flangeNM.position.set(nonMotorSide * (mainShaftLen / 2 + flangeThick / 2), 0, 0); meshes.shaft.add(flangeNM); - // 모터측 플랜지 (샤프트 끝에 용접) + // 모터측 플랜지 (샤프트 내경에 삽입, 3인치 연결관과 용접) const flangeMT = new THREE.Mesh(flangeGeo.clone(), flangeMat); flangeMT.position.set(motorDir * (mainShaftLen / 2 + flangeThick / 2), 0, 0); meshes.shaft.add(flangeMT);