开启Three.js之旅(会持续完善)

文章目录

  • Three.js必备
    • 构建项目
    • 场景Scene
    • 相机Camera
      • PerspectiveCamera
    • 渲染器
      • WebGLRenderer
      • CSS3DRenderer
    • 灯光
      • Light
      • AmbientLight
      • DirectionalLight 平行光
      • PointLight
    • 加载器
      • Cache
      • FileLoader
      • Loader
      • GLTFLoader
      • RGBELoader
      • TextureLoader
    • 材质
      • Metarial
      • MeshBasicMaterial
      • MeshLambertMaterial
      • MeshPhysicalMaterial
      • MeshStandardMaterial
      • SpriteMaterial
    • 控制
      • OrbitControls
    • 几何体
      • BoxGeometry
    • 物体
      • Mesh 网格
    • 常量
      • Texture
    • 动画系统
    • 推荐参考文章
    • 矩阵变换
  • 解决方案
    • 给模型绑定click函数
    • 鼠标放模型上变小手
  • 优化方案
    • 优化模型体积之神 -- DRACOLoader

Three.js必备

官方文档

推荐文档

官方在线编辑平台

推荐免费的素材网站

官网一些说法用词对于刚接触的我有些晦涩,下面的我会追加自己的理解,欢迎来指正讨论。

构建项目

可以结合多种框架构建,也可以结合TS

首先我们先清楚一下主逻辑(我下面写的都是实例)

Camera
renderer.render(scene,camera)
Scene
renderer
appendChild(renderer.domElement)

场景Scene

场景我们可以就是理解为场景,我们可以往里面加入很多东西
就像一间屋子的场景,我们可以往里面加桌子椅子一样

THREE.Scene()是一个构造函数,返回一个实例scene

属性

  • background

    若不为空,在渲染场景的时候将其设置为背景,且背景总是首先被渲染的。

  • environment

    若该值不为null,则该纹理贴图将会被设为场景中所有物理材质的环境贴图(然而,该属性不能够覆盖已存在的、已分配给MeshStandardMaterial.envMap的贴图)

    关于这个是整个场景的环境,我可以把整个场景置地于室内,也可以置地于蓝蓝的天空之下

相机Camera

PerspectiveCamera

用来模拟人眼看到景象,也是用的最多的一种相机

const camera = new THREE.PerspectiveCameraPerspectiveCamera( fov : Number, aspect : Number, near : Number, far : Number );

参数说明

  1. fov 相机锥体垂直视野角度
  2. aspect 视锥体长宽比
  3. near 视锥体近端面
  4. far 远端面(后面我增加一个图来说明情况)

属性

  1. zoom 缩放倍数 默认值为1

渲染器

WebGLRenderer

使用WebGL渲染你的场景

WebGLRenderer是构造器

构造器生成的实例, 需要挂在到对应的元素上

  • antialias 抗锯齿

  • setSize(width:Number, height:Number, updateStyle:Boolean)

    视口从(0,0)开始调整为适合大小,updateStyle 对canvas的样式做出改变

最终步骤都是加入到对应的元素

document.getElementById("container").appendChild('renderer');

CSS3DRenderer

也叫做css 3D渲染器

通过css3的transform属性,将层级的3D变换应用到DOM元素上。

限制:

  • 不能使用three.js的材质系统
  • 不能使用几何体

CSS3DRenderer仅仅关注普通的DOM元素(因为毕竟是css)

CSS3Renderer()是一个构造函数,返回一个实例

方法:

  • getSize()
  • setSize() 调整尺寸

最终步骤都是加入到对应的元素

document.getElementById("container").appendChild('cssrenderer.domElement');

灯光

现实中物体表面的明暗是受光的影响的。

在three.js中,用Mesh网格模型来模拟现实中的物体

AmbientLight环境光
Light
PointLight点光源
SpotLight聚光灯
Direction平行光
Mesh
漫反射MeshLamberMaterial
高光MeshPhongMaterial
物理MeshStandardMaterial、MeshPhysicalMaterial
不受影响MeshBasicMaterial

Light

光源的基类

Properties

  • color
  • intensity – 光照强度

Methods

  • dispose – 释放由该实例分配的GPU资源
  • copy
  • toJSON

AmbientLight

环境光会均匀的照亮场景中的所有物体。不能用来做投射阴影,因为没有方向。

构造函数

  • color
  • intensity – 光照强度

Properties

  • isAmbientLight

demo

const light = new THREE.AmbientLight( 0x404040 , 1);
scene.add( light );

DirectionalLight 平行光

平行光是沿着特定方向发射的光,常常用来模拟太阳光的效果

构造函数

  • color 可选
  • intensity 强度

demo

const directionalLight = new THREE.DirectionalLight( 0xffffff, 0.5);
scene.add( directionalLight );

PointLight

点光源

demo

const pointLight = new THREE.PointLight(0xffffff, 1.0);  // 光源颜色, 光照强度

Properties

  • decay – 光源衰减 0.0不衰减,默认2.0
  • position
    • set(x, y, z) – 设定位置

加载器

关于加载器

值得我们注意的是加载文件路径的问题

以Vue为例,应该是静态目录下public存放我们的模型, 无论你在哪一级,three都会从这个目录下拿资源, ./对应的文件就可以了(不要用相对位置去拿资源或者其它)

Cache

也是很少直接使用,一般直接配置就可以

THREE.Cache.enabled = true   // 全局生效,要在所有FileLoader的加载器上启用缓存

其大致意思就是,当 THREE.Cache.enabled 设置为 true 时,Three.js 会启用缓存机制,它会自动缓存加载的纹理、模型等资源数据。这可以提高性能和加载速度,因为在后续使用相同资源时,可以直接从缓存中获取,而不需要重新加载。

THREE.Cache.enabled 设置为 false 时,缓存机制将被禁用,每次加载资源时都会重新加载。

默认为false

Methods

  • add(key, file)
  • get(key)
  • remove(key)
  • clear() – 清除缓存中所有的值

一个简单的缓存系统,内部使用FileLoader。

FileLoader

一般很少直接使用,直接使用更加高级的加载器,其会被大多数加载器内部使用

使用XMLHttpRequest来加载资源的低级类,并由大多数加载器内部使用。 它也可以直接用于加载任何没有对应加载器的文件类型。

demo

Methods

Loader

用于实现加载器的基类

Properties

  • path – 加载资源的基本路径
  • crossOrigin – 允许CROS的其他域加载url。默认为anonymous

Methods

  • load() – 要看具体的加载器的用法
  • loadAsync

GLTFLoader

GLTF,用于更高效地传输、加载3D内容。该文件以JSON(.gltf)格式或者二进制(.glb)格式提供。

一个glTF组件可传输一个或多个场景, 包括网格、材质、贴图、蒙皮、骨架、变形目标、动画、灯光以及摄像机

RGBELoader

用来加载高动态范围(HDR)环境贴图。

HDR环境贴图以.hdr格式存储,表示更广泛的亮度范围

TextureLoader

加载texture的一个类。 内部使用ImageLoader来加载文件。

demo

// 立即使用纹理进行材质创建
const texture = new THREE.TextureLoader().load('textures/land_ocean_ice_cloud_2048.jpg' );
const material = new THREE.MeshBasicMaterial( { map: texture } );

TextureLoader

加载texture的一个类。 内部使用ImageLoader来加载文件

我们可以用它来加载图片,去做纹理

const texture = new THREE.TextureLoader().load( 'textures/land_ocean_ice_cloud_2048.jpg' );

创建材料时可以用到这个纹理

const material = new THREE.MeshBasicMaterial( { map: texture } );

就是一个可以把图片加工成纹理,可以生成material使用

Methods

  • load( url, onLoad, onProgress, onError )

    url – 文件路径

    onLoadonProgressonError – 字如其意,Function

材质

顾名思义就是材质的意思

Metarial

材质的抽象基类

就只是材质,与渲染器无关

Constructor

Properities

Methods

  • clone – 返回相同的材质
  • copy – copy材质

MeshBasicMaterial

基础网格材质,不会受到光照(light)的影响

MeshLambertMaterial

对于光照(light)会有漫反射的效果

漫反射是投射在粗糙表面上的光向各个方向反射的现象。当一束平行的入射光线射到粗糙的表面时,由于各点的法线方向不一致,反射光线会向不同的方向无规则地反射,这种反射称为“漫反射”或“漫射”。

MeshPhysicalMaterial

MeshStandardMaterial

基于物理的渲染(PBR), 在实践中,该材质提供了比MeshLambertMaterial 或MeshPhongMaterial 更精确和逼真的结果,代价是计算成本更高。

这个应该是材质中最逼真的,最好看的(个人认为),能够写出金属光泽

Properties

  • alphaMap – 贴图是一张灰度纹理,用于控制整个表面的不透明度
  • aoMap
  • aoMapIntensity
  • color – 材质的颜色
  • envMap – 环境贴图
  • fog – 材质是否受雾的影响
  • map – 贴图,可以结合纹理(texture)
  • metalness – 材质与金属的相似度。金属1.0 ~ 非金属0.0
  • roughness – 材质的粗糙程度。 平滑的镜面反射0.0 ~ 完全漫反射1.0

metalness 金属度越高,材料表面会越暗(因为更像金属)

Methods(见Material)

SpriteMaterial

控制

OrbitControls

Orbit controls(轨道控制器)可以使得相机围绕目标进行轨道运动。
OrbitControls本质就是改变相机得参数,比如相机得位置属性,

const controls = new OrbitControls( camera, renderer.domElement );

Evenets

  • change
    – 当摄像机被组件改变时触发
  • start
    – 初始化交互时触发
  • end
    – 当交互结束时触发

Attributes

  • maxDistance 相机最多向外移动多少
  • minDistance 相机最多向内移动多少
  • target
    控制器的焦点,object的轨道围绕它运行,可以更改其焦点

Methods

  • update 更新控制器。必须在摄像机的变换发生任何手动改变后调用

几何体

BoxGeometry

BoxGeometry(width, height, depth, widthSegments, heightSegments, depthSegments)

Params

  1. width
  2. height
  3. depth
  4. widthSegments 可选宽度的分段数
  5. heightSegments 可选深度的分段数
  6. depthSegments 可选的深度的分段数

Properties

物体

Mesh 网格

常量

Texture

纹理常量

动画系统

requestAnimationFrame
利用window.requestAnimationFrame实现渲染

旋转动画

推荐参考文章

矩阵变换

Three.js使用matrix编码3D变换

解决方案

给模型绑定click函数

其实什么函数都可以,判断点击

鼠标放模型上变小手

优化方案

优化模型体积之神 – DRACOLoader

这个优化真的很厉害,模型一般比较大,用这个基本可以优化自身的一半,甚至更多

尽量复用,使用一个DRACOLoader的实例即可

我们来封装一个函数(结合Vue,模型都是glb, 其实这个功能很强大,能优化很多种格式的)

initDracoLoader(){this.dracollLoader = new DRACOLoader();  // 属于拓展,需要显式引入this.dracollLoader.setDecoderPath('./draco/');this.dracollLoader.preload();
}

使用

const loader = new GLTFLoader();
loader.setDRACOLoader(this.dracollLoader)
loader.load(element, (gltf) =>{...
})

有几个需要注意的点:

  1. setDecoderPath(‘/draco/’)的路径,是自定义的。这里需要一个操作就是把对应的文件夹copy到public目录下(其它也可以)

    关键是在threejs包中找到,版本不同,可能文件的位置不同,

image.png

  1. 别忘记了对你原本的glb文件,分别进行处理
gltf-pipeline -i old.glb -o new.glb -d

这个工具需要全局下载

npm install -g gltf-pipeline

推荐文章

Three——glb模型压缩

github-draco

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

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

相关文章

k8s集群资源编排清单文件解读

1、YAML 文件概述 k8s集群中对资源管理和资源对象编排部署都可以通过声明样式(YAML)文件来解决,也就是可以把需要对资源对象操作编辑到 YAML 格式文件中,我们把这种文件叫做资源清单文件,通过 kubectl 命令直接使用资源…

原子的内部结构

原子非常神奇,花时间思考它是非常有价值的。尽管传统的太阳系示意图存在致命的缺点,但我们还是可以局部应用于原子。 首先,原子与太阳系具有相似性一原子的中心质量大,外部质量小。我们用最简单的氢原子做分析,氢原子…

辽宁梵宁教育课程概览:打造职场新人的设计技能利器

随着数字化时代的快速发展,设计技能在职场中的重要性日益凸显。对于职场新人而言,掌握优秀的设计能力不仅有助于个人职业发展,更能为企业创造更多价值。辽宁梵宁教育,作为一所致力于培养职场新人设计技能的培训机构,以…

决策树分类器(保姆级教学) 定义+特性+原理及公式+鸢尾花分类经典问题示例(完整Python代码带详细注释、保姆级分部代码解释及结果说明、决策树可视化及解释)

文章目录 引言定义特性基本原理和公式理解信息增益(ID3算法)熵的定义条件熵信息增益的计算 基尼不纯度(CART算法)基尼不纯度的定义基尼不纯度的计算例子 实现步骤解决鸢尾花分类问题(机器学习入门中的经典案例Python代…

makefile第七讲

更多精彩内容在公众号。 当make执行完后,我们期望将最终的可执行文件安装到系统目录下,这样在不同的目录下都可以执行编译的可执行文件,相当于做成了个命令。这个就需要用到make install。 源文件如下:用于判断系统是小端还是大端…

性能分析与调优

性能分析方法 自底向上:通过监控硬件及操作系统性能指标(cpu、内存、磁盘、网络等硬件资源的性能指标)来分析性能问题(配置、程序问题) 先检查,再下药 自顶向下:通过生成负载来观察被测试的系…

【ROS2笔记七】ROS中的参数通信

7.ROS中的参数通信 文章目录 7.ROS中的参数通信7.1使用CLI工具调整参数7.2参数通信之rclcpp实现7.2.1创建节点7.2.2rclcpp参数API Reference ROS2中的参数是由键值对组成的,参数可以实现动态调整。 7.1使用CLI工具调整参数 启动turtlesim功能包的环境 ros2 run …

如何在本地创建一个贪吃蛇小游戏node.js服务并实现无公网IP远程游玩

文章目录 前言1.安装Node.js环境2.创建node.js服务3. 访问node.js 服务4.内网穿透4.1 安装配置cpolar内网穿透4.2 创建隧道映射本地端口 5.固定公网地址 正文开始前给大家推荐个网站,前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽…

OSPF笔记+大实验

OSPF综合大实验---实验报告 配置IP地址 R1: [R1]int g0/0/0 [R1-GigabitEthernet0/0/0]ip add 172.16.33.1 24 [R1-GigabitEthernet0/0/0]int l0 [R1-LoopBack0]ip add 172.168.34.1 24 R2: [R2]int g0/0/0 [R2-GigabitEthernet0/0/0]ip add 172.16.33.2 24…

Jmeter接口测试:使用教程(下)

🍅 视频学习:文末有免费的配套视频可观看 🍅 关注公众号:互联网杂货铺,回复1 ,免费获取软件测试全套资料,资料在手,涨薪更快 上一篇我给大家讲了jmeter的基本介绍跟参数化和jmeter脚…

【Spring Security系列】Spring Security 过滤器详解与基于JDBC的认证实现

前言 上文说到,Spring Security它是一个强大的和高度可定制的身份验证和访问控制框架。它提供了一套丰富的功能,用于保护基于Spring的应用程序。 上文又说到,在Spring Security中,过滤器(Filter)是一个重…

png静图转换gif动图如何操作?轻松一键快速转换gif动图

想要把多张Png格式图片转换成gif格式动图时要怎么操作?图片常见的有静图和动图,而jpg、png、gif等是最常见的图片格式。想要把png格式图片转换成gif动画还不想下载任何软件的时候就可以使用gif制作工具。不需要下载软件在线就能操作。能够轻轻松松就能快…

北斗卫星系统在海上测量中的创新应用

北斗卫星系统在海上测量中的创新应用 随着全球导航卫星系统技术的飞速发展,北斗卫星系统作为中国自主研发的全球卫星导航系统,在海上测量和导航领域展现出了无可比拟的优势和广阔的应用前景。 一、北斗卫星系统概述 北斗卫星系统是由中国自主研发的全球…

idea中打印日志不会乱码,但是部署到外部tomcat中乱码了。

问题:如图Tomcat乱码,而且启动时的系统日志不会乱码,webapp中的打印日志才乱码。 idea中的情况如下:正常中文展示。 问题分析:网上分析的原因是Tomcat配置的字符集和web应用的字符集不匹配,网上集中的解决…

Unity类银河恶魔城学习记录12-11 P133 Merge Skill Tree with Parry skill源代码

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释,可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili Parry_Skill.cs using UnityEngine; using UnityEngine.UI;public class P…

MySQL进阶 ==> 引擎选择优化指南

数据库引擎的选择: InnoDB InnoDB存储引擎是Mysql的默认存储引擎。InnoDB存储引擎提供了具有提交、回滚、崩溃恢复能力的事务安全。但是对比MyISAM的存储引擎,InnoDB写的处理效率差一些,并且会占用更多的磁盘空间以保留数据和索引。 存储方…

大模型应用实践闭门研讨会即将召开|爱分析活动

随着人工智能领域大模型技术的快速发展,政府出具很多指导性意见,在最新的《2024年政府工作报告》中,明确提出了开展“人工智能”行动,显示出政府对AI大模型发展的高度重视和支持。金融行业在AI大模型领域的政策支持和工作进展都呈…

AMD vs Intel处理器对比:性能、功耗、价格全方位分析

AMD处理器型号通常由一系列字母、数字和符号组成,这些元素共同构成了一个完整、具有特定含义的标识符。下面跟随道合顺一起来理解这些标识符背后的含义。 解读AMD处理器标识符 品牌系列标识 AMD处理器型号的开头通常会包含品牌系列标识,如“Ryzen”、“T…

管理能力学习笔记五:识别团队角色,因才施用

识别团队角色,因才施用,需要做到以下三点 扬长避短 管理者要学会问自己员工能把什么做好,而不是想方设法改造他们的短处 。 – 彼得德鲁克 人岗匹配 将合适的人放在合适的位置 人才多样化 团队需要各式各样的人才,才能高效配合…

Matlab之空间坐标系绘制平面图形

在空间直角坐标系中,绘制指定平面方程的图形 版本说明: 20240413_V1.01:更正代码错误,并修改输入参数类型(测试用例得修改) 20240413_V1.00:初始版本 一、平面方程 基本形式为:A…