diff --git a/cimery/crates/viewer/src/lib.rs b/cimery/crates/viewer/src/lib.rs index adc8703..d0fd7ea 100644 --- a/cimery/crates/viewer/src/lib.rs +++ b/cimery/crates/viewer/src/lib.rs @@ -260,10 +260,12 @@ impl RenderState { let num_indices = mesh.indices.len() as u32; // ── Camera ──────────────────────────────────────────────────────────── - // Camera for full bridge scene + // Camera for full bridge scene. + // 주의: scene_extents 는 지반·교대까지 포함해서 center Y ≈ -1790mm (지반 아래). + // 초기부터 카메라가 교량 중심을 향하도록 Y 타겟은 거더+데크 중심으로 계산. let (mn, mx) = scene_extents(¶ms); let cx = (mn[0] + mx[0]) * 0.5; - let cy = (mn[1] + mx[1]) * 0.5; + let cy = (params.girder_height + params.slab_thickness) * 0.5; let cz = (mn[2] + mx[2]) * 0.5; let span = (mx[2] - mn[2]).max(mx[0] - mn[0]); let mut camera = Camera { @@ -492,8 +494,15 @@ impl RenderState { let (mn, mx) = scene_extents(&self.params); self.scene_mn = mn; self.scene_mx = mx; - // Apply 후 씬 범위에 맞게 카메라 자동 피트 (거더 높이 변경 등이 즉시 보이도록). - self.camera.zoom_extents(mn, mx); + // Apply 후 교량 상부구조 (거더+데크) 로 제한한 BB로 카메라 자동 피트. + // scene_extents 는 지반·교대 푸팅까지 포함되어 center Y ≈ -1790mm(지반 아래) 가 되고, + // girder_h 가 바뀌어도 top/bot 이 같은 비율로 이동해 center 가 고정 → 카메라가 + // 거더 중심을 추적하지 않아 "거더는 그대로"처럼 보이는 착시. + // → Y 범위를 [0, girder_h + slab] 로만 잡아 target Y = 거더+데크 중심이 되게 함. + let focus_top = self.params.girder_height + self.params.slab_thickness; + let focus_mn = [mn[0], 0.0_f32, mn[2]]; + let focus_mx = [mx[0], focus_top, mx[2]]; + self.camera.zoom_extents(focus_mn, focus_mx); self.update_camera(); self.dirty = false; }