<template><div class="container" ref="container"></div></template><script >import * as THREE from "three";import { ref } from "vue";//添加一个轨道控制器import { OrbitControls} from "three/examples/jsm/controls/OrbitControls";//导入动画库import gsap from "gsap";//导入dat.guiimport * as dat from "dat.gui";export default {name: 'App',data() {return {renderer: null,scene: null,camera: null,cube: null,clock: null,animate1: null,controls: null,gui: null}},mounted() {//1.创建场景const scene = new THREE.Scene();//2.创建相机(透视相机)/*** 构造器* PerspectiveCamera( fov : Number, aspect : Number, near : Number, far : Number )* fov — 摄像机视锥体垂直视野角度* aspect — 摄像机视锥体长宽比* near — 摄像机视锥体近端面* far — 摄像机视锥体远端面*/const camera = new THREE.PerspectiveCamera(75,window.innerWidth / window.innerHeight,0.1,1000);//设置相机位置:x,y,z轴位置camera.position.set(0,0,10);//添加相机到场景中scene.add(camera);this.scene=scene;this.camera=camera;//设置cube纹理加载器const cubeTextureLoader = new THREE.CubeTextureLoader();const envMapTexture = cubeTextureLoader.load(["static/textures/environmentMaps/1/px.jpg","static/textures/environmentMaps/1/nx.jpg","static/textures/environmentMaps/1/py.jpg","static/textures/environmentMaps/1/ny.jpg","static/textures/environmentMaps/1/pz.jpg","static/textures/environmentMaps/1/nz.jpg",]);//创建物体const sphereGeometry = new THREE.SphereBufferGeometry(1,20,20);//创建材质const material = new THREE.MeshStandardMaterial({/* metalness: 0.7,//金属roughness: 0.1,//光滑 */// envMap: envMapTexture,});const sphere = new THREE.Mesh(sphereGeometry,material);//球体投射阴影sphere.castShadow = true;scene.add(sphere);const planeGeometry = new THREE.PlaneBufferGeometry(10,10);const plane = new THREE.Mesh(planeGeometry,material);plane.position.set(0,-1,0);plane.rotation.x = -Math.PI/2;//接收阴影plane.receiveShadow = true;scene.add(plane);//标准材质必须要有光//添加灯光//环境光const light = new THREE.AmbientLight(0xffffff,0.5);//0.1强度scene.add(light);//直线光源const directionalLight = new THREE.DirectionalLight;directionalLight.position.set(10,10,10);directionalLight.castShadow= true;//开启阴影渲染scene.add(directionalLight);//4.初始化渲染器const renderer = new THREE.WebGLRenderer();//设置渲染器的尺寸大小renderer.setSize(window.innerWidth,window.innerHeight);//开启场景中的阴影贴图renderer.shadowMap.enabled = true;this.renderer=renderer;//将webgl渲染的canvas内容添加到div//document.body.append(renderer.domElement);this.$refs['container'].appendChild(renderer.domElement);//使用渲染器,通过相机将场景渲染进来renderer.render(scene,camera);//5.创建轨道控制器const controls = new OrbitControls(camera,renderer.domElement);//设置控制器阻尼,让控制器更有真实效果,必须在动画循环调用updatecontrols.enableDamping = true;this.controls=controls;//6.添加坐标轴辅助器//size -- (可选的) 表示代表轴的线段长度. 默认为 1.const axesHelper = new THREE.AxesHelper( 5 );scene.add( axesHelper );//双击控制屏幕进入全屏、退出全屏window.addEventListener("dblclick",()=>{const fullScreenElement =document.fullscreenElement;if(!fullScreenElement){//让画布对象全屏this.renderer.domElement.requestFullscreen();}else{//退出全屏,使用document对象document.exitFullscreen();}})//监听画面变化,更新渲染画面window.addEventListener("resize",()=>{console.log("画面变化了");//更新摄像头this.camera.aspect = window.innerWidth /window.innerHeight;//更新摄像机的投影矩阵this.camera.updateProjectionMatrix();//更新渲染器this.renderer.setSize(window.innerWidth,window.innerHeight);//设置渲染器的像素比this.renderer.setPixelRatio(window.devicePixelRatio);})this.renders();},methods: {renders(){this.controls.update();this.renderer.render(this.scene,this.camera);// requestAnimationFrame(this.renders());//此行代码会出现threejs requestAnimationFrame 导致的call stack超出上限的问题requestAnimationFrame(this.renders.bind(this));},}}</script><style>*{margin: 0;padding: 0;}.container{height: 100vh;width: 100vw;background-color: #f0f0f0;}</style>
原文作者:小南瓜开发平台;如有侵权,请联系管理员删除。