Skip to Content
Welcome to yujie-code-blogs build by Nextra 4.0 🎉
Three.js 基础入门与调试8. 画布自适应屏幕大小与全屏

画布自适应屏幕大小与全屏

1 画布自适应屏幕大小

1.1 自适应屏幕大小

threejs

你会发现,我们前面写好的代码,在页面尺寸发生改变的时候,并不能自适应的改变尺寸,而出现空白或者滚动条突出的情况。所以监听屏幕大小的改变,来重新设置相机的宽高比例和渲染器的尺寸大小,代码如下:

// 监听画面变化,更新渲染画面 window.addEventListener("resize", () => { // console.log("画面变化了"); // 更新摄像头 camera.aspect = window.innerWidth / window.innerHeight; // 更新摄像机的投影矩阵 camera.updateProjectionMatrix(); // 更新渲染器 renderer.setSize(window.innerWidth, window.innerHeight); // 设置渲染器的像素比 renderer.setPixelRatio(window.devicePixelRatio); });

aspect属性是设置摄像机视锥体的长宽比,通常是使用画布的宽/画布的高。camera.updateProjectionMatrix()用于更新摄像机投影矩阵,相机任何参数被改变以后必须被调用

1.2 控制场景全屏

经常我们需要全屏的展示三维场景。例如,我们想要双击,实现全屏效果,代码如下:

window.addEventListener("dblclick", () => { const fullScreenElement = document.fullscreenElement; if (!fullScreenElement) { // 双击控制屏幕进入全屏,退出全屏 // 让画布对象全屏 renderer.domElement.requestFullscreen(); } else { // 退出全屏,使用document对象 document.exitFullscreen(); } });

fullscreenElement只读属性返回当前在此文档中以全屏模式显示的元素。

如果文档当前未使用全屏模式,则返回值为null。

使用element.requestFullscreen()方法以全屏模式查看元素,exitFullscreen方法退出全屏。

2 综合上述代码

1、在前面创建的项目中的main.js文件写入代码

import * as THREE from "three"; // 导入轨道控制器 import { OrbitControls } from "three/examples/jsm/controls/OrbitControls"; // 导入动画库 import gsap from "gsap"; // console.log(THREE); // 目标:js控制画面全屏 // 1、创建场景 const scene = new THREE.Scene(); // 2、创建相机 const camera = new THREE.PerspectiveCamera( 75, window.innerWidth / window.innerHeight, 0.1, 1000 ); // 设置相机位置 camera.position.set(0, 0, 10); scene.add(camera); // 添加物体 // 创建几何体 const cubeGeometry = new THREE.BoxGeometry(1, 1, 1); const cubeMaterial = new THREE.MeshBasicMaterial({ color: 0xffff00 }); // 根据几何体和材质创建物体 const cube = new THREE.Mesh(cubeGeometry, cubeMaterial); // 修改物体的位置 // cube.position.set(5, 0, 0); // cube.position.x = 3; // 缩放 // cube.scale.set(3, 2, 1); // cube.scale.x = 5; // 旋转 cube.rotation.set(Math.PI / 4, 0, 0, "XZY"); // 将几何体添加到场景中 scene.add(cube); console.log(cube); // 初始化渲染器 const renderer = new THREE.WebGLRenderer(); // 设置渲染的尺寸大小 renderer.setSize(window.innerWidth, window.innerHeight); // console.log(renderer); // 将webgl渲染的canvas内容添加到body document.body.appendChild(renderer.domElement); // // 使用渲染器,通过相机将场景渲染进来 // renderer.render(scene, camera); // 创建轨道控制器 const controls = new OrbitControls(camera, renderer.domElement); // 设置控制器阻尼,让控制器更有真实效果,必须在动画循环里调用.update()。 controls.enableDamping = true; // 添加坐标轴辅助器 const axesHelper = new THREE.AxesHelper(5); scene.add(axesHelper); // 设置时钟 const clock = new THREE.Clock(); window.addEventListener("dblclick", () => { const fullScreenElement = document.fullscreenElement; if (!fullScreenElement) { // 双击控制屏幕进入全屏,退出全屏 // 让画布对象全屏 renderer.domElement.requestFullscreen(); } else { // 退出全屏,使用document对象 document.exitFullscreen(); } // console.log(fullScreenElement); }); function render() { controls.update(); renderer.render(scene, camera); // 渲染下一帧的时候就会调用render函数 requestAnimationFrame(render); } render(); // 监听画面变化,更新渲染画面 window.addEventListener("resize", () => { // console.log("画面变化了"); // 更新摄像头 camera.aspect = window.innerWidth / window.innerHeight; // 更新摄像机的投影矩阵 camera.updateProjectionMatrix(); // 更新渲染器 renderer.setSize(window.innerWidth, window.innerHeight); // 设置渲染器的像素比 renderer.setPixelRatio(window.devicePixelRatio); });

效果演示:

threejs