|
| 1 | +import * as THREE from 'https://unpkg.com/three@0.161.0/build/three.module.js'; |
| 2 | +import { OrbitControls } from 'https://unpkg.com/three@0.161.0/examples/jsm/controls/OrbitControls.js'; |
| 3 | +import { GLTFLoader } from 'https://unpkg.com/three@0.161.0/examples/jsm/loaders/GLTFLoader.js'; |
| 4 | + |
| 5 | +const viewer = document.getElementById('viewer'); |
| 6 | +const scene = new THREE.Scene(); |
| 7 | +scene.background = new THREE.Color(0x07101c); |
| 8 | +const camera = new THREE.PerspectiveCamera(45, viewer.clientWidth / viewer.clientHeight, 0.1, 1000); |
| 9 | +camera.position.set(55, 32, 55); |
| 10 | +const renderer = new THREE.WebGLRenderer({ antialias: true }); |
| 11 | +renderer.setPixelRatio(Math.min(window.devicePixelRatio, 2)); |
| 12 | +renderer.setSize(viewer.clientWidth, viewer.clientHeight); |
| 13 | +viewer.appendChild(renderer.domElement); |
| 14 | +const controls = new OrbitControls(camera, renderer.domElement); |
| 15 | +controls.enableDamping = true; |
| 16 | +scene.add(new THREE.HemisphereLight(0xffffff, 0x223344, 2.2)); |
| 17 | +const key = new THREE.DirectionalLight(0xffffff, 2.5); key.position.set(20, 40, 30); scene.add(key); |
| 18 | +const loader = new GLTFLoader(); |
| 19 | +let current; |
| 20 | +function loadModel(path){ |
| 21 | + if(current) scene.remove(current); |
| 22 | + loader.load(path, (gltf)=>{ |
| 23 | + current = gltf.scene; |
| 24 | + current.rotation.y = Math.PI * 0.12; |
| 25 | + scene.add(current); |
| 26 | + const box = new THREE.Box3().setFromObject(current); |
| 27 | + const center = box.getCenter(new THREE.Vector3()); |
| 28 | + current.position.sub(center); |
| 29 | + controls.target.set(0,0,0); controls.update(); |
| 30 | + }); |
| 31 | +} |
| 32 | +document.querySelectorAll('[data-model]').forEach(btn => btn.addEventListener('click', () => loadModel(btn.dataset.model))); |
| 33 | +loadModel('assets/asterion_full_assembly.glb'); |
| 34 | +function resize(){ camera.aspect = viewer.clientWidth/viewer.clientHeight; camera.updateProjectionMatrix(); renderer.setSize(viewer.clientWidth, viewer.clientHeight); } |
| 35 | +window.addEventListener('resize', resize); |
| 36 | +function animate(){ requestAnimationFrame(animate); controls.update(); if(current) current.rotation.y += 0.0015; renderer.render(scene,camera); } |
| 37 | +animate(); |
0 commit comments