import * as THREE from 'three';
|
import rotatingAperture from '@/assets/map/texture/rotatingAperture.png';
|
import rotatingPoint from '@/assets/map/texture/rotating-point2.png';
|
import circlePoint from '@/assets/map/texture/circle-point.png';
|
import sceneBg from '@/assets/map/texture/scene-bg2.png';
|
|
import { GUI } from "three/examples/jsm/libs/lil-gui.module.min.js";
|
|
export default class Enviroment {
|
constructor(experience) {
|
this.experience = experience;
|
this.scene = this.experience.scene;
|
this.textureLoader = new THREE.TextureLoader();
|
|
this.setSunLight();
|
// this.setRotateHola();
|
this.setBackground();
|
// this.setCirclePoint();
|
|
// this.debuger();
|
}
|
setSunLight() {
|
// 平行光1
|
this.directionalLight1 = new THREE.DirectionalLight(0xffffff, 0.9);
|
this.directionalLight1.position.set(0, 57, 33);
|
// 平行光2
|
this.directionalLight2 = new THREE.DirectionalLight(0xffffff, 0.6);
|
this.directionalLight2.position.set(-95, 28, -33);
|
// 环境光
|
this.ambientLight = new THREE.AmbientLight(0xffffff, 0.8);
|
|
this.scene.add(this.directionalLight1);
|
this.scene.add(this.directionalLight2);
|
this.scene.add(this.ambientLight);
|
}
|
|
setRotateHola() {
|
const rotatingApertureTexture = this.textureLoader.load(rotatingAperture);
|
const rotatingPointTexture = this.textureLoader.load(rotatingPoint);
|
const meshConfig1 = {
|
width: 48,
|
height: 48,
|
texture: rotatingApertureTexture,
|
positionList: [0, 0.4, 0],
|
scaleList: [1, 1, 1],
|
rotateList: [-Math.PI / 2, 0, 0]
|
};
|
const meshConfig2 = {
|
width: 40,
|
height: 40,
|
texture: rotatingPointTexture,
|
positionList: [0, 0.3, 0],
|
scaleList: [1, 1, 1],
|
rotateList: [-Math.PI / 2, 0, 0]
|
};
|
this.hola1 = this.createMesh(meshConfig1);
|
this.hola2 = this.createMesh(meshConfig2);
|
this.scene.add(this.hola1);
|
this.scene.add(this.hola2);
|
}
|
|
setBackground() {
|
const sceneBgTexture = this.textureLoader.load(sceneBg);
|
const plane = new THREE.PlaneGeometry(120, 120);
|
const material = new THREE.MeshPhongMaterial({
|
// color: 0x061920,
|
color: 0xffffff,
|
map: sceneBgTexture,
|
transparent: true,
|
opacity: 1,
|
// depthTest: true
|
});
|
this.background = new THREE.Mesh(plane, material);
|
this.background.rotation.set(-Math.PI / 2, 0, 0);
|
this.background.position.set(0, 0.1, 0);
|
this.scene.add(this.background);
|
}
|
|
setCirclePoint() {
|
const circleTexture = this.textureLoader.load(circlePoint);
|
const plane = new THREE.PlaneGeometry(45, 45);
|
const material = new THREE.MeshPhongMaterial({
|
color: 0x00ffff,
|
map: circleTexture,
|
transparent: true,
|
opacity: 1,
|
depthTest: false,
|
});
|
this.circle = new THREE.Mesh(plane, material);
|
this.circle.rotation.set(-Math.PI / 2, 0, 0);
|
this.circle.position.set(0, 0.2, 0);
|
this.scene.add(this.circle);
|
}
|
|
createMesh(config) {
|
let { width, height, texture, positionList, rotateList, scaleList } = config;
|
let plane = new THREE.PlaneGeometry(width, height);
|
let material = new THREE.MeshBasicMaterial({
|
map: texture,
|
transparent: true,
|
opacity: 1,
|
depthTest: false,
|
});
|
let mesh = new THREE.Mesh(plane, material);
|
mesh.position.set(...positionList);
|
mesh.scale.set(...scaleList);
|
mesh.rotation.set(...rotateList);
|
return mesh;
|
}
|
|
update() {
|
if (this.hola1) {
|
this.hola1.rotation.z += 0.001;
|
}
|
if (this.hola2) {
|
this.hola2.rotation.z -= 0.001;
|
}
|
}
|
|
destroy() {
|
this.disposeObject();
|
this.removeObject();
|
this.resetObject();
|
}
|
|
disposeObject() {
|
this.hola1.geometry.dispose();
|
this.hola1.material.dispose();
|
this.hola2.geometry.dispose();
|
this.hola2.material.dispose();
|
this.background.geometry.dispose();
|
this.background.material.dispose();
|
this.circle.geometry.dispose();
|
this.circle.material.dispose();
|
this.directionalLight1.dispose();
|
this.directionalLight2.dispose();
|
this.ambientLight.dispose();
|
}
|
|
removeObject() {
|
this.scene.remove(this.hola1);
|
this.scene.remove(this.hola2);
|
this.scene.remove(this.background);
|
this.scene.remove(this.circle);
|
}
|
|
resetObject() {
|
this.hola1 = null;
|
this.hola2 = null;
|
this.background = null;
|
this.circle = null;
|
this.directionalLight1 = null;
|
this.directionalLight2 = null;
|
this.ambientLight = null;
|
}
|
|
debuger() {
|
const gui = new GUI();
|
|
const folder1 = gui.addFolder('平行光1');
|
const folder2 = gui.addFolder('平行光2');
|
const folder3 = gui.addFolder('环境光');
|
|
folder1.add(this.directionalLight1.position, 'x').min(-200).max(200).step(1).name("x轴的位置");
|
folder1.add(this.directionalLight1.position, 'y').min(-200).max(200).step(1).name("y轴的位置");
|
folder1.add(this.directionalLight1.position, 'z').min(-200).max(200).step(1).name("z轴的位置");
|
folder1.add(this.directionalLight1, 'intensity').min(0).max(1).step(0.1).name("强度");
|
|
folder2.add(this.directionalLight2.position, 'x').min(-200).max(200).step(1).name("x轴的位置");
|
folder2.add(this.directionalLight2.position, 'y').min(-200).max(200).step(1).name("y轴的位置");
|
folder2.add(this.directionalLight2.position, 'z').min(-200).max(200).step(1).name("z轴的位置");
|
folder2.add(this.directionalLight2, 'intensity').min(0).max(1).step(0.1).name("强度");
|
|
|
folder3.add(this.ambientLight, 'intensity').min(0).max(1).step(0.1).name("强度");
|
}
|
}
|