gitee 地址
gitee
地址: gittee地址
本篇目标
- 实现画布的响应式,根据屏幕尺寸自适应
- 设置画布全屏,和退出全屏
实现画布的响应式
我们这里需要用到原生的addEventListener
用来监听我们窗口的变化。
我们需要将原来写死的画布大小改成窗口大小
1 2 3 4 5
| renderer.setSize( window.innerWidth, window.innerHeight );
|
添加窗口变化监听器
1 2 3 4
| addEventListener('resize', () => {
})
|
监听器添加完成后,我们需要在回调函数里面,重新设置其大小和比例
1 2 3 4 5 6 7 8 9 10 11
| camera.aspect = window.innerWidth / window.innerHeight camera.updateProjectionMatrix() renderer.setSize( window.innerWidth, window.innerHeight ); renderer.setPixelRatio(window.devicePixelRatio)
|
添加完后的代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| addEventListener('resize', () => { camera.aspect = window.innerWidth / window.innerHeight camera.updateProjectionMatrix() renderer.setSize( window.innerWidth, window.innerHeight ); renderer.setPixelRatio(window.devicePixelRatio) })
|
这样无论我们怎么修改窗口,画布和相机投影内容都在屏幕的中间。
设置画布全屏和退出全屏
这里设置请求画布全屏我们依然需要使用原生时间addEventListener
作为监听,requestFullscreen
来请求全屏,exitFullscreen
来退出全屏操作。
直接上代码:
1 2 3 4 5 6 7 8 9 10 11 12 13
| addEventListener('dblclick', () => { const fullscreenElement = document.fullscreenElement if(fullscreenElement){ document.exitFullscreen() return } renderer.domElement.requestFullscreen() })
|
这样我们设置和退出画布全屏的这个功能就做好了。
完整代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130
| import * as THREE from "three"
import { OrbitControls } from "three/examples/jsm/controls/OrbitControls"
const scene = new THREE.Scene()
const camera = new THREE.PerspectiveCamera( 75, window.innerWidth / window.innerHeight, 0.1, 1000 )
const renderer = new THREE.WebGLRenderer({ antialias: true, });
renderer.setSize( window.innerWidth, window.innerHeight );
document.body.appendChild(renderer.domElement)
const controls = new OrbitControls( camera, renderer.domElement );
controls.enableDamping = true
controls.update()
let geometry = new THREE.BoxGeometry(5, 5, 5);
const materials = [] for(let i = 0; i < 6; i++){ materials.push( new THREE.MeshBasicMaterial({ color: Math.random() * 0x00ff0000 }) ) }
const cube = new THREE.Mesh( geometry, materials ); scene.add( cube );
camera.position.z = 50;
scene.background = new THREE.Color(0xffffcc99)
const axesHelper = new THREE.AxesHelper(20) scene.add( axesHelper )
addEventListener('resize', () => { camera.aspect = window.innerWidth / window.innerHeight camera.updateProjectionMatrix() renderer.setSize( window.innerWidth, window.innerHeight ); renderer.setPixelRatio(window.devicePixelRatio) })
addEventListener('dblclick', () => { const fullscreenElement = document.fullscreenElement if(fullscreenElement){ document.exitFullscreen() return } renderer.domElement.requestFullscreen() })
function animate() {
requestAnimationFrame(animate)
controls.update()
renderer.render(scene, camera) }
animate()
|
下期预告
结合dat.gui
实现界面可视化修改及调试
所有操作实现案例均以上传gitee,地址在文章开篇处。