threejs官方demo解析(一)

官网效果图:

在这里插入图片描述
demo代码及我添加的注释

<!DOCTYPE html>
<html lang="en">
	<head>
		<title>three.js webgl - animation - keyframes</title>
		<meta charset="utf-8">
		<meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
		<link type="text/css" rel="stylesheet" href="main.css">
		<style>
			body {
				background-color: #bfe3dd;
				color: #000;
			}

			a {
				color: #2983ff;
			}
		</style>
	</head>

	<body>

		<div id="container"></div>

		<div id="info">
			<a href="https://threejs.org" target="_blank" rel="noopener">three.js</a> webgl - animation - keyframes<br/>
			Model: <a href="https://artstation.com/artwork/1AGwX" target="_blank" rel="noopener">Littlest Tokyo</a> by
			<a href="https://artstation.com/glenatron" target="_blank" rel="noopener">Glen Fox</a>, CC Attribution.
		</div>

		<script type="importmap">
			{
				"imports": {
					"three": "../build/three.module.js",
					"three/addons/": "./jsm/"
				}
			}
		</script>

		<script type="module">

			import * as THREE from 'three';

			import Stats from 'three/addons/libs/stats.module.js'; //性能监视器

			import { OrbitControls } from 'three/addons/controls/OrbitControls.js'; //控制控制器,控制旋转
			import { RoomEnvironment } from 'three/addons/environments/RoomEnvironment.js'; //用于创建逼真的室内环境,它接受一个参数 path,用于指定立方体贴图的路径。典型的用法是加载预先准备好的立方体贴图,然后将其作为参数传递给 RoomEnvironment

			import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'; //加载gltf模型的加载器
			import { DRACOLoader } from 'three/addons/loaders/DRACOLoader.js';//模型解压

			let mixer;

			const clock = new THREE.Clock();  //初始化时钟
			const container = document.getElementById( 'container' );

			const stats = new Stats();
			container.appendChild( stats.dom ); //左上角的性能监视器

			const renderer = new THREE.WebGLRenderer( { antialias: true } );  //antialias:锯齿属性
			renderer.setPixelRatio( window.devicePixelRatio );  //设置像素比,如果你遇到你的canvas画布输出模糊问题一定要设置
			renderer.setSize( window.innerWidth, window.innerHeight );
			container.appendChild( renderer.domElement );

			const pmremGenerator = new THREE.PMREMGenerator( renderer ); //预处理环境,HDR 纹理以获得最佳质量

			const scene = new THREE.Scene();
			scene.background = new THREE.Color( 0xbfe3dd );
			scene.environment = pmremGenerator.fromScene( new RoomEnvironment( renderer ), 0.04 ).texture;  //光源

			const camera = new THREE.PerspectiveCamera( 40, window.innerWidth / window.innerHeight, 1, 100 ); //透视投影相机,如果渲染远小近大--透视投影相机,不需要远小近大--正投影相机
			camera.position.set( 5, 2, 8 );  //0,0,0将是模型的几何中心,通过调整参数可以调整我们第一次看到的位置


			// 注意相机控件OrbitControls会影响lookAt设置,注意手动设置OrbitControls的目标参数
			const controls = new OrbitControls( camera, renderer.domElement );
			controls.target.set( 0, 0.5, 0 ); //相机控件.target属性在OrbitControls.js内部表示相机目标观察点,默认0,0,0
			controls.update();update()函数内会执行camera.lookAt(controls.targe)
			controls.enablePan = false;
			controls.enableDamping = true;

			const dracoLoader = new DRACOLoader();
			dracoLoader.setDecoderPath( 'jsm/libs/draco/gltf/' );  //设置draco路径

			const loader = new GLTFLoader();
			loader.setDRACOLoader( dracoLoader );  //设置gltf加载器draco编码器
			loader.load( 'models/gltf/LittlestTokyo.glb', function ( gltf ) {//加载模型

				// const obj = gltf.scene.getObjectByName("OSG_Scene");  //可以获取某个名字的模型节点
				// console.log(gltf.scene,obj,'加载的模型数据')

				// 递归遍历所有模型节点
				// gltf.scene.traverse(function(obj) {
				// 	if (obj.isMesh) {//判断是否是网格模型
				// 		console.log('模型节点',obj);
				// 		console.log('模型节点名字',obj.name);
				// 	}
				// });
				
				// 递归遍历所有模型节点批量修改材质
				// gltf.scene.traverse(function(obj) {
				// 	if (obj.isMesh) {
				// 		// 重新设置材质
				// 		obj.material = new THREE.MeshLambertMaterial({
				// 			color:0xffffff,
				// 		});
				// 	}
				// });

				const model = gltf.scene;
				model.position.set( 1, 1, 0 );
				model.scale.set( 0.01, 0.01, 0.01 );
				scene.add( model );

				mixer = new THREE.AnimationMixer( model );  包含关键帧动画的模型对象作为AnimationMixer的参数创建一个播放器mixer
				let clipAction = mixer.clipAction( gltf.animations[ 0 ] )
				clipAction.play();  创建动画clipAction对象  并播放动画


				// 人走路、跑步美术美术一般设置很短时间运动,如果你想一直看到运动动作,不用设置非循环。
				// 				//不循环播放
				// clipAction.loop = THREE.LoopOnce; 
				// // 物体状态停留在动画结束的时候
				// clipAction.clampWhenFinished = true

				animate();

			}, undefined, function ( e ) {

				console.error( e );

			} );


			window.onresize = function () {  //更改浏览器大小自适应

				camera.aspect = window.innerWidth / window.innerHeight;
				camera.updateProjectionMatrix();

				renderer.setSize( window.innerWidth, window.innerHeight );

			};


			function animate() {

				requestAnimationFrame( animate );

				const delta = clock.getDelta();  //自动开启时钟, 获取2帧之间的时间间隔

				mixer.update( delta ); 更新播放器相关的时间

				controls.update(); update()函数内会执行camera.lookAt(controls.target)

				stats.update();//requestAnimationFrame循环调用的函数中调用方法update(),来刷新时间

				renderer.render( scene, camera );

			}


		</script>

	</body>

</html>

备注:我们在官网能看到车车的动画,其实是模型中有关键帧动画,在threejs引入后使用AnimationMixer播放器进行播放的。
demo中车车是循环走的,我们要是遇到只动画一次的情况,可以设置

		//不循环播放
		lipAction.loop = THREE.LoopOnce; 
		// // 物体状态停留在动画结束的时候
		 clipAction.clampWhenFinished = true

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Apache HTTPD 换行解析漏洞(CVE-2017-15715)详解

Apache HTTPD 换行解析漏洞&#xff08;CVE-2017-15715&#xff09; 1.cd到CVE-2017-15715 cd vulhub/httpd/CVE-2017-15715 2.运行docker-compose build docker-compose build 3.运行docker-compose up -d 4.查看docker-compose ps 5.访问 出现这个表示安装成功 6.漏洞复现…

【代码随想录】刷题笔记Day45

前言 早上又赖了会床......早睡早起是奢望了现在&#xff0c;新一年不能这样&#xff01;支棱起来&#xff01; 377. 组合总和 Ⅳ - 力扣&#xff08;LeetCode&#xff09; 这一题用的就是完全背包排列数的遍历顺序&#xff1a;先背包再物品&#xff0c;从前往后求的也是有几…

CMake入门教程【核心篇】查找包(find_package)

&#x1f608;「CSDN主页」&#xff1a;传送门 &#x1f608;「Bilibil首页」&#xff1a;传送门 &#x1f608;「本文的内容」&#xff1a;CMake入门教程 &#x1f608;「动动你的小手」&#xff1a;点赞&#x1f44d;收藏⭐️评论&#x1f4dd; 文章目录 1.使用方法1.1基本用…

【数据库原理】(7)关系数据库的完整性约束

关系模型的完整性规则是为了确保数据的唯一性和数据之间的关系的准确性。 有三类完整性约束:实体完整性、参照完整性和用户定义完整性。 其中实体完整性和参照完整性是必须满足的完整性约束条件,应该由关系系统自动支持。 实体完整性 实体完整性的核心概念 唯一性&#xf…

【目标检测实验系列】YOLOv5模型改进:融合混合注意力机制CBAM,关注通道和空间特征,助力模型高效涨点!(内含源代码,超详细改进代码流程)

自我介绍&#xff1a;本人硕士期间全程放养&#xff0c;目前成果:一篇北大核心CSCD录用,两篇中科院三区已见刊&#xff0c;一篇中科院四区在投。如何找创新点&#xff0c;如何放养过程厚积薄发&#xff0c;如何写中英论文&#xff0c;找期刊等等。本人后续会以自己实战经验详细…

ElasticSearch自定义算分排序(Function Score Query)

使用 function score query&#xff0c;可以修改文档的相关性算分 (query score)&#xff0c;根据新得到的算分排序。 目录 Function Score Query 案例 Function Score Query 几种默认的计算分值的函数&#xff1a; Weight:为每一个文档设置一个简单而不被规范化的权重Fie…

商业综合体能源管理系统功能有哪些?能够为企业带来哪些价值?

随着IT行业的迅猛发展&#xff0c;仅仅实现智能控制已无法满足当前绿色低碳发展的要求&#xff0c;随着智能设备的增多&#xff0c;同时也产生了越来越多的信息孤岛。通过信息技术构建能源管理系统&#xff0c;可以实现先进、智能、经济、可行的商业综合体能源管理解决方案。 …

木工开料机怎么做到减少加工误差的?

在板式家具生产加工中使用木工开料机加工&#xff0c;不仅仅可以提升板材的加工精度&#xff0c;还可以减少板材加工误差&#xff0c;减少板材浪费&#xff0c;所以整个开料环节非常的重要&#xff0c;所以在选择设备的时候一定要谨慎&#xff0c;选择质量可靠的设备。 木工开料…

ssm基于web的网络游戏交易平台信息管理系统的设计与实现论文

摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装网络游戏交易平台软件来发挥其高效地信息处理的作用&#x…

HTML5+CSS3+Vue小实例:彩色圆环溶解加载动画

实例:彩色圆环溶解加载动画 技术栈:HTML+CSS+Vue.js 效果: 源码: 【HTML】 <!DOCTYPE html> <html lang="zh-CN"> <head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge&…

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之线性布局容器Column组件

鸿蒙&#xff08;HarmonyOS&#xff09;项目方舟框架&#xff08;ArkUI&#xff09;之线性布局容器Column组件 一、操作环境 操作系统: Windows 10 专业版、IDE:DevEco Studio 3.1、SDK:HarmonyOS 3.1 二、Column组件 沿垂直方向布局的容器。 子组件 可以包含子组件。 接…

力扣hot100 二叉树的右视图 递归

&#x1f468;‍&#x1f3eb; 题目地址 时间复杂度&#xff1a; O ( n ) O(n) O(n) &#x1f60b; AC code /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(…

计算机毕业设计------SSM邮件收发管理系统

项目介绍 本项目为基于SSM的邮件收发管理系统&#xff1b; 用户角色包含以下功能&#xff1a; 用户登录,写信给好友,查看收件箱,查看已发送的邮件,草稿箱查看,通讯录设置,个人资料管理等功能。 环境需要 1.运行环境&#xff1a;最好是java jdk 1.8&#xff0c;我们在这个平…

Golang-strconv库学习笔记

前言&#xff1a; strconv库是go官方提供的一个标准包&#xff0c;主要用于字符串相关的处理。通过参考官方文档、中文文档和其他工具&#xff0c;进行学习记录。学习重点是其中的内置方法。 本文分为Atoi&#xff0c;Format系列&#xff0c;Parse系列&#xff0c;Append系列,…

SparkSQL基础解析(三)

1、 Spark SQL概述 1.1什么是Spark SQL Spark SQL是Spark用来处理结构化数据的一个模块&#xff0c;它提供了2个编程抽象&#xff1a;DataFrame和 DataSet&#xff0c;并且作为分布式SQL查询引擎的作用。 我们已经学习了Hive&#xff0c;它是将Hive SQL转换成MapReduce然后提…

众和策略安全可靠:如何区分大盘股和小盘股?大盘股指数有哪些?

股票根据流转盘能够划分为大盘股、中盘股、小盘股这三大类&#xff0c;那么&#xff0c;怎么区别大盘股和小盘股&#xff1f;大盘股指数有哪些&#xff1f;下面众和策略为我们准备了相关内容&#xff0c;以供参考。 怎么区别大盘股和小盘股&#xff1f; 根据个股的市值来区别…

希亦、觉飞、小吉三款婴儿洗衣机大比拼!全方位对比测评

由于年龄幼小的婴儿的皮肤都非常的幼嫩&#xff0c;因此婴儿衣物材质的类型大部分都是采用为纯棉&#xff0c;并且婴儿的衣物不能够与大人的衣物一起进行混洗&#xff0c;容易把细菌感染到宝宝的衣物上&#xff0c;因此很多家庭为了保证宝宝衣服的有效清洁&#xff0c;避免交叉…

自动化测试用例设计粒度

自动化测试用例的粒度指的是测试用例的细致程度&#xff0c;即每个测试用例检查的功能点的数量和范围。 通常&#xff0c;根据测试用例的粒度&#xff0c;可以被分为3种不同的层次&#xff0c;从更低层次的细粒度到更高层次的粗粒度。 第一种&#xff1a;单元测试 - 细粒度 …

使用IDEA创建使用 JDK8 的 2.x.x 版本的 Spring Boot 项目以及 Spring Boot 项目如何修改JDK版本

目录 一、在阿里云上官网上创建项目 二、将 IDEA 中创建项目的源地址修改为阿里云官网 三、创建 3.x.x 的项目之后修改配置降低至 2.7.x 版本和使用 JDK8&#xff08;修改 Spring Boot 的 JDK 版本同理&#xff09; 从上面的 Spring Boot 官网的截图中可以发现&#xff0c;自…

【算法挨揍日记】day34——647. 回文子串、5. 最长回文子串

647. 回文子串 647. 回文子串 题目描述&#xff1a; 给你一个字符串 s &#xff0c;请你统计并返回这个字符串中 回文子串 的数目。 回文字符串 是正着读和倒过来读一样的字符串。 子字符串 是字符串中的由连续字符组成的一个序列。 具有不同开始位置或结束位置的子串&am…