import * as THREE from 'three'; import { OrbitControls } from '../../examples/jsm/controls/OrbitControls.js'; import { threejsLessonUtils } from './threejs-lesson-utils.js'; { function makeCheckerTexture( repeats ) { const data = new Uint8Array( [ 0x88, 0x88, 0x88, 0xFF, 0xCC, 0xCC, 0xCC, 0xFF, 0xCC, 0xCC, 0xCC, 0xFF, 0x88, 0x88, 0x88, 0xFF ] ); const width = 2; const height = 2; const texture = new THREE.DataTexture( data, width, height ); texture.needsUpdate = true; texture.wrapS = THREE.RepeatWrapping; texture.wrapT = THREE.RepeatWrapping; texture.repeat.set( repeats / 2, repeats / 2 ); return texture; } const makeScene = function () { const cubeSize = 4; const cubeGeo = new THREE.BoxGeometry( cubeSize, cubeSize, cubeSize ); const cubeMat = new THREE.MeshPhongMaterial( { color: '#8AC' } ); const sphereRadius = 3; const sphereWidthDivisions = 32; const sphereHeightDivisions = 16; const sphereGeo = new THREE.SphereGeometry( sphereRadius, sphereWidthDivisions, sphereHeightDivisions ); const sphereMat = new THREE.MeshPhongMaterial( { color: '#CA8' } ); const planeSize = 40; const planeGeo = new THREE.PlaneGeometry( planeSize, planeSize ); const planeMat = new THREE.MeshPhongMaterial( { map: makeCheckerTexture( planeSize ), side: THREE.DoubleSide, } ); return function ( renderInfo ) { const { scene, camera, elem } = renderInfo; const controls = new OrbitControls( camera, elem ); controls.enableDamping = true; controls.enablePanning = false; scene.background = new THREE.Color( 'black' ); { const mesh = new THREE.Mesh( cubeGeo, cubeMat ); mesh.position.set( cubeSize + 1, cubeSize / 2, - cubeSize - 1 ); scene.add( mesh ); } { const mesh = new THREE.Mesh( sphereGeo, sphereMat ); mesh.position.set( - sphereRadius - 1, sphereRadius + 2, - sphereRadius + 1 ); scene.add( mesh ); } { const mesh = new THREE.Mesh( planeGeo, planeMat ); mesh.rotation.x = Math.PI * - .5; scene.add( mesh ); } return { trackball: false, lights: false, update() { controls.update(); }, }; }; }(); threejsLessonUtils.addDiagrams( { directionalOnly: { create( props ) { const { scene, renderInfo } = props; const result = makeScene( renderInfo ); { const light = new THREE.DirectionalLight( 0xFFFFFF, 1 ); light.position.set( 5, 10, 0 ); scene.add( light ); } { const light = new THREE.AmbientLight( 0xFFFFFF, .6 ); scene.add( light ); } return result; }, }, directionalPlusHemisphere: { create( props ) { const { scene, renderInfo } = props; const result = makeScene( renderInfo ); { const light = new THREE.DirectionalLight( 0xFFFFFF, 1 ); light.position.set( 5, 10, 0 ); scene.add( light ); } { const skyColor = 0xB1E1FF; // light blue const groundColor = 0xB97A20; // brownish orange const intensity = .6; const light = new THREE.HemisphereLight( skyColor, groundColor, intensity ); scene.add( light ); } return result; }, }, } ); }