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

news2024/12/23 20:01:42

文章目录

  • 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.coloradmin.cn/o/1607925.html

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

相关文章

武汉星起航:上海股权中心成功挂牌,创始人张振邦领航跨境新纪元

在金秋十月的尾声,上海股权托管交易中心迎来了一场备受瞩目的盛事。2023年10月30日,武汉星起航电子商务有限公司成功挂牌展示,正式登录资本市场,开启了一段崭新的发展篇章。这一里程碑式的跨越,不仅标志着武汉星起航在…

MySQL基础-----约束详解

目录 一. 概述: 二.约束演示: 三.外键约束: 3.1介绍: 3.2外键约束语法: 3.3删除,更新行为: 一. 概述: 🧐🧐概念:约束是作用于表中字段上的规则,用于限制…

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

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

会话seesion的使用,结合ddddocr识别简单验证码的登录实现。

古诗文网登录代码: # 古诗文网登录实战 # 验证码链接:https://so.gushiwen.cn/RandCode.ashx # 变动参数链接:__VIEWSTATE所在的地址:https://so.gushiwen.cn/user/login.aspx?fromhttp://so.gushiwen.cn/user/collect.aspx # 登录接口链接:https://so.gushiwen.c…

npx\pnpm 镜像过期解决方法

. // 1. 清空缓存 npm cache clean --force // 2. 关闭SSL验证 npm config set strict-ssl false // 3. 安装 到这里就可以正常使用npm命令安装需要的工具了。如( npm install -g cnpm )

代码学习记录48---单调栈

随想录日记part48 t i m e : time: time: 2024.04.19 主要内容:今天开始要学习单调栈的相关知识了,今天的内容主要涉及:503.下一个更大元素II ;42. 接雨水 503.下一个更大元素II 42. 接雨水 Topic1下一个更…

第二部分 Python提高—GUI图形用户界面编程(六)

其他组件学习 文章目录 OptionMenu 选择项Scale 移动滑块颜色选择框文件对话框简单输入对话框通用消息框ttk 子模块控件 OptionMenu 选择项 OptionMenu(选择项)用来做多选一,选中的项在顶部显示。显示效果如下: from tkinter import * root Tk();ro…

电弧的产生机理

目录: 1、起弧机理 2、电弧特点 3、电弧放电特点 4、实际意义 1)电力开关装置 2)保险丝 1、起弧机理 电弧的本质是一种气体放电现象,可以理解为绝缘情况下产生的高强度瞬时电流。起弧效果如下图所示: 在电场的…

5 CatBoost模型

目录 1 背景 2 原理 2.1 类别特征处理 2.1.1 传统目标编码: TS 2.1.2 Greedy TS 2.1.3 ordered TS编码 2.1.4 CatBoost处理Categorical features总结 2.2.预测偏移处理 2.2.1 梯度无偏估计 2.3 树的构建​​​​​​​ 3 优缺点 优点 4 代码 1 背景 终于…

关系图卷积神经网络

异质图和知识图谱 同质图与异质图 同质图指的是图中的节点类型和关系类型都仅有一种 异质图是指图中的节点类型或关系类型多于一种 知识图谱 知识图谱包含实体和实体之间的关系&#xff0c;并以三元组的形式存储&#xff08;<头实体, 关系, 尾实体>&#xff0c;即异…

Three.js——聚光灯、环境光、点光源、平行光、半球光

个人简介 &#x1f440;个人主页&#xff1a; 前端杂货铺 &#x1f64b;‍♂️学习方向&#xff1a; 主攻前端方向&#xff0c;正逐渐往全干发展 &#x1f4c3;个人状态&#xff1a; 研发工程师&#xff0c;现效力于中国工业软件事业 &#x1f680;人生格言&#xff1a; 积跬步…

阿里云服务器怎么更换暴露的IP

很多客户阿里云服务器被攻击IP暴露&#xff0c;又不想迁移数据换服务器&#xff0c;其实阿里云服务器可以更换IP&#xff0c;今天就来和大家说说流程&#xff0c;云服务器创建成功后6小时内可以免费更换公网IP地址三次&#xff0c;超过6小时候就只能通过换绑弹性公网IP的方式来…

探索人工智能绘图的奇妙世界

探索人工智能绘图的奇妙世界 人工智能绘图的基本原理机器之美&#xff1a;AI绘图作品AI绘图对艺术创作的影响未来展望与挑战图书推荐&#x1f449;AI绘画教程&#xff1a;Midjourney使用方法与技巧从入门到精通内容简介获取方式&#x1f449;搜索之道&#xff1a;信息素养与终身…

访问云平台中linux系统图形化界面,登录就出现黑屏的问题解决(ubuntu图形界面)

目录 一、问题-图形化界面访问黑屏 二、系统环境 &#xff08;一&#xff09;网络结构示意图 &#xff08;二&#xff09;内部机器版本 三、分析 四、解决过程 &#xff08;一&#xff09;通过MobaXterm远程访问图形化界面(未成功) 1、连接方法 2、连接结果 &#xf…

【新版】系统架构设计师 - 知识点 - 结构化开发方法

个人总结&#xff0c;仅供参考&#xff0c;欢迎加好友一起讨论 文章目录 架构 - 知识点 - 结构化开发方法结构化开发方法结构化分析结构化设计 数据流图和数据字典模块内聚类型与耦合类型 架构 - 知识点 - 结构化开发方法 结构化开发方法 分析阶段 工具&#xff1a;数据流图、…

VUE项目使用.env配置多种环境以及如何加载环境

第一步&#xff0c;创建多个环境配置文件 Vue CLI 项目默认使用 .env 文件来定义环境变量。你可以通过创建不同的 .env 文件来为不同环境设置不同的环境变量&#xff0c;例如&#xff1a; .env —— 所有模式共用.env.local —— 所有模式共用&#xff0c;但不会被 git 提交&…

算法模板-线段树+懒标记

视频连接&#xff1a;C02【模板】线段树懒标记 Luogu P3372 线段树 1_哔哩哔哩_bilibili 题目链接&#xff1a;P3372 【模板】线段树 1 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) P3374 【模板】树状数组 1 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 算法思路 递…

四大战略合作重磅签署,九章云极DataCanvas公司为全球智算生态注能

4月18日&#xff0c;备受瞩目的“2024九章云极DataCanvas智算操作系统新品发布会”上&#xff0c;九章云极DataCanvas公司携手新华出版社、曙光信息产业股份有限公司&#xff08;简称“中科曙光”&#xff09;、黄山旅游发展股份有限公司&#xff08;简称“黄山旅游”&#xff…

51单片机串口输出问题(第一个字符重复,自动循环输出第一个字符)

遇到的问题描述 51单片机使用串口发送数据时出现只循环发送字符串的第一个字符的情况。就算发送的是第一个字符也有时候一直发送。 串口函数代码 参考串口发送注意 #include <reg52.h> //此文件中定义了单片机的一些特殊功能寄存器void UsartInit() {SCON0X50; /…

在Spring Boot实战中碰到的拦截器与过滤器是什么?

在Spring Boot实战中&#xff0c;拦截器&#xff08;Interceptors&#xff09;和过滤器&#xff08;Filters&#xff09;是两个常用的概念&#xff0c;它们用于在应用程序中实现一些通用的逻辑&#xff0c;如日志记录、权限验证、请求参数处理等。虽然它们都可以用于对请求进行…