You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
109 lines
3.3 KiB
109 lines
3.3 KiB
2 years ago
|
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;
|
||
|
},
|
||
|
},
|
||
|
});
|
||
|
}
|