/////////////////////////////////////////////////////////////////////////////// // Copyright (C) 2002-2023, Open Design Alliance (the "Alliance"). // All rights reserved. // // This software and its documentation and related materials are owned by // the Alliance. The software may only be incorporated into application // programs owned by members of the Alliance, subject to a signed // Membership Agreement and Supplemental Software License Agreement with the // Alliance. The structure and organization of this software are the valuable // trade secrets of the Alliance and its suppliers. The software is also // protected by copyright law and international treaty provisions. Application // programs incorporating this software must include the following statement // with their copyright notices: // // This application incorporates Open Design Alliance software pursuant to a // license agreement with Open Design Alliance. // Open Design Alliance Copyright (C) 2002-2021 by Open Design Alliance. // All rights reserved. // // By use of this software, its documentation or related materials, you // acknowledge and accept the above terms. /////////////////////////////////////////////////////////////////////////////// import * as ODA from "open-cloud-client"; import * as THREE from "three"; import { IComponent } from "../IComponent"; import type { ThreejsViewer } from "../ThreejsViewer"; export class DefaultCameraPositionComponent implements IComponent { protected viewer: ThreejsViewer; constructor(viewer: ThreejsViewer) { this.viewer = viewer; this.viewer.addEventListener("geometryend", this.geometryEnd); } dispose() { this.viewer.removeEventListener("geometryend", this.geometryEnd); } geometryEnd = (event: ODA.GeometryEndEvent) => { const { data: scene } = event; scene.updateMatrixWorld(); const box = new THREE.Box3().setFromObject(scene); const size = box.getSize(new THREE.Vector3()).length(); const center = box.getCenter(new THREE.Vector3()); scene.position.x += scene.position.x - center.x; scene.position.y += scene.position.y - center.y; scene.position.z += scene.position.z - center.z; this.viewer.camera.near = size / 100; this.viewer.camera.far = size * 100; this.viewer.camera.position.copy(center); this.viewer.camera.position.x += size / 2.0; this.viewer.camera.position.y += size / 5.0; this.viewer.camera.position.z += size / 2.0; this.viewer.camera.updateMatrixWorld(); this.viewer.camera.updateProjectionMatrix(); this.viewer.camera.lookAt(center); }; }