开启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.mfbz.cn/a/557592.html

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

相关文章

【C++程序员的自我修炼】拷贝构造函数

心存希冀 追光而遇目有繁星 沐光而行 目录 拷贝构造函数概念 拷贝构造的特征 无穷递归的解释 浅拷贝 总结: 深拷贝 拷贝构造函数典型调用场景 总结 契子✨ 在生活中总有很多琐事,不做不行做了又怕麻烦,有时候想要是有个和自己一模一样的人就…

机器学习和深度学习-- 李宏毅(笔记于个人理解)Day 21

Day 21 Self- Attention 选修部分 ​ 学完自适应 再回来看看 Sequence Labling 假如我们现在有一个需要读完全部句子才能解的问题, 那么red window 就需要变得是最大的(最长的句子); 其实这里大家有没有想过,这个玩意…

【机器学习】数据变换---小波变换特征提取及应用案列介绍

引言 在机器学习领域,数据变换是一种常见且重要的预处理步骤。通过对原始数据进行变换,我们可以提取出更有意义的特征,提高模型的性能。在众多数据变换方法中,小波变换是一种非常有效的方法,尤其适用于处理非平稳信号和…

maridb双数据源联查解决方案:联合存储引擎(Federated Storage Engine)

本地MySQL数据库要访问远程MySQL数据库的表中的数据, 必须通过FEDERATED存储引擎来实现. 有点类似Oracle中的数据库链接(DBLINK)。使用FEDERATED存储引擎的表,本地只存储表的结构信息,数据都存放在远程数据库上,查询时通过建表时指定的连接符去获取远程库的数据返回到本地。操作…

爬虫机试题-爬取新闻网站

之前投简历时遇到了这样的一个笔试。本以为会是数据结构算法之类的没想到直接发了一个word直接提需求,感觉挺有意思就写了这篇文章,感兴趣的朋友可以看看。 拿到urllist 通过分析页面结构我们得以知道,这个页面本身没有新闻信息,是…

计算机软考流程介绍

笔者来介绍一下软考流程 1、考试简介 计算机技术与软件专业技术资格(水平)考试:简称 计算机软考 认证: 国家人力资源和社会保障部 国家工业和信息化部 目的: 科学、公正地对全国计算机与软件专业技术人员进行职业资格…

Hotcoin 热门资产上新速报:以太坊互操作性基础设施Omni Network(OMNI)

Hotcoin持续为全球600万用户发掘优质潜力资产,热门币种交易上热币。一文快速了解今日上新资产:Omni Network(OMNI) 推荐指数 8.4 交易对 OMNI/USDT 交易时间 4月17日 GMT8 20:30 资产赛道 Layer1 项目简介 Omni 是以太坊…

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台级联时,下级平台未发流是什么原因?

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快,可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等,以及支持厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安…

黑洞路由、 DDoS 攻击 、 环路

黑洞路由 DDoS 攻击 DDoS 攻击是一种针对服务器、服务或网络的恶意行为。DDoS 攻击通过向目标发送大量流量,使其不堪重负,导致资源和带宽被耗尽。因此,目标可能会变慢或崩溃,无法正常处理合法的流量。DDoS 攻击通常是由僵尸网络…

Jmeter 性能-内存溢出问题定位分析

1、堆内存溢出 ①稳定性压测一段时间后,Jmeter报错,日志报: java.lang.OutOfMemoryError.Java heap space ②用jmap -histo pid命令dump堆内存使用情况,查看堆内存排名前20个对象。 看是否有自己应用程序的方法,从…

CentOS7下安装mysql8或者mysql5.7

mysql8 1、下载 访问mysql官网下载mysql8软件包 https://dev.mysql.com/downloads/mysql/ 选择相应的版本如:RPM Bundle mysql-8.0.33-1.el7.x86_64.rpm-bundle.tar RPM Bundle 8.0.33 下载地址:https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.…

电脑桌面便签软件哪个好?好用的电脑桌面便签

电脑作为我们日常工作的重要工具,承载着大量的任务和项目。当工作任务繁重时,如何在电脑桌面上高效管理这些任务就显得尤为重要。这时,选择一款优秀的桌面便签软件,无疑会给我们带来极大的便利。 一款好的桌面便签软件&#xff0…

【React】Ant Design自定义主题风格及主题切换

Ant Design 的自定义主题,对于刚入手的时候感觉真是一脸蒙圈,那今天给它梳理倒腾下; 1、自定义主题要点 整体样式变化,主要两个部分: 1.1、Design Token https://ant.design/docs/react/customize-theme-cn#theme 官…

ffmpeg入门

ffmpeg入——安装 Fmpeg地址 FFmpeg源码地址:https://github.com/FFmpeg/FFmpeg FFmpeg可执行文件地址:https://ffmpeg.org/download.html Windows平台 Windows平台下载解压后如图所示(文件名称以-share结尾的是开发库) FFmpeg…

Eagle for Mac v1.9.13注册版:强大的图片管理工具

Eagle for Mac是一款专为Mac用户设计的图片管理工具,旨在帮助用户更高效、有序地管理和查找图片资源。 Eagle for Mac v1.9.13注册版下载 Eagle支持多种图片格式,包括JPG、PNG、GIF、SVG、PSD、AI等,无论是矢量图还是位图,都能以清…

AndroidStudio AGP 7+, 编译aar并输出到本地仓库

1 编写构建gradle脚本代码 1.1 配置publication和repository 在指定moudle目录下新建名为"maven-publish.gradle"文件,其声明的publication和repository如下所示: apply plugin: maven-publish// This creates a task called publishReleas…

《星光对话》系列直播:带你入门数据要素

2020年12月9日,财政部提出企业数据资源可作为资产列入财务报表,打响数据要素“1N”的第一枪; 2022年12月2日,《关于构建数据基础制度更好发挥数据要素作用的意见》“数据二十条”通过提出构建数据产权、流通交易、收益分配、安全治…

维护SQLite的私有分支(二十六)

返回:SQLite—系列文章目录 上一篇:SQLite、MySQL 和 PostgreSQL 数据库速度比较(本文阐述时间很早比较,不具有最新参考性)(二十五) 下一篇:SQLite数据库中JSON 函数和运算符 1…

# 从浅入深 学习 SpringCloud 微服务架构(三)注册中心 Eureka(1)

从浅入深 学习 SpringCloud 微服务架构(三)注册中心 Eureka(1) 段子手168 1、微服务的注册中心 注册中心可以说是微服务架构中的”通讯录”,它记录了服务和服务地址的映射关系。 在分布式架构中服务会注册到这里&am…

美易官方:美债美元黄金继续涨?

全球金融市场波动加剧,投资者对避险资产的需求不断升温。在这一背景下,“投行老将”们纷纷发表观点,认为避险情绪尚未结束,美债、美元和黄金等避险资产有望继续上涨。 巴克莱一位资深投资银行家表示,由于担心中东冲突升…
最新文章