让你的three.js动起来

news2025/1/17 4:50:19

让你的three.js动起来

简介

本节主要是给实例添加动画效果,以及加了一些小插件用以实现帧率检测、gui可视化配置、动态监听屏幕大小变化刷新和鼠标操控功能。

引入的插件js:

  • three.js
  • dat.gui.js
  • Stats.js
  • TrackballControls.js

实际效果:

在这里插入图片描述

关键代码:

动画效果:

动画效果主要使用的是requestAnimationFrame方法,通过这个函数,你可以向浏览器提供一个回调函数。 你无须定义回调间隔,浏览器将自行决定最佳回调时机。你需要做的是在这个回调函数里完成一帧绘制操作(即在这里再次执行一遍你的渲染函数),然后将剩下的工作交给浏览器,它负责使场景绘制尽量高效和平顺地进行。

帧率检测:

主要运用的是Stats插件,主要涉及的点是

  • 引用该js,
  • 完成方法的初始化操作,
  • 最后在渲染函数里添加触发update的事件。
gui可视化配置:

主要运用的是dat.gui插件,主要涉及的点是

  • 引用该js,
  • 并且完成方法的初始化操作,
  • 和要可视化配置的组件进行变量绑定,
  • 最后在渲染函数里将可视化的参数设置到组件的属性中。
动态监听屏幕大小变化刷新

主要应用的是浏览器的resize方法

  • 绑定window的监听resize方法,
  • 在resize的回调函数里变更camera的aspect和updateProjectionMatrix()方法
  • 在resize的回调函数里重新setSize实例的尺寸。
鼠标操控

主要运用的是TrackballControls插件,主要涉及的点是

  • 引用该js,
  • 完成方法的初始化操作,
  • 最后在渲染函数里添加触发update的事件。

完整代码:

// 初始化检测动画运行帧数方法
let stats = new Stats()
stats.showPanel(0)
document.body.appendChild(stats.dom)

// 初始化GUI插件
let controls = new function () {
	this.rotationSpeed = 0.02;
	this.bouncingSpeed = 0.03;
};
let gui = new dat.GUI()
gui.add(controls, 'rotationSpeed', 0, 0.5)
gui.add(controls, 'bouncingSpeed', 0, 0.5)

//容器
const container = document.getElementById('container')
let scale = window.innerWidth / window.innerHeight
var scene = new THREE.Scene();
var camera = new THREE.PerspectiveCamera( 45, scale, 0.1, 1000 );
var renderer = new THREE.WebGLRenderer();
renderer.setClearColor(new THREE.Color(0x000000))
renderer.setSize(window.innerWidth, window.innerHeight)

// 设置渲染器支持阴影渲染功能
renderer.shadowMap.enabled = true;
// 坐标轴大小
var axes = new THREE.AxesHelper(20)
scene.add(axes)
// 创建地面
var planeGeometry = new THREE.PlaneGeometry(60, 20);

// 将材质替换为可对光源产生反应的:MeshLambertMaterial
var planeMaterial = new THREE.MeshLambertMaterial({
	color: 0xAAAAAA
});
var plane = new THREE.Mesh(planeGeometry, planeMaterial);
// r旋转地面
plane.rotation.x = -0.5 * Math.PI;
plane.position.set(15, 0, 0);

// 设置平面可接受阴影
plane.receiveShadow = true;
// 添加地面到场景中
scene.add(plane);
// 添加方块
var cubeGeometry = new THREE.BoxGeometry(4, 4, 4);
var cubeMaterial = new THREE.MeshLambertMaterial({
	color: 0xFF0000
});
var cube = new THREE.Mesh(cubeGeometry, cubeMaterial);
// 设置方块位置
cube.position.set(-4, 3, 0);
// 设置立方体可投射阴影
cube.castShadow = true;


// 添加方块到场景中
scene.add(cube);
// 创建球体
var sphereGeometry = new THREE.SphereGeometry(4, 20, 20);
var sphereMaterial = new THREE.MeshLambertMaterial({
	color: 0x7777FF
});
var sphere = new THREE.Mesh(sphereGeometry, sphereMaterial);
// 设置球体位置
sphere.position.set(20, 4, 2);


// a添加球体到场景中
scene.add(sphere);

// 设置球体可投射阴影
sphere.castShadow = true;

// 放置相机位置
camera.position.set(-30, 40, 30);
camera.lookAt(scene.position);

// 设置光源
var spotLight = new THREE.SpotLight(0xFFFFFF);
spotLight.position.set(-40, 40, -15);
spotLight.castShadow = true;
spotLight.shadow.mapSize = new THREE.Vector2(1024, 1024);
spotLight.shadow.camera.far = 130;
spotLight.shadow.camera.near = 40;
scene.add(spotLight);

// 添加canvas节点
container.appendChild(renderer.domElement);

// 添加鼠标放大缩小移动插件
let trackballControls = initTrackballControls(camera, renderer)
let clock = new THREE.Clock()
function initTrackballControls(camera, renderer) {
    var trackballControls = new THREE.TrackballControls(camera, renderer.domElement);
    trackballControls.rotateSpeed = 1.0;
    trackballControls.zoomSpeed = 1.2;
    trackballControls.panSpeed = 0.8;
    trackballControls.noZoom = false;
    trackballControls.noPan = false;
    trackballControls.staticMoving = true;
    trackballControls.dynamicDampingFactor = 0.3;
    trackballControls.keys = [65, 83, 68];

    return trackballControls;
}

// 渲染函数
let step = 0
function renderScene() {
	// 更新鼠标控制插件
	trackballControls.update(clock.getDelta())
	// 帧数更新
	stats.update()
	// 立方体运动方法
	cube.rotation.x += controls.rotationSpeed
	cube.rotation.y += controls.rotationSpeed
	cube.rotation.z += controls.rotationSpeed

	// 球体运动方法
	step += controls.bouncingSpeed
	sphere.position.x = 20 + 10*(Math.cos(step))
	sphere.position.y = 2 + 10*Math.abs(Math.sin(step))

	/**
	 * requestAnimationFrame :
	 * 通过这个函数,你可以向浏览器提供一个回调函数。
	 * 你无须定义回调间隔,浏览器将自行决定最佳回调时机。
	 * 你需要做的是在这个回调函数里完成一帧绘制操作,
	 * 然后将剩下的工作交给浏览器,
	 * 它负责使场景绘制尽量高效和平顺地进行。
	 */
	requestAnimationFrame(renderScene)
	// 渲染
	renderer.render(scene, camera)
}

// 渲染函数调用
renderScene();

// 定义 resize方法,屏幕尺寸变更时触发
window.addEventListener('resize', onResize, false)
function onResize() {
	// aspect属性,这个属性表示屏幕的长宽比
	camera.aspect = window.innerWidth / window.innerHeight
	camera.updateProjectionMatrix()
	renderer.setSize(window.innerWidth, window.innerHeight)
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/435332.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java 线程状态有哪些?

文章目录 Java 线程状态有哪些?初始状态(NEW)可运行状态(RUNNABLE)就绪状态运行状态 阻塞状态(BLOCKED)等待状态(WAITING)超时等待(TIMED_WAITING&#xff09…

一次打靶场记录

题目提示 1、目录爆破 在对靶场进行信息收集、目录扫描之后发现结果存在www.zip,data.zp 两个备份文件 下载回来解压之后发现www.zip是网站备份文件,data.zip是数据库文件,存在一个maccms的数据库 苹果cms的数据库,导入本地数据库。 admin…

【并发编程Python】为什么Python这么慢

Python速度慢的所有原因 Python作为一门非常优秀的计算机语言,其速度慢给Python减了很多分,也是其一直被诟病的主要原因之一,通常情况下,Python比Java/C慢约5-10倍,在一些特殊的情况下Python甚至比C慢100~200倍&#x…

数据结构——B树和B+树

数据结构——B树和B树 一、B树1.B树的特征2.B树的插入操作3.B树的删除操作4.B树的缺点 二、B树B树的特征 平衡二叉树或红黑树的查找效率最高,时间复杂度是O(nlogn)。但不适合用来做数据库的索引树。 因为磁盘和内存读写速度有明显的差距,磁盘中存储的数…

玩转肺癌目标检测数据集Lung-PET-CT-Dx ——③整理、验证数据,建立Dataset对象

文章目录 数据整理整理出所有的dcm文件整理出所有的xml标注文件整理数据①——舍弃错误的标注文件整理数据②——两个标注文件指向同一个目标图片的情况封装函数,传入xml文件,显示标注效果 整理数据③——将PETCT的三通道图像转成平扫CT的单通道图像格式…

企业费控,驶向「一体化」

在数字化于企业内部各个环节实现平权、成为标配的当下,财务,这个被称为“控制企业生命力”的核心环节,是否应该拥有新的价值? 作者| 皮爷 出品|产业家 2022年年中,施伟和分贝通的团队接到一项“特殊需求”。 这个…

在职读研专业——劳动经济学

研究方向:劳动经济学主要研究劳动力市场现象及其所引起的劳动力资源配置等相关问题,包括劳动力供给、劳动力需求、就业、工资、人力资本投资、收入分配等。例如:劳动力市场失衡背后各种因素的变化,如何通过资源的配置使劳动资源配…

MySQL innobackupex 备份工具使用总结

前言 在MySQL备份以及搭建从库的过程中,我们针对比较小的库大多采用的是mysqldump,简单,方便。但是在大库进行搭建从库的时候,且数据库主机没有一个很好的存储来满足备份,这个时候就需要使用innobackupex来协助你来做一…

Pocsuite3框架POC/EXP编写练习:Flask(Jinja2) 服务端模板注入漏洞

Pocsuite3 是由知道创宇 404 实验室打造的一款基于 GPLv2 许可证开源的远程漏洞测试框架。可以用来编写POC/EXP,今天借助Flask框架下的SSTI漏洞练习记录一下Pocsuite3框架的配置和编写过程。 官方文档:Pocsuite3 是什么? | Pocsuite3 安装 …

小黑继续跟着沛奇老师学携程:携程基础3

3.异步编程 3.1事件循环 理解成一个死循环,去检测并执行某些代码 # 伪代码任务列表 [任务1,任务2,任务3,...] while True:可执行的任务列表,已完成的任务列表 去任务列表中检查所有任务,将可执行和已完…

安装、启动和登陆doccano

一、安装 1、使用的Pycharm安装的doccano 2、初始化数据库 doccano init 3、创建用户名和密码 # admin是用户名,pass是密码,都可以自定义 doccano createuser --username admin --password pass 二、启动 1、在一个Terminal终端启动webserver服务 …

自适应控制专栏目录及介绍

目录 自适应控制专栏目录及介绍第一篇:[具有不确定参数系统的自适应跟踪控制设计_ADi_hhh的博客-CSDN博客](https://blog.csdn.net/qq_45830323/article/details/129713051)第二篇:[(SISO)单输入单输出系统的模型参考自适应控制_A…

cdh Hue集成sentry的权限管理详细步骤

hue登录hue的第一个用户要用hue用户创建,默认hue为超级用户,hue用户页面的权限可以管理很多用户操作,比如查看hdfs目录,使用其他组件,授权功能等等 一.hive的配置 1.关闭模拟,开启sentry 2.添加配置(注意配置的位置) <property> <name>sentry.hive.tes…

【C++11】lambda表达式

目录 lambda表达式 1.1 lambda表达式出现的原因 1.2 lambda表达式语法 1.3 函数对象与lambda表达式 lambda表达式 1.1 lambda表达式出现的原因 在C98中&#xff0c;如果想要对一个数据集合中的元素进行排序&#xff0c;可以使用 std::sort 方法 测试代码 #include <…

苹果撤离中国市场?中国市场太重要,印度制造是备胎

苹果在中国之行后&#xff0c;却计划进一步扩大印度制造iPhone的比例&#xff0c;甚至将iPhone15全数交给印度制造&#xff0c;业界因此认为苹果正在离开中国市场&#xff0c;然而这完全是臆想&#xff0c;中国市场对苹果来说仍然非常重要&#xff0c;它不会轻易舍弃这个市场。…

【Unity VR开发】结合VRTK4.0:添加碰撞忽略器

语录&#xff1a; 最远的旅行&#xff0c;是从自己的身体到自己的心&#xff0c;是从一个人的心到另一个人的心。坚强不是面对悲伤不流一滴泪&#xff0c;而是擦干眼泪后微笑面对以后的生活。 前言&#xff1a; 模块化提供了一种允许两个或者多个对象忽略彼此碰撞的方法&#x…

Logstash:多管道配置

我们大多数人已经熟悉 Elastic 产品。 在此博客中&#xff0c;我们将逐步介绍配置 Logstash 以使用多个管道摄取和处理数据的步骤。 Logstash 是一种开源数据处理管道&#xff0c;可让你摄取、转换和输出数据。 它是从各种来源收集和处理大量数据的强大工具&#xff0c;可用于管…

IP协议头

IP 4位版本号&#xff08;version&#xff09;4位头部长度&#xff08;header length&#xff09;8位服务类型&#xff08;Type Of Service&#xff09;16位总长度&#xff08;total length&#xff09;16位标识&#xff08;id&#xff09;3位标志字段13位分片偏移&#xff08;…

Spring的循环依赖

什么是循环依赖&#xff1f; 循环依赖其实就是循环引用&#xff0c;也就是两个或者两个以上的 bean 互相持有对方&#xff0c;最终形成闭环。比如 A 依赖于 B&#xff0c;B 依赖于 C&#xff0c;C 又依赖于 A。如下图&#xff1a; 注意&#xff0c;这里不是函数的循环调用&…

金陵科技学院五年一贯制专转本计算机应用基础考试大纲

金陵科技学院五年一贯制专转本计算机应用基础考试大纲 一、参考书目&#xff1a; 《大学计算机信息技术教程》&#xff0c;张福炎&#xff0c;孙志挥&#xff0c;南京大学出版社&#xff0c;《全国计算机等级考试一级教程计算机基础及MS Office应用》&#xff0c;教育部考试中…