import * as THREE from 'three'; import {threejsLessonUtils} from './threejs-lesson-utils.js'; import {GUI} from '../../examples/jsm/libs/lil-gui.module.min.js'; { class DegRadHelper { constructor(obj, prop) { this.obj = obj; this.prop = prop; } get value() { return THREE.MathUtils.radToDeg(this.obj[this.prop]); } set value(v) { this.obj[this.prop] = THREE.MathUtils.degToRad(v); } } function scaleCube(zOffset) { const root = new THREE.Object3D(); const size = 3; const geometry = new THREE.BoxGeometry(size, size, size); geometry.applyMatrix4(new THREE.Matrix4().makeTranslation(0, 0, zOffset * size)); const material = new THREE.MeshBasicMaterial({ color: 'red', }); const cube = new THREE.Mesh(geometry, material); root.add(cube); cube.add(new THREE.LineSegments( new THREE.EdgesGeometry(geometry), new THREE.LineBasicMaterial({color: 'white'}))); [[0, 0], [1, 0], [0, 1]].forEach((rot) => { const size = 10; const divisions = 10; const gridHelper = new THREE.GridHelper(size, divisions); root.add(gridHelper); gridHelper.rotation.x = rot[0] * Math.PI * .5; gridHelper.rotation.z = rot[1] * Math.PI * .5; }); return { obj3D: root, update: (time) => { const s = THREE.MathUtils.lerp(0.5, 2, Math.sin(time) * .5 + .5); cube.scale.set(s, s, s); }, }; } threejsLessonUtils.addDiagrams({ scaleCenter: { create() { return scaleCube(0); }, }, scalePositiveZ: { create() { return scaleCube(.5); }, }, lonLatPos: { create(info) { const {scene, camera, renderInfo} = info; const size = 10; const divisions = 10; const gridHelper = new THREE.GridHelper(size, divisions); scene.add(gridHelper); const geometry = new THREE.BoxGeometry(1, 1, 1); const lonHelper = new THREE.Object3D(); scene.add(lonHelper); const latHelper = new THREE.Object3D(); lonHelper.add(latHelper); const positionHelper = new THREE.Object3D(); latHelper.add(positionHelper); { const lonMesh = new THREE.Mesh(geometry, new THREE.MeshBasicMaterial({color: 'green'})); lonMesh.scale.set(0.2, 1, 0.2); lonHelper.add(lonMesh); } { const latMesh = new THREE.Mesh(geometry, new THREE.MeshBasicMaterial({color: 'blue'})); latMesh.scale.set(1, 0.25, 0.25); latHelper.add(latMesh); } { const geometry = new THREE.SphereGeometry(0.1, 24, 12); const posMesh = new THREE.Mesh(geometry, new THREE.MeshBasicMaterial({color: 'red'})); posMesh.position.z = 1; positionHelper.add(posMesh); } camera.position.set(1, 1.5, 1.5); camera.lookAt(0, 0, 0); const gui = new GUI({autoPlace: false}); renderInfo.elem.appendChild(gui.domElement); gui.add(new DegRadHelper(lonHelper.rotation, 'y'), 'value', -180, 180).name('lonHelper x rotation'); gui.add(new DegRadHelper(latHelper.rotation, 'x'), 'value', -90, 90).name('latHelper y rotation'); return { trackball: false, }; }, }, }); }