【Three.js入门】处理动画、尺寸自适应、双击进入/退出全屏(Clock跟踪时间,Gsap动画库,自适应画面,进入/退出全屏)

简介: 【Three.js入门】处理动画、尺寸自适应、双击进入/退出全屏(Clock跟踪时间,Gsap动画库,自适应画面,进入/退出全屏)

https://www.bilibili.com/video/BV1hD4y1h7pi?t=0.7

【使用 Three.js 实现的效果】

一、Clock 跟踪时间处理动画

接上篇文章,我们创建时钟对象,用于跟踪时间

// 设置时钟(该对象用于跟踪时间)
const clock = new THREE.Clock()
// 渲染函数
function render() {
    // 获取自时钟启动后的秒数,同时将旧时间设置为当前时间
    let time = clock.getElapsedTime()
    let t = time % 4
    cube.position.x = t * 1
    renderer.render(scene, camera)
    // 请求动画帧-下一帧的时候重新渲染
    requestAnimationFrame(render)
}
render()

31ff97df8a9a4187b461c99feb6feeb8.png

二、Gsap 动画库

Gsap 动画库官方网址

终端键入如下命令,安装 gsap:

npm install gsap

我们删掉时钟的相关代码,修改如下:

import * as THREE from 'three'
import { OrbitControls} from 'three/examples/jsm/controls/OrbitControls'
import gsap from "gsap"
......
// 设置动画(0-4的位置5s时间)
let animate = gsap.to(cube.position, {
  // x 轴的位置
    x: 4,
    // 移动的时间
    duration: 5,
    // 移动方式
    ease: "power1.inOut",
    // 设置重复的次数,无限次循环 -1
    repeat: 2,
    // 往返运动
    yoyo: true,
    // 延迟两秒运动
    delay: 2,
    // 动画完成
    onComplete: () => {
        console.log("动画完成")
    },
    // 动画开始
    onStart: () => {
        console.log("动画开始");
    }
})
// 设置旋转(5s旋转360°)
gsap.to(cube.rotation, {
    x: 2 * Math.PI,
    duration: 5,
    ease: "power1.inOut"
})
// 双击屏幕暂停/恢复
window.addEventListener("dblclick", () => {
    if (animate.isActive()) {
        // 动画暂停
        animate.pause()
    } else {
        // 动画恢复
        animate.resume()
    }
})
// 渲染函数
function render() {
    renderer.render(scene, camera)
    // 请求动画帧-下一帧的时候重新渲染
    requestAnimationFrame(render)
}
render()

https://www.bilibili.com/video/BV1Q14y1N777?t=0.7

Gsap 控制动画属性和方法

三、根据尺寸变化实现自适应画面

添加控制器阻尼:更好的转动效果(丝滑)

根据上文,添加修改代码如下:

// 设置控制器阻尼,让控制器更有真实效果,必须在动画循环里调用.update()
controls.enableDamping = true
// 渲染函数
function render() {
  // 在动画循环里调用.update()
    controls.update()
    renderer.render(scene, camera)
    // 请求动画帧-下一帧的时候重新渲染
    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)
})

https://www.bilibili.com/video/BV1Cg411E7KW?t=0.8

阻尼+自适应画面

四、控制画布进入&退出全屏

进入全屏:renderer.domElement.requestFullscreen(),退出全屏:document.exitFullscreen()

注:去掉原先的动画和旋转的双击效果,修改代码如下:

// 双击屏幕进入/退出全屏
window.addEventListener("dblclick", () => {
    // 获取全屏(非全屏输出为null,全屏输出为画布)
    const fullScreenElement = document.fullscreenElement
    if (!fullScreenElement) {
      // 双击控制屏幕进入全屏
        renderer.domElement.requestFullscreen()
    } else {
        // 退出全屏
        document.exitFullscreen()
    }
})

a7f6e13709ac4b93ae7569037b909353.png

e4ffa5bb62df4594a9faa7d7f78b7095.png

45fc82a82c6542bdb2ff4986377d8db3.png

相关文章
|
3月前
|
前端开发 机器人 API
前端大模型入门(一):用 js+langchain 构建基于 LLM 的应用
本文介绍了大语言模型(LLM)的HTTP API流式调用机制及其在前端的实现方法。通过流式调用,服务器可以逐步发送生成的文本内容,前端则实时处理并展示这些数据块,从而提升用户体验和实时性。文章详细讲解了如何使用`fetch`发起流式请求、处理响应流数据、逐步更新界面、处理中断和错误,以及优化用户交互。流式调用特别适用于聊天机器人、搜索建议等应用场景,能够显著减少用户的等待时间,增强交互性。
676 2
|
3天前
|
前端开发 API 开发者
Next.js 实战 (五):添加路由 Transition 过渡效果和 Loading 动画
这篇文章介绍了Framer Motion,一个为React设计的动画库,提供了声明式API处理动画和页面转换,适合创建响应式用户界面。文章包括首屏加载动画、路由加载Loading、路由进场和退场动画等主题,并提供了使用Framer Motion和next.js实现这些动画的示例代码。最后,文章总结了这些效果,并邀请读者探讨更好的实现方案。
|
2月前
|
JavaScript 前端开发
如何使用时间切片来优化JavaScript动画的性能?
如何使用时间切片来优化JavaScript动画的性能?
|
2月前
|
移动开发 JavaScript 前端开发
一些处理浏览器兼容性问题的JavaScript库
这些库在处理浏览器兼容性问题方面都有着各自的特点和优势,可以根据具体的需求和项目情况选择合适的库来使用,从而提高代码的兼容性和稳定性,为用户提供更好的体验。同时,随着浏览器技术的不断发展,还需要持续关注和学习新的兼容性解决方案。
112 48
|
8天前
|
JavaScript 前端开发
【JavaScript】——JS基础入门常见操作(大量举例)
JS引入方式,JS基础语法,JS增删查改,JS函数,JS对象
|
2月前
|
JavaScript 前端开发
Moment.js与其他处理时间戳格式差异的JavaScript库相比有什么优势?
Moment.js与其他处理时间戳格式差异的JavaScript库相比有什么优势?
|
2月前
|
CDN
如何在项目中使用Moment.js库?
如何在项目中使用Moment.js库?
|
2月前
|
JavaScript 前端开发
如何在不影响性能的前提下使用JavaScript库来实现复杂的动画效果?
如何在不影响性能的前提下使用JavaScript库来实现复杂的动画效果?
|
2月前
|
算法 开发者
Moment.js库是如何处理不同浏览器的时间戳格式差异的?
总的来说,Moment.js 通过一系列的技术手段和策略,有效地处理了不同浏览器的时间戳格式差异,为开发者提供了一个稳定、可靠且易于使用的时间处理工具。
46 1
|
2月前
|
JavaScript 前端开发
CSS3 动画和 JavaScript 动画的性能比较
具体的性能表现还会受到许多因素的影响,如动画的复杂程度、浏览器的性能、设备的硬件条件等。在实际应用中,需要根据具体情况选择合适的动画技术。