控制器设置阻尼,让动画更具有连贯的效果
//设置控制器阻尼,让控制器更有真实效果,必须在动画循环调用update
controls.enableDamping = true;
监听画面变化,更新渲染画面
关键代码
//监听画面变化,更新渲染画面
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);
})
完整代码:
<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";export default {name: 'App',data() {return {renderer: null,scene: null,camera: null,cube: null,clock: null,animate1: null,controls: 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;//3.添加物体//创建几何体const cubeGeometry = new THREE.BoxGeometry(1,1,1);//创建材质const cubeMaterial = new THREE.MeshBasicMaterial({color: 0xffff00});//根据几何体和材质创建物体const cube = new THREE.Mesh(cubeGeometry,cubeMaterial);//缩放:x轴3倍,y轴2倍,z轴1倍//cube.scale.set(3,2,1)//旋转cube.rotation.set(Math.PI/4 , 0,0,'XZY');this.cube=cube;//将几何体添加到场景中scene.add(cube);//4.初始化渲染器const renderer = new THREE.WebGLRenderer();//设置渲染器的尺寸大小renderer.setSize(window.innerWidth,window.innerHeight);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 );var animate1 = gsap.to(this.cube.position,{x:5,duration:5,ease: "power1.easeInOut",repeat: -1,yoyo: true});gsap.to(this.cube.rotation,{x:2*Math.PI,duration:5,repeat: -1,ease:"power1.easeInOut"});this.animate1 = animate1;window.addEventListener("dblclick",()=>{if(this.animate1.isActive()){this.animate1.pause();}else{this.animate1.resume();}})//监听画面变化,更新渲染画面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>
原文作者:小南瓜开发平台;如有侵权,请联系管理员删除。