From 8c2a2a1beac5c97d1defe44e45a0d8400105bd09 Mon Sep 17 00:00:00 2001 From: jason Date: Thu, 23 Apr 2026 09:29:18 -0500 Subject: [PATCH] new model viewer fix 3 --- src/client/viewer/main.ts | 39 ++++++++++++++++++++++++++++++++------- 1 file changed, 32 insertions(+), 7 deletions(-) diff --git a/src/client/viewer/main.ts b/src/client/viewer/main.ts index eb0ec78..520250a 100644 --- a/src/client/viewer/main.ts +++ b/src/client/viewer/main.ts @@ -20,6 +20,7 @@ let renderer: THREE.WebGLRenderer let scene: THREE.Scene let camera: THREE.PerspectiveCamera let controls: OrbitControls +let keyLight: THREE.DirectionalLight // ---- UI helpers ---------------------------------------------------------- @@ -80,13 +81,12 @@ function buildScene(canvas: HTMLCanvasElement) { const ambient = new THREE.AmbientLight(0xffffff, 0.5) scene.add(ambient) - const key = new THREE.DirectionalLight(0xffffff, 2.0) - key.position.set(10, 20, 10) - key.castShadow = true - key.shadow.mapSize.set(2048, 2048) - key.shadow.camera.near = 0.1 - key.shadow.camera.far = 500 - scene.add(key) + keyLight = new THREE.DirectionalLight(0xffffff, 2.0) + keyLight.position.set(10, 20, 10) + keyLight.castShadow = true + keyLight.shadow.mapSize.set(2048, 2048) + scene.add(keyLight) + scene.add(keyLight.target) const fill = new THREE.DirectionalLight(0x8899cc, 0.4) fill.position.set(-10, 5, -10) @@ -150,6 +150,31 @@ function fitCamera(object: THREE.Object3D) { camera.lookAt(center) controls.target.copy(center) controls.update() + + // Scale fog so it stays subtle at any model size. + // density = 0.19/dist keeps fog-factor ≈ 0.95 at the viewing distance. + if (scene.fog instanceof THREE.FogExp2) { + scene.fog.density = 0.19 / dist + } + + // Aim key light at the model center and fit its shadow frustum around + // the model so shadows are correct regardless of scale. + const lightDist = maxDim * 2 + keyLight.position.set( + center.x + lightDist * 0.5, + center.y + lightDist, + center.z + lightDist * 0.5, + ) + keyLight.target.position.copy(center) + keyLight.target.updateMatrixWorld() + + const sc = keyLight.shadow.camera + const ext = maxDim * 1.5 + sc.left = -ext; sc.right = ext + sc.top = ext; sc.bottom = -ext + sc.near = lightDist * 0.1 + sc.far = lightDist * 4 + sc.updateProjectionMatrix() } // ---- Ground grid ---------------------------------------------------------