效果预览:效果预览
源码下载:关注公众号【RMRF】,回复【three2】可获取源码
一、安装
npm install three
二、App.vue
<template>
<div>
<div id="container"></div>
</div>
</template>
<script>
import * as THREE from 'three';
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls';
import { UnrealBloomPass } from 'three/examples/jsm/postprocessing/UnrealBloomPass';
import { RenderPass } from 'three/examples/jsm/postprocessing/RenderPass';
import { EffectComposer } from 'three/examples/jsm/postprocessing/EffectComposer';
export default {
data() {
return {
scene: null, // 场景
camera: null, // 相机
renderer: null, // 渲染
composer: null, // 效果合成器
cube: null
};
},
mounted() {
this.init();
},
methods: {
// 初始化
init() {
const el = document.getElementById('container');
this.initScene();
this.initCamera();
this.initRenderer(el);
this.initCube();
this.initBloomPass()
this.initOrbitControls();
this.render();
this.requestAnimationFrame()
},
// 场景
initScene() {
this.scene = new THREE.Scene();
this.scene.background = new THREE.Color('#000000');
},
// 相机
initCamera() {
this.camera = new THREE.PerspectiveCamera(
75,
window.innerWidth / window.innerHeight,
0.1,
1000
);
this.camera.position.set(2, 5, 2);
},
// 渲染器
initRenderer(el) {
this.renderer = new THREE.WebGLRenderer();
this.renderer.setSize(window.innerWidth, window.innerHeight);
el.appendChild(this.renderer.domElement);
},
// 立方体
initCube() {
const geometry = new THREE.BoxGeometry(2, 2, 2);
const material = new THREE.MeshBasicMaterial({ color: '#00ffff' });
this.cube = new THREE.Mesh(geometry, material);
this.scene.add(this.cube);
this.camera.position.z = 5;
},
// 炫光
initBloomPass() {
let renderScene = new RenderPass(this.scene, this.camera);
let bloomPass = new UnrealBloomPass(
new THREE.Vector2(window.innerWidth, window.innerHeight),
1.5,
0.4,
0.85
);
bloomPass.renderToScreen = true;
bloomPass.threshold = 0;
bloomPass.strength = 1;
bloomPass.radius = 0;
this.composer = new EffectComposer(this.renderer);
this.composer.setSize(window.innerWidth, window.innerHeight);
this.composer.addPass(renderScene);
this.composer.addPass(bloomPass);
},
// 缩放
initOrbitControls() {
let controls = new OrbitControls(this.camera, this.renderer.domElement);
controls.maxDistance = 10;
controls.addEventListener('change', this.render);
},
requestAnimationFrame() {
this.composer.render();
requestAnimationFrame(this.requestAnimationFrame);
},
// 渲染
render() {
this.renderer.render(this.scene, this.camera);
}
}
};
</script>