From 2c9633438dffdeea604347cc5131d399c419032e Mon Sep 17 00:00:00 2001 From: Karim Date: Sat, 4 Jul 2026 04:24:02 +0200 Subject: [PATCH] Nordstern: Iso-Praeset auf echte orthografische Projektion korrigiert CameraPreset::Iso war faelschlich als Perspective definiert; three.js zeigt bei Iso bereits korrekt orthografisch (parallele Projektion, wie bei einer echten Isometrie definiert). Front/Top/Side/Iso sind jetzt konsistent orthografisch, nur Perspective bleibt perspektivisch. --- src-tauri/render3d/src/lib.rs | 2 +- src-tauri/render3d/src/math.rs | 15 +++++++++++---- src-tauri/render3d/src/web.rs | 9 +++++---- 3 files changed, 17 insertions(+), 9 deletions(-) diff --git a/src-tauri/render3d/src/lib.rs b/src-tauri/render3d/src/lib.rs index 4ad71b1..9339588 100644 --- a/src-tauri/render3d/src/lib.rs +++ b/src-tauri/render3d/src/lib.rs @@ -687,7 +687,7 @@ mod tests { ); assert_eq!( preset_camera(CameraPreset::Iso, t, 10.0).projection, - Projection::Perspective + Projection::Orthographic ); assert_eq!( preset_camera(CameraPreset::Persp, t, 10.0).projection, diff --git a/src-tauri/render3d/src/math.rs b/src-tauri/render3d/src/math.rs index 0451415..573da13 100644 --- a/src-tauri/render3d/src/math.rs +++ b/src-tauri/render3d/src/math.rs @@ -186,8 +186,9 @@ pub fn orbit_eye(target: [f32; 3], yaw: f32, pitch: f32, dist: f32) -> [f32; 3] } /// Baut eine `Camera` fuer eines der fuenf Presets der three.js-Sicht. `target` -/// ist das Blickziel (Modell-Mitte), `dist` der Abstand. Front/Top/Side sind -/// orthografisch achsparallel; Iso/Persp sind perspektivisch. +/// ist das Blickziel (Modell-Mitte), `dist` der Abstand. Front/Top/Side/Iso +/// sind orthografisch (Front/Top/Side achsparallel, Iso diagonal); nur Persp +/// ist perspektivisch. pub fn preset_camera(preset: CameraPreset, target: [f32; 3], dist: f32) -> Camera { let mut cam = Camera { target, @@ -216,12 +217,18 @@ pub fn preset_camera(preset: CameraPreset, target: [f32; 3], dist: f32) -> Camer cam.up = [0.0, 1.0, 0.0]; cam.ortho_half_height = dist * 0.5; } - // Isometrischer Ueberblick (perspektivisch, Blick von schraeg oben). + // Isometrischer Ueberblick (orthografisch, Blick von schraeg oben). + // Echte Isometrie ist per Definition parallelprojiziert (keine + // perspektivische Verzerrung, Kantenlaengen bleiben massstabsgetreu). CameraPreset::Iso => { - cam.projection = Projection::Perspective; + cam.projection = Projection::Orthographic; let d = dist / 3.0_f32.sqrt(); cam.eye = [target[0] + d, target[1] + d, target[2] + d]; cam.up = [0.0, 1.0, 0.0]; + // eye-target-Abstand ist hier (wie bei Front/Top/Side) exakt + // `dist` (d*sqrt(3) == dist), darum dieselbe Skalierung wie dort, + // damit das Modell im Bild aehnlich gross erscheint. + cam.ortho_half_height = dist * 0.5; } // Freie perspektivische Standard-Ansicht (leicht von vorn-oben-rechts). CameraPreset::Persp => { diff --git a/src-tauri/render3d/src/web.rs b/src-tauri/render3d/src/web.rs index e2c87c3..5649ff4 100644 --- a/src-tauri/render3d/src/web.rs +++ b/src-tauri/render3d/src/web.rs @@ -17,8 +17,9 @@ // damit die Maus-UX 1:1 der bestehenden three.js-OrbitControls-Bedienung folgt. // `set_view_preset` wendet stattdessen eines der fuenf `View3d`-Praesete // (front/top/side/iso/perspective) direkt ueber `math::preset_camera` an — Front/ -// Top/Side werden dabei ECHT orthografisch (`preset_camera`), was eine reine -// TS-Orbit-Naeherung nicht leisten kann. Nach einem Praeset-Sprung bleibt die +// Top/Side/Iso werden dabei ECHT orthografisch (`preset_camera`; Iso = echte +// Isometrie ohne perspektivische Verzerrung), was eine reine TS-Orbit-Naeherung +// nicht leisten kann. Nach einem Praeset-Sprung bleibt die // weitere Navigation frei ueber `set_camera` (kein Lock). // // MODELL-FORMAT: JSON-Struct { walls: WallInput[], slabs: SlabInput[] } — identisch @@ -275,8 +276,8 @@ impl WebModelRenderer { /// Wendet eines der fuenf Kamera-Praesets der three.js-Sicht /// (`front`/`top`/`side`/`iso`/`perspective`, s. `View3d` in TopBar.tsx) auf /// das aktuelle Modell an: Ziel = Modell-Mitte, Distanz = formatfuellend - /// (mirror der TS-`fitTargetDist`); Front/Top/Side werden orthografisch, - /// Iso/Perspective perspektivisch (`math::preset_camera`). Wirkt erst beim + /// (mirror der TS-`fitTargetDist`); Front/Top/Side/Iso werden orthografisch, + /// nur Perspective ist perspektivisch (`math::preset_camera`). Wirkt erst beim /// naechsten `render`. „Praeset = hinspringen, kein Lock" — manuelles /// Orbit/Pan/Zoom bleibt danach frei ueber `set_camera` (s. Wasm3DViewport.tsx). pub fn set_view_preset(&mut self, preset: &str) -> Result<(), JsValue> {