Skip to content

Commit 4ca0c61

Browse files
authored
Add files via upload
1 parent a3238cf commit 4ca0c61

1 file changed

Lines changed: 48 additions & 0 deletions

File tree

  • downloads/asterion-fcta-v1.0-public-release/asterion-fcta-v1.0/web-viewer/v1_0/js
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
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(42, viewer.clientWidth / viewer.clientHeight, 0.01, 2000);
9+
camera.position.set(58, 34, 58);
10+
const renderer = new THREE.WebGLRenderer({antialias:true, alpha:true});
11+
renderer.setPixelRatio(Math.min(window.devicePixelRatio,2));
12+
renderer.setSize(viewer.clientWidth,viewer.clientHeight);
13+
renderer.outputColorSpace = THREE.SRGBColorSpace;
14+
viewer.replaceChildren(renderer.domElement);
15+
const controls = new OrbitControls(camera,renderer.domElement);
16+
controls.enableDamping = true;
17+
controls.dampingFactor = 0.055;
18+
scene.add(new THREE.HemisphereLight(0xeaf6ff,0x1a2434,2.2));
19+
const key = new THREE.DirectionalLight(0xffffff,3.0); key.position.set(32,55,38); scene.add(key);
20+
const rim = new THREE.DirectionalLight(0x72c9ff,2.0); rim.position.set(-35,15,-28); scene.add(rim);
21+
const loader = new GLTFLoader();
22+
let current = null;
23+
let rotate = true;
24+
25+
function frameModel(object){
26+
const box = new THREE.Box3().setFromObject(object);
27+
const center = box.getCenter(new THREE.Vector3());
28+
const size = box.getSize(new THREE.Vector3());
29+
object.position.sub(center);
30+
const maxDim = Math.max(size.x,size.y,size.z) || 1;
31+
const distance = maxDim / (2 * Math.tan(THREE.MathUtils.degToRad(camera.fov/2)));
32+
camera.position.set(distance*.9,distance*.55,distance*.9);
33+
camera.near = Math.max(maxDim/1000,.01); camera.far = maxDim*30;
34+
camera.updateProjectionMatrix(); controls.target.set(0,0,0); controls.update();
35+
}
36+
function loadModel(path,button){
37+
document.querySelectorAll('[data-model]').forEach(b=>b.classList.remove('active'));
38+
if(button) button.classList.add('active');
39+
loader.load(path,(gltf)=>{
40+
if(current){scene.remove(current); current.traverse(o=>{if(o.geometry)o.geometry.dispose();});}
41+
current=gltf.scene; scene.add(current); frameModel(current);
42+
},undefined,(error)=>{console.error(error); viewer.insertAdjacentHTML('beforeend','<p class="loading">Model could not be loaded. Serve this folder through a local HTTP server.</p>');});
43+
}
44+
document.querySelectorAll('[data-model]').forEach(btn=>btn.addEventListener('click',()=>loadModel(btn.dataset.model,btn)));
45+
renderer.domElement.addEventListener('pointerdown',()=>{rotate=false;});
46+
function resize(){const w=viewer.clientWidth,h=viewer.clientHeight;camera.aspect=w/h;camera.updateProjectionMatrix();renderer.setSize(w,h);}window.addEventListener('resize',resize);
47+
function animate(){requestAnimationFrame(animate);controls.update();if(current&&rotate)current.rotation.y+=.0012;renderer.render(scene,camera);}animate();
48+
loadModel('assets/asterion_full_assembly.glb',document.querySelector('[data-model]'));

0 commit comments

Comments
 (0)