function main() { const canvas = document.getElementById('c'); const renderer = new THREE.WebGLRenderer({ canvas: canvas, antialias: true, }); const fov = 45; const aspect = 2; // the canvas default const near = 0.1; const far = 100; const camera = new THREE.PerspectiveCamera(fov, aspect, near, far); camera.position.set(1500, 700, 500); const controls = new THREE.OrbitControls(camera, canvas); controls.target.set(0, 5, 0); controls.enablePan = false; controls.enableDamping = false; controls.minPolarAngle = 0; controls.maxPolarAngle = Math.PI * 0.5; controls.autoRotate = true; controls.update(); const scene = new THREE.Scene(); scene.background = new THREE.Color('black'); { const planeSize = 4000; const loader = new THREE.TextureLoader(); const texture = loader.load('checker.png'); texture.wrapS = THREE.RepeatWrapping; texture.wrapT = THREE.RepeatWrapping; texture.magFilter = THREE.NearestFilter; const repeats = planeSize / 200; texture.repeat.set(repeats, repeats); const planeGeo = new THREE.PlaneGeometry(planeSize, planeSize); const planeMat = new THREE.MeshBasicMaterial({ map: texture, side: THREE.DoubleSide, }); const mesh = new THREE.Mesh(planeGeo, planeMat); mesh.rotation.x = Math.PI * -.5; scene.add(mesh); } const light = new THREE.AmbientLight( 0xFFFFFF ); // soft white light scene.add( light ); // { // const skyColor = 0xB1E1FF; // light blue // const groundColor = 0xB97A20; // brownish orange // const intensity = 1; // const light = new THREE.HemisphereLight(skyColor, groundColor, intensity); // scene.add(light); // } { // const color = 0xFFFFFF; // const intensity = 1; // const light = new THREE.DirectionalLight(color, intensity); // light.position.set(5, 500, 2); // scene.add(light); // const light2 = new THREE.DirectionalLight(color, intensity); // light2.position.set(500, 100, 500); // scene.add(light2); // scene.add(light.target); } function frameArea(sizeToFitOnScreen, boxSize, boxCenter, camera) { const halfSizeToFitOnScreen = sizeToFitOnScreen * 0.5; const halfFovY = THREE.MathUtils.degToRad(camera.fov * .5); const distance = halfSizeToFitOnScreen / Math.tan(halfFovY); // compute a unit vector that points in the direction the camera is now // in the xz plane from the center of the box const direction = (new THREE.Vector3()) .subVectors(camera.position, boxCenter) .multiply(new THREE.Vector3(1, 0, 1)) .normalize(); // move the camera to a position distance units way from the center // in whatever direction the camera was from the center already camera.position.copy(direction.multiplyScalar(distance).add(boxCenter)); // pick some near and far values for the frustum that // will contain the box. camera.near = boxSize / 100; camera.far = boxSize * 100; camera.position.setY(700); camera.updateProjectionMatrix(); // point the camera to look at the center of the box camera.lookAt(boxCenter.x, boxCenter.y, boxCenter.z); } { const loader = new THREE.FBXLoader(); loader.load('2021-3-2.fbx', (root) => { root.updateMatrixWorld(); scene.add(root); // compute the box that contains all the stuff // from root and below const box = new THREE.Box3().setFromObject(root); const boxSize = box.getSize(new THREE.Vector3()).length(); const boxCenter = box.getCenter(new THREE.Vector3()); root.position.y -= box.min.y; root.position.x -= boxCenter.x; root.position.z -= boxCenter.z; root.traverse(e => { console.log(e.name); }); // set the camera to frame the box frameArea(boxSize * 1.0, boxSize, boxCenter, camera); // update the Trackball controls to handle the new size controls.maxDistance = boxSize * 10; controls.target.copy(boxCenter); controls.update(); }); } function resizeRendererToDisplaySize(renderer) { const canvas = renderer.domElement; const width = canvas.clientWidth; const height = canvas.clientHeight; const needResize = canvas.width !== width || canvas.height !== height; if (needResize) { renderer.setSize(width, height, false); } return needResize; } function render() { controls.update(); if (resizeRendererToDisplaySize(renderer)) { const canvas = renderer.domElement; camera.aspect = canvas.clientWidth / canvas.clientHeight; camera.updateProjectionMatrix(); } renderer.render(scene, camera); requestAnimationFrame(render); } requestAnimationFrame(render); } // main(); window.onload = main; // document.addEventListener('load',main);