From a7388be25f16e4d18f50f10b090c8b6193c09dd7 Mon Sep 17 00:00:00 2001 From: David Sehnal <david.sehnal@gmail.com> Date: Thu, 12 Sep 2019 15:34:27 +0200 Subject: [PATCH] mol-canvas3d: fixed camera focus --- src/mol-canvas3d/camera.ts | 23 +++++++---------------- src/mol-canvas3d/canvas3d.ts | 11 +++++------ 2 files changed, 12 insertions(+), 22 deletions(-) diff --git a/src/mol-canvas3d/camera.ts b/src/mol-canvas3d/camera.ts index d241d4cbe..60b4600bd 100644 --- a/src/mol-canvas3d/camera.ts +++ b/src/mol-canvas3d/camera.ts @@ -90,30 +90,21 @@ class Camera implements Object3D { return ret; } - getFocus(target: Vec3, radius: number, dir?: Vec3): Partial<Camera.Snapshot> { + getFocus(target: Vec3, radius: number): Partial<Camera.Snapshot> { const fov = this.state.fov const { width, height } = this.viewport const aspect = width / height const aspectFactor = (height < width ? 1 : aspect) - const currentDistance = Vec3.distance(this.state.position, target) const targetDistance = Math.abs((radius / aspectFactor) / Math.sin(fov / 2)) - const deltaDistance = Math.abs(currentDistance - targetDistance) + Vec3.setMagnitude(this.deltaDirection, this.state.direction, targetDistance) + Vec3.sub(this.newPosition, target, this.deltaDirection) - if (dir) { - Vec3.setMagnitude(this.deltaDirection, dir, targetDistance) - Vec3.add(this.newPosition, target, this.deltaDirection) - } else { - Vec3.setMagnitude(this.deltaDirection, this.state.direction, deltaDistance) - if (currentDistance < targetDistance) Vec3.negate(this.deltaDirection, this.deltaDirection) - Vec3.add(this.newPosition, this.state.position, this.deltaDirection) - } - - return { target, position: Vec3.clone(this.newPosition) }; + return { target: Vec3.clone(target), position: Vec3.clone(this.newPosition) }; } - focus(target: Vec3, radius: number, dir?: Vec3) { - if (radius > 0) this.setState(this.getFocus(target, radius, dir)); + focus(target: Vec3, radius: number) { + if (radius > 0) this.setState(this.getFocus(target, radius)); } // lookAt(target: Vec3) { @@ -202,7 +193,7 @@ namespace Camera { mode: Mode, position: Vec3, - // Normalized camera direction + // Normalized camera direction, from Target to Position, for some reason? direction: Vec3, up: Vec3, target: Vec3, diff --git a/src/mol-canvas3d/canvas3d.ts b/src/mol-canvas3d/canvas3d.ts index e42816282..fb7733dc9 100644 --- a/src/mol-canvas3d/canvas3d.ts +++ b/src/mol-canvas3d/canvas3d.ts @@ -140,7 +140,7 @@ namespace Canvas3D { const multiSample = new MultiSamplePass(webgl, camera, drawPass, postprocessing, p.multiSample) let drawPending = false - let cameraResetRequested: boolean | Vec3 = false + let cameraResetRequested = false function getLoci(pickingId: PickingId) { let loci: Loci = EmptyLoci @@ -271,8 +271,7 @@ namespace Canvas3D { runTask(scene.commit()).then(() => { if (cameraResetRequested && !scene.isCommiting) { - const dir = typeof cameraResetRequested === 'boolean' ? undefined : cameraResetRequested - camera.focus(scene.boundingSphere.center, scene.boundingSphere.radius, dir) + camera.focus(scene.boundingSphere.center, scene.boundingSphere.radius) cameraResetRequested = false } if (debugHelper.isEnabled) debugHelper.update() @@ -345,11 +344,11 @@ namespace Canvas3D { getLoci, handleResize, - resetCamera: (dir?: Vec3) => { + resetCamera: (/*dir?: Vec3*/) => { if (scene.isCommiting) { - cameraResetRequested = dir || true + cameraResetRequested = true } else { - camera.focus(scene.boundingSphere.center, scene.boundingSphere.radius, dir) + camera.focus(scene.boundingSphere.center, scene.boundingSphere.radius) requestDraw(true); } }, -- GitLab