fix: [rd] 샤프트 길이 축소 + 양쪽 환봉 노출

- 샤프트 관: W1-400mm (양쪽 환봉 200mm씩 노출)
- 환봉: ø30, 200mm 밖으로 보임 (전체 300mm 중 100mm는 플랜지 내부)
- 모터측에도 환봉 추가
- 플랜지 위치를 샤프트 끝 바깥으로 수정
- slat roll 길이도 샤프트에 맞춤
This commit is contained in:
김보곤
2026-03-09 08:24:55 +09:00
parent 84334730a7
commit c609bcdbb7

View File

@@ -1059,9 +1059,19 @@ function fs3dBuild() {
const motorBkD = 18; // 두께 (X방향, 철판)
const shaftFromInner = 90; // 브라켓 내면에서 샤프트 중심까지 거리 (도면 기준)
// 주축: 양쪽 브라켓 외면까지 (돌출 없음)
const mainShaftLen = W1;
const msCenterX = 0;
// 환봉/플랜지 치수
const stubPinR = 15; // 환봉 반지름 (ø30)
const stubPinTotal = 300; // 환봉 전체 길이
const stubPinVisible = 200; // 밖에서 보이는 길이 (플랜지 밖)
const stubPinInside = stubPinTotal - stubPinVisible; // 플랜지 안쪽 (100mm)
const shaftR = b.shaftDia / 2;
const flangeR = shaftR * 1.4; // 플랜지 외경
const flangeThick = 10; // 플랜지 두께
const flangeMat = new THREE.MeshStandardMaterial({ color: 0x78716c, metalness: 0.5, roughness: 0.35 });
const stubPinMat = new THREE.MeshStandardMaterial({ color: 0x9ca3af, metalness: 0.7, roughness: 0.25 });
// 샤프트 관 길이: 양쪽 환봉 노출분만큼 축소
const mainShaftLen = W1 - stubPinVisible * 2;
// --- Non-motor side Bracket (180×180mm, 두께 18mm) ---
const bkGeo = new THREE.BoxGeometry(bkThick, bkH, bkD);
@@ -1070,40 +1080,37 @@ function fs3dBuild() {
bkMesh.position.set(bkCenterX, 0, 0);
meshes.shaft.add(bkMesh);
// 비모터측: 환봉 (stub pin, 브라켓 중앙에서 샤프트쪽으로 돌출)
const stubPinR = 15; // 환봉 반지름 (ø30)
const stubPinLen = 50; // 환봉 길이
const stubPinGeo = new THREE.CylinderGeometry(stubPinR, stubPinR, stubPinLen, 16);
// 비모터측 환봉 (브라켓에서 안쪽으로 200mm 돌출)
const stubPinGeo = new THREE.CylinderGeometry(stubPinR, stubPinR, stubPinVisible, 16);
stubPinGeo.rotateZ(Math.PI / 2);
const stubPin = new THREE.Mesh(stubPinGeo, shaftMat);
// 브라켓 내면에서 안쪽(센터방향)으로 돌출
const stubPin = new THREE.Mesh(stubPinGeo, stubPinMat);
const bkInnerFaceX = nonMotorSide * (W1 / 2 - bkThick);
stubPin.position.set(bkInnerFaceX - nonMotorSide * stubPinLen / 2, 0, 0);
stubPin.position.set(bkInnerFaceX - nonMotorSide * stubPinVisible / 2, 0, 0);
meshes.shaft.add(stubPin);
// --- Main Shaft (원형관, 양쪽 플랜지 사이) ---
const shaftR = b.shaftDia / 2;
const flangeR = shaftR * 1.4; // 플랜지 외경 (샤프트보다 40% 큼)
const flangeThick = 8; // 플랜지 두께
const flangeMat = new THREE.MeshStandardMaterial({ color: 0x78716c, metalness: 0.5, roughness: 0.35 });
// 모터측 환봉 (모터측 브라켓에서 안쪽으로 200mm 돌출)
const stubPinMT = new THREE.Mesh(stubPinGeo.clone(), stubPinMat);
const mtBkInnerFaceX = motorDir * (W1 / 2 - motorBkD);
stubPinMT.position.set(mtBkInnerFaceX - motorDir * stubPinVisible / 2, 0, 0);
meshes.shaft.add(stubPinMT);
// 샤프트 관 (양쪽 플랜지 안쪽까지)
// --- 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(msCenterX, 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);
flangeNM.position.set(nonMotorSide * (mainShaftLen / 2 + flangeThick / 2), 0, 0);
meshes.shaft.add(flangeNM);
// 모터측 플랜지 (샤프트 끝에 용접)
const flangeMT = new THREE.Mesh(flangeGeo.clone(), flangeMat);
flangeMT.position.set(motorDir * (mainShaftLen / 2 - flangeThick / 2), 0, 0);
flangeMT.position.set(motorDir * (mainShaftLen / 2 + flangeThick / 2), 0, 0);
meshes.shaft.add(flangeMT);
meshes.shaft.position.set(0, shaftY, 0);
@@ -1329,7 +1336,7 @@ function fs3dBuild() {
const shaftR = b.shaftDia / 2;
const rollThick = Math.max(Math.sqrt(rolledH * wrapThick / Math.PI), 8);
const rollOuterR = shaftR + rollThick;
const rollLen = W - 30;
const rollLen = W - 30 - stubPinVisible * 2; // 샤프트 관 길이에 맞춤
// 하나의 Mesh로 표현 (접시 모양 방지)
const rollGeo = new THREE.CylinderGeometry(rollOuterR, rollOuterR, rollLen, 48, 1, false);