【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

相关文章
|
29天前
|
前端开发 机器人 API
前端大模型入门(一):用 js+langchain 构建基于 LLM 的应用
本文介绍了大语言模型(LLM)的HTTP API流式调用机制及其在前端的实现方法。通过流式调用,服务器可以逐步发送生成的文本内容,前端则实时处理并展示这些数据块,从而提升用户体验和实时性。文章详细讲解了如何使用`fetch`发起流式请求、处理响应流数据、逐步更新界面、处理中断和错误,以及优化用户交互。流式调用特别适用于聊天机器人、搜索建议等应用场景,能够显著减少用户的等待时间,增强交互性。
214 2
|
9天前
|
机器学习/深度学习 自然语言处理 前端开发
前端神经网络入门:Brain.js - 详细介绍和对比不同的实现 - CNN、RNN、DNN、FFNN -无需准备环境打开浏览器即可测试运行-支持WebGPU加速
本文介绍了如何使用 JavaScript 神经网络库 **Brain.js** 实现不同类型的神经网络,包括前馈神经网络(FFNN)、深度神经网络(DNN)和循环神经网络(RNN)。通过简单的示例和代码,帮助前端开发者快速入门并理解神经网络的基本概念。文章还对比了各类神经网络的特点和适用场景,并简要介绍了卷积神经网络(CNN)的替代方案。
|
8天前
|
移动开发 前端开发 JavaScript
前端实训,刚入门,我用原生技术(H5、C3、JS、JQ)手写【网易游戏】页面特效
于辰在大学期间带领团队参考网易游戏官网的部分游戏页面,开发了一系列前端实训作品。项目包括首页、2021校园招聘页面和明日之后游戏页面,涉及多种特效实现,如动态图片切换和人物聚合效果。作品源码已上传至CSDN,视频效果可在CSDN预览。
14 0
前端实训,刚入门,我用原生技术(H5、C3、JS、JQ)手写【网易游戏】页面特效
|
17天前
|
监控 前端开发 JavaScript
React 静态网站生成工具 Next.js 入门指南
【10月更文挑战第20天】Next.js 是一个基于 React 的服务器端渲染框架,由 Vercel 开发。本文从基础概念出发,逐步探讨 Next.js 的常见问题、易错点及解决方法,并通过具体代码示例进行说明,帮助开发者快速构建高性能的 Web 应用。
47 10
|
10天前
|
JavaScript 前端开发 搜索推荐
Moment.js、Day.js、Miment,日期时间库怎么选?
【10月更文挑战第29天】如果你需要一个功能强大、插件丰富的日期时间库,并且对性能要求不是特别苛刻,Moment.js是一个不错的选择;如果你追求极致的轻量级和高性能,那么Day.js可能更适合你;而如果你有一些特定的日期时间处理需求,并且希望在性能和功能之间取得平衡,Miment也是可以考虑的。
|
11天前
|
JavaScript
js动画循环播放特效源码(上班族的一天)
js动画循环播放特效是一段实现了包含形象的卡通小人吃、睡、电脑工作的网页动画,js循环动画,简单的画面设计。非常丝滑有意思,欢迎对此代码感兴趣的朋友前来下载参考。
22 2
|
14天前
|
数据采集 存储 JavaScript
如何使用Puppeteer和Node.js爬取大学招生数据:入门指南
本文介绍了如何使用Puppeteer和Node.js爬取大学招生数据,并通过代理IP提升爬取的稳定性和效率。Puppeteer作为一个强大的Node.js库,能够模拟真实浏览器访问,支持JavaScript渲染,适合复杂的爬取任务。文章详细讲解了安装Puppeteer、配置代理IP、实现爬虫代码的步骤,并提供了代码示例。此外,还给出了注意事项和优化建议,帮助读者高效地抓取和分析招生数据。
如何使用Puppeteer和Node.js爬取大学招生数据:入门指南
|
15天前
|
存储 JavaScript 前端开发
decimal.js库的安装和使用方法
【10月更文挑战第24天】decimal.js 是一个非常实用的高精度计算库,通过合理的安装和使用,可以在 JavaScript 中实现精确的数值计算和处理。你可以根据具体的需求和项目情况,灵活运用该库来解决数字精度丢失的问题。
|
2月前
|
JavaScript 前端开发 小程序
一小时入门Vue.js前端开发
本文是作者关于Vue.js前端开发的快速入门教程,包括结果展示、参考链接、注意事项以及常见问题的解决方法。文章提供了Vue.js的基础使用介绍,如何安装和使用cnpm,以及如何解决命令行中遇到的一些常见问题。
一小时入门Vue.js前端开发
|
1月前
|
JavaScript 前端开发 开发者
jQuery:JavaScript库的瑰宝
jQuery:JavaScript库的瑰宝
41 3