UNPKG

threepipe

Version:

A 3D viewer framework built on top of three.js in TypeScript with a focus on quality rendering, modularity and extensibility.

74 lines (65 loc) 2.24 kB
import { _testFinish, BoxGeometry, Color, LoadingScreenPlugin, Mesh, PhysicalMaterial, PopmotionPlugin, ThreeViewer, Vector3, } from 'threepipe' import {createSimpleButtons} from '../examples-utils/simple-bottom-buttons.js' async function init() { const viewer = new ThreeViewer({ canvas: document.getElementById('mcanvas') as HTMLCanvasElement, renderScale: 'auto', plugins: [LoadingScreenPlugin], }) const popmotion = viewer.addPluginSync(PopmotionPlugin) await viewer.setEnvironmentMap('https://threejs.org/examples/textures/equirectangular/venice_sunset_1k.hdr') const cube = viewer.scene.addObject(new Mesh( new BoxGeometry(1, 1, 1), new PhysicalMaterial({color: 0xff0000}) )) let isMovedUp = false createSimpleButtons({ ['Move Up/Down']: async(btn) => { btn.disabled = true await popmotion.animateTargetAsync(cube, 'position', { to: cube.position.clone().add(new Vector3(0, isMovedUp ? -1 : 1, 0)), duration: 500, // ms onComplete: () => isMovedUp = !isMovedUp, onUpdate: () => cube.setDirty(), }) btn.disabled = false }, ['Rotate +90deg']: async(btn) => { btn.disabled = true await popmotion.animateAsync({ from: cube.rotation.y, to: cube.rotation.y + Math.PI / 2, duration: 500, onUpdate: (v) => { cube.rotation.y = v cube.setDirty() }, }) btn.disabled = false }, ['Change Color']: async(btn)=>{ btn.disabled = true await popmotion.animateAsync({ from: '#' + cube.material.color.getHexString(), to: '#' + new Color().setHSL(Math.random(), 1, 0.5).getHexString(), duration: 500, onUpdate: (v) => { cube.material.color.set(v) cube.material.setDirty() }, }) btn.disabled = false }, }) } init().finally(_testFinish)