| | |
| | | import { EffectComposer } from 'three/examples/jsm/postprocessing/EffectComposer'; |
| | | import { RenderPass } from 'three/examples/jsm/postprocessing/RenderPass'; |
| | | import { OutlinePass } from 'three/examples/jsm/postprocessing/OutlinePass'; |
| | | import { ShaderPass } from 'three/examples/jsm/postprocessing/ShaderPass'; |
| | | import { FXAAShader } from 'three/examples/jsm/shaders/FXAAShader'; |
| | | import { FBXLoader } from 'three/examples/jsm/loaders/FBXLoader' |
| | | import * as Utils from '../../utils' |
| | | |
| | | const help = false; |
| | | |
| | |
| | | } |
| | | |
| | | render = () => { |
| | | this.renderer.shadowMap.enabled = true; |
| | | // this.renderer.render(this.scene, this.camera); |
| | | this.composer.render(); // use special effects |
| | | this.stats.update(); |
| | |
| | | initScene = () => { |
| | | const scene = new THREE.Scene(); |
| | | // scene.background = new THREE.Color(0xf0f0f0); |
| | | scene.background = new THREE.Color(0x333333); |
| | | // scene.background = new THREE.Color(0x333333); |
| | | |
| | | // scene.background = new THREE.Color(0xf8f8f8); |
| | | scene.background = new THREE.Color(0x7a7a7a); |
| | | if (help) { |
| | | scene.add(new THREE.AxesHelper(1000)); |
| | | } |
| | |
| | | const composer = new EffectComposer(this.renderer); |
| | | const renderPass = new RenderPass(this.scene, this.camera); |
| | | composer.addPass(renderPass); |
| | | // pixel ratio |
| | | const pixelRatio = this.renderer.getPixelRatio(); |
| | | const newWidth = Math.floor(this.getFullWidth() * pixelRatio) || 1; |
| | | const newHeight = Math.floor(this.getFullHeight() * pixelRatio) || 1; |
| | | composer.setSize(newWidth, newHeight); |
| | | // antialias |
| | | const effectFXAA = new ShaderPass(FXAAShader); |
| | | effectFXAA.uniforms['resolution'].value.set(1 / newWidth, 1 / newHeight); |
| | | composer.addPass(effectFXAA); |
| | | // outline |
| | | this.outlinePass = new OutlinePass(new THREE.Vector2(this.getFullWidth(), this.getFullHeight()), this.scene, this.camera); |
| | | this.outlinePass.visibleEdgeColor.set('#ffffff'); // outline color |
| | | this.outlinePass.edgeStrength = 10; // outline weight |
| | | composer.addPass(this.outlinePass); |
| | | return composer; |
| | | } |
| | |
| | | controls.minPolarAngle = 0; // 最小俯仰角度(向下看) |
| | | controls.maxPolarAngle = Math.PI / 2.1; // 最大俯仰角度(向上看) |
| | | controls.rotateSpeed = 0.6; // 视角移动速度减慢 |
| | | controls.autoRotate = false; // 自动旋转 |
| | | controls.autoRotate = true; // 自动旋转 |
| | | |
| | | controls.target = new THREE.Vector3(0, 250, 0) // 屏幕中心点 平替 camera的lookAt |
| | | return controls; |
| | |
| | | raycaster.setFromCamera(mouse, this.camera); |
| | | let intersects = raycaster.intersectObjects(this.objects, true); |
| | | if (intersects.length === 0) { |
| | | this.outlinePass.selectedObjects = []; |
| | | return; |
| | | } |
| | | this.outlinePass.selectedObjects = [intersects[0].object]; |
| | | let objName = intersects[0].object.name; |
| | | this.objects.forEach(obj => { |
| | | if (obj.name === objName) { |
| | | this.outlinePass.selectedObjects = [obj]; |
| | | } |
| | | }) |
| | | if (objName && this.handleClick) { |
| | | this.handleClick(objName, x, y); |
| | | } |
| | |
| | | } |
| | | |
| | | generateMesh = (fn) => { |
| | | fn(this.addObject); |
| | | // fn(this.addObject); |
| | | const loader = new FBXLoader(); |
| | | const promise = new Promise((resolve) => { |
| | | loader.load('model/001-5.fbx', (mesh) => { |
| | | mesh.position.set(0, 10, 0); |
| | | mesh.scale.set(5, 5, 5); |
| | | mesh.name = '1-1-1'; |
| | | // mesh.rotation.x = Utils.rotationParseNum(270); |
| | | mesh.traverse(function (child) { |
| | | if (child.isMesh) { |
| | | child.name = '1-1-1'; |
| | | child.castShadow = true; |
| | | child.receiveShadow = true; |
| | | } |
| | | }); |
| | | this.addObject(mesh); |
| | | resolve(); |
| | | }) |
| | | }) |
| | | return promise; |
| | | } |
| | | |
| | | setNewSelectedMesh = (objName) => { |
| | | for (const mesh of this.objects) { |
| | | if (mesh.name === objName) { |
| | | this.outlinePass.selectedObjects = [mesh]; |
| | | break; |
| | | } |
| | | } |
| | | } |
| | | |
| | | destroy = () => { |
| | |
| | | |
| | | const initLight = (scene) => { |
| | | const directionalLight = new THREE.DirectionalLight(0xffffff, 8); |
| | | directionalLight.position.set(-300, 300, 300); |
| | | directionalLight.position.set(1, 1, 1); |
| | | scene.add(directionalLight); |
| | | |
| | | const ambientLight = new THREE.AmbientLight(0xf0f0f0, 8); |
| | | const ambientLight = new THREE.AmbientLight(0xf0f0f0, 10); |
| | | scene.add(ambientLight); |
| | | |
| | | const spotLight = new THREE.SpotLight(0xffffff, 8); |