// 场景、相机、光源定义定义 var scene = new THREE.Scene(); var camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000000); camera.up.set(0,0,1); var light = new THREE.AmbientLight(0xffffff); scene.add(light); // 渲染器定义 var canvas = document.createElement( 'canvas' ); canvas.id = 'model'; var context = canvas.getContext( 'webgl2', {antialias: true, preserveDrawingBuffer: true}); var renderer = new THREE.WebGLRenderer({canvas: canvas, context: context, logarithmicDepthBuffer: true}); renderer.setSize(window.innerWidth, window.innerHeight); renderer.setClearColor(0xffffff); document.body.appendChild(renderer.domElement); window.addEventListener('resize', onWindowResize); // 相机控制 var controls = new THREE.OrbitControls(camera, renderer.domElement); // 加载模型数据 const loader = new THREE.FileLoader(); loader.load( '/demo/res/single-demo.json', function(data) { var bimScene = BIMLoader(JSON.parse(data)); var box = new THREE.Box3(); box.expandByObject(bimScene); var center = new THREE.Vector3(); box.getCenter(center); var size = new THREE.Vector3(); box.getSize(size); var result = size.x > size.y ? size.x : size.y; result = result > size.z ? result : size.z; var maxLength = Math.round(result); var radius = center.distanceTo(new THREE.Vector3(center.x + (maxLength/2), center.y + (maxLength/2), center.z + (maxLength/2))); var cameraPos = new THREE.Vector3(center.x + radius * Math.cos(Math.PI/18) * Math.cos(Math.PI/4), center.y - radius * Math.cos(Math.PI/18) * Math.sin(Math.PI/4), center.z + radius * Math.sin(Math.PI/18)); camera.position.copy(cameraPos); controls.target = box.getCenter(); scene.add(bimScene); }, function(xhr) { console.log((xhr.loaded / xhr.total * 100) + '% loaded'); }, function(err) { console.error('An error happened'); } ); function onWindowResize() { camera.aspect = window.innerWidth / window.innerHeight; camera.updateProjectionMatrix(); renderer.setSize(window.innerWidth, window.innerHeight); } function animate() { requestAnimationFrame( animate ); controls.update(); renderer.render( scene, camera ); } animate();