threejs
0. 学习资料
视频版本 r124 最新版本 r154 显著变化如下,文件位置移位不管
- Difference between buffer geometry and geometry:移除了Geometry
- r134 因为标准不同,移除了DeviceOrientationControls
万向锁
四元数 quaterion
1. 视频学习心得
Basic 基础
初始化
js
import * as THREE from 'three'
const sizes = {
width: window.innerWidth,
height: window.innerHeight
}
const canvas: HTMLCanvasElement = document.querySelector('canvas.webgl')
const camera = new THREE.PerspectiveCamera(75, sizes.width / sizes.height, 0.001, 100);
scene.add(camera)
// Scene
const scene = new THREE.Scene()
const renderer = new THREE.WebGLRenderer({
canvas: canvas
})
renderer.setSize(sizes.width, sizes.height)
renderer.render(scene, camera)添加CameraHelper,生成辅助线,辅助开发
js
const helper = new THREE.CameraHelper(camera);
const colorBlue = new THREE.Color('blue')
helper.setColors(colorBlue, colorBlue, colorBlue, colorBlue, colorBlue)
scene.add(helper);Transforms Object 转换对象
修改position、rotation、scale
THREE.Group组,可以添加多个对象
Animations 动画
动画loop
js
function animate() {
renderer.render(scene, camera)
requestAnimationFrame(animate)
}
animate()使用clock计算deltaTime,抹平不同电脑帧率限制
使用gsap改变位置,添加动画
js
gsap.to(group.position, {y: 2, duration: 1, delay: 1})
gsap.to(group.position, {y: 0, duration: 1, delay: 2})Cameras 相机
PerspectiveCamera:透视相机
OrthographicCamera:正交相机
CubeCamera:立方相机
StereoCamera:双透视相机
Fullscreen and Resizing 全屏和变换窗口
双击全屏
js
const fullScreen = {
get enabled() {
return !!(document.fullscreenElement || document.webkitFullscreenElement)
},
request() {
let element = document.documentElement
if (element.requestFullscreen) {
element.requestFullscreen()
} else if (element.webkitRequestFullScreen) {
element.webkitRequestFullScreen()
} else if (element.mozRequestFullScreen) {
element.mozRequestFullScreen()
} else if (element.msRequestFullscreen) { // IE11
element.msRequestFullscreen()
} else {
window.alert('your browser not support requestFullscreen')
}
},
exit() {
if (document.exitFullscreen) {
document.exitFullscreen()
} else if (document.webkitCancelFullScreen) {
document.webkitCancelFullScreen()
} else if (document.mozCancelFullScreen) {
document.mozCancelFullScreen()
} else if (document.msExitFullscreen) {
document.msExitFullscreen()
} else {
window.alert('your browser not support exitFullscreen')
}
}
}
window.addEventListener('dblclick', () => {
console.log('dbclick', document.fullscreenElement)
if (fullScreen.enabled) {
fullScreen.exit()
} else {
fullScreen.request()
}
})更新比例
js
window.addEventListener('resize', () => {
Object.assign(sizes, {
width: window.innerWidth,
height: window.innerHeight
})
console.log('resize', sizes)
// camera
camera.aspect = sizes.width / sizes.height
camera.updateProjectionMatrix()
// size
renderer.setSize(sizes.width, sizes.height)
// handle different screen move
renderer.setPixelRatio(Math.min(window.devicePixelRatio, 2))
})