ThreeJs学习

news2024/11/17 8:48:07

1 基本使用

//1、创建场景
const scene = new THREE.Scene()
//2、创建网格模型
const geometry = new THREE.BoxGeometry(100,100,100)
const matrial = new THREE.MeshLambertMaterial({
	color: #0000ff
})
const mesh = new THREE.Mesh(geometry,matrial)
scene.add(mesh)
//3、添加光照
const point = new THREE.PointLight(0xffffff)
point.position.set(10,20,30)
scene.add(point)

const ambient = new THREE.ambient(0x444444)
scene.add(ambient)

//设置相机
const width = window.innerWidth
const height = window.innerHeight
const aspect = width/height
const s = 20

//参数为左右上下近远
const camera = new THREE.OrthographicCamera(-s*aspect,s*aspect,s,-s,1,1000)
camera.position.set(10,10,10)
camerta.lookAt(camera.position)

//设置渲染器对象
const renderer = new THREE.WebGLRenderer()
renderer.setSize(width.height)
renderer.setClearcolor(0x,fffffff,1)
document.body.appendChild(renderer.domElement)

renderer.renderer(scene,camera)

2 相机轨道控制旋转缩放

const controls = new THREE.OrbitControls(camera,renderer.domElement)
controls.addEventListener('change',render)	//自动监听鼠标键盘事件,更新相机参数

//如果使用requestAnimationFrame调用render函数,则不需要添加监听事件

3 设置材质效果

  • color:材质颜色
  • wireframe:将几何图形渲染为线框
  • opacity:设置透明度
  • transparent:是否开启透明
new THREE.MeshlambertMatrial({
	color: 0xff0000,
	opacity: 0.7,
	transparent: true
})

//也可以以对象方式设置
material.opacity = 0.7

4 添加高光效果

  • ambient:环境色,于与AmbientLight光源一起使用颜色会相乘
  • emissive:材质发射的亚瑟,不受其他光照影响的颜色
  • specular:光亮程度及高光部分颜色
  • shininess:指定高光部分的亮度
new THREE.MeshPhongMaterial({
	color: #ffffff,
	specular: 0x4488ee,
	shininess: 12
})

5 材质类型

  • MeshLambertMaterial:lambert网格材质,与光照有反应,漫反射
  • MeshBasicMaterial:基础网格材质,不受光照影响
  • MeshPhongMaterial:高光phong材质,与光照有反应
  • MeshStandradMaterial:PBR物理材质,可以更好模拟玻璃、金属等效果

6 光照效果

光源类型:

  • AmbientLight:环境光
  • PointLight:点光源
  • DirectionlLight:平行光
  • SpotLight:聚光源

注:如果只使用环境光,整个立方体没有任何棱角感,必须设置具有方向性的点光源和平行光源

7 顶点位置数据解析渲染

//创建顶点数据缓冲区
const geometry= new THREE.BufferGeometry()
//创建顶点坐标
const vertices = new Float32Array([
	0, 0, 0, //顶点1坐标
  	50, 0, 0, //顶点2坐标
  	0, 100, 0, //顶点3坐标
])

const attribute = new THREE.BufferAttribute(vertices,3)
geometry.attributes.position = attribute

const material = new THREE.MeshBasicMaterial({
	color: 0x0000ff,
	side: ThREE.DoubleSide,
})

const mesh = new THREE.Mesh(geometry,material)

8 点模型

const material = new THREE.PointsMaterial({
	color: 0x0000ff,
	size: 10.0,
})
const points = new THREE.Points(geometry,material)

9 线模型

const material = new THREE.LineBasicMaterial({
	color: 0x0000ff,
})
const line = new THREE.Line(geometry,material)

10 顶点颜色数据插值计算

const colors = new Float32Array([
        1, 0, 0, //顶点1颜色
        0, 1, 0, //顶点2颜色
        0, 0, 1, //顶点3颜色

        1, 1, 0, //顶点4颜色
        0, 1, 1, //顶点5颜色
        1, 0, 1, //顶点6颜色
      ]);
geometry.attributes.color = new THREE.BufferAttribute(colors,3)

const material = new THREE.PointsMaterial({
	vertexColor: THREE.VertexColor,
	size: 10.0
})

const points =  new THREE.Points(geometry,material)
scene.add(points)

11 定义顶点法向量

定义顶点法向量后点光源和平行光源会起作用

var normals = new Float32Array([
  0, 0, 1, //顶点1法向量
  0, 0, 1, //顶点2法向量
  0, 0, 1, //顶点3法向量

  0, 1, 0, //顶点4法向量
  0, 1, 0, //顶点5法向量
  0, 1, 0, //顶点6法向量
]);

geometry.attributes.normal = new THREE.BufferAttribute(normals,3)

12 通过顶点索引复用顶点数据

当我们画一个长方形时,需要6个顶点数据,然而其中两个顶点可以复用,因此通过索引来实现复用

const index = new Uint16Array([
	0,1,2,
	0,2,3,
])
geometry.index = new THREE.BufferAttribute(index,1)

13 设置Geometry顶点位置、顶点颜色数据

const geometry = new THREE.Geometry()
const p1 = new THREE.Vector3(50,0,0)
const color1 = new THREE.Color(0x00ff00)
//将顶点数据添加到geometry对象中
geometry.vertices.push(p1)
geometry.colors.push(color1)	//设置顶点颜色属性对Mesh无效

//设置顶点颜色数据时,需要将vertexColor变为THREE.VertexColors
const material = new THREE.MeshLambertMaterial({
	vertexColor: THREE.VertexColors,
	side: DoubleSide,
})

14 Face3定义Geometry的三角形面

设置三角形Face3的颜色对于Mesh模型有效,对于Points、Line无效

var p1 = new THREE.Vector3(0, 0, 0); //顶点1坐标
var p2 = new THREE.Vector3(0, 100, 0); //顶点2坐标
var p3 = new THREE.Vector3(50, 0, 0); //顶点3坐标
var p4 = new THREE.Vector3(0, 0, 100); //顶点4坐标

geometry.vertices.push(p1,p2,p3,p4)

//构建一个三角面
const face1 = new THREE.Face3(0,1,2)
//每个顶点的法向量
var n1 = new THREE.Vector3(0, 0, -1); 
var n2 = new THREE.Vector3(0, 0, -1); 
var n3 = new THREE.Vector3(0, 0, -1); 

face1.vertexNormals.push(n1,n2,n3)

const face2 = new THREE.Face3(0,2,3)
face2.normal = new ThREE.Vector3(0,-1,0)

//设置颜色
face1.color = new THREE.Color(0x00f0f0f)
face1.vertexColors = [
	new THREE.Color(0x00f0f0f),
	new THREE.Color(0x00f0f0f),
	new THREE.Color(0x00f0f0f),
]

geometry.faces.push(face1,face2)

15 访问几何体的数据

BoxGeometryPlaneGeometrySphereGeometry的基类为Geometry

//获取几何体的顶点位置数据
const vertex_position = geometry.vertices
//获取几何体的面数据
const face_data = geometry.faces
//获取几何体的颜色数据
const colors = geometry.colors

BoxBufferGeometryPlaneBufferGeometrySphereBufferGeometry的基类为BufferGeometry

//获取顶点位置
const vertex = geometry.attributes.position
//顶点颜色
const colors = geometry.attributes.color
//顶点法向量
const normal = geometry.attributes.normal
//纹理贴图UV坐标
const uv = geometry.attributes.ub
//顶点索引数据
const index =  geometry.index

16 几何体旋转、缩放、平移

网格模型进行变换不会影响几何体的顶点位置坐标,网格模型旋转缩放平移改变的是模型的本地矩阵、世界矩阵

geometry.scale(2,2,2)
geometry.translate(50,0,0)
geometry.rotateX(Math.PI/4)
geometry.center()

17 常用材质

  • PointsMaterial:点材质
  • LineBasicMaterial:线材质
  • LineDashedMaterial:虚线材质
  • MeshBasicMaterial:基础网格材质,不受带有方向光源影响,没有棱角感
  • MeshLambertMaterial:可以实现网格表面与光源的漫反射光照计算,有棱角感
  • MeshPhongMaterial:高光效果
  • SpriteMaterial:精灵材质

18 材质对应模型对象

  • 点模型:Points
  • 线模型:Line、LineLoop、LineSegments
  • 网格模型:Mesh、SkinnedMesh
  • 精灵模型:Sprite

19 材质共有属性、私有属性

(1)side属性
定义面的渲染方式,可以是前面(THREE.FrontSide)、后面(THREE.BackSide)、双面(THREE.DoubleSide)
(2)材质透明度:opacity、transparent

20 对象克隆和复制

对网格模型的几何体进行缩放时,克隆的网格也会同时改变大小;几何体的克隆或复制为深拷贝

21 光源对象

在这里插入图片描述

  • 环境光源AmbientLight:均匀改变整体物体表面的明暗效果
  • 点光源PointLight:同一平面不同区域呈现出不同的明暗效果
  • 平行光DirectionalLight:需要position和target确定光的方向,无论position在哪,平行光的强度一样
  • 聚光源SpotLight:angle设置发散角度,照射方向通过设置position和target实现

漫反射光的颜色=网格模型材质颜色 x 光线颜色 x 光线入射角余弦值

22 光照阴影计算

  • 模型.castShadow属性:设置一个模型对象是否在光照下产生投影效果
  • receiveShadow:设置一个模型对象是否在光照下接收其他模型的投影效果
  • 光源.castShadow属性:光源是否投射动态阴影
  • 光源.shadow:光源阴影对象
  • LightShadow属性.camera:观察光源的相机对象,设置投影的边界属性
  • LightShadow属性.mapSize:较高的值将提供更好的阴影质量,宽高的值必须为2的幂

23 层级模型

scene作为group的父级,group作为mesh1和mesh2的父级,这样对group做的任何操作都会同样作用在mesh1和mesh2上

const group = new THREE.Group()
group.add(mesh1)
group.add(mesh2)
scene.add(group)

//访问子对象
const child = scene.children || group.children

//移除子对象
group.remove(mesh1.mesh2)
  • 命名:group.name = ‘11’
  • 遍历:group.traverse((obj)=>{})
  • 查找:scene.getObjectById()、scene.getObjecctByName()

24 本地位置坐标、世界位置坐标

  • getWorldPosition:获得世界位置坐标
  • getWorldScale:获得世界缩放系数
  • matrix:本地矩阵
  • matrixWorld:世界矩阵

25 常见几何体和曲线

(1)几何体

  • BoxGeometry:长方体
  • CylinderGeometry:圆柱体
  • SphereGeometry:球体
  • ConeGeometry:圆锥、棱锥

(2)曲线

  • LineCurve:直线
  • ArcCurve:圆弧
  • EllipseCurve:椭圆
  • SplineCurve:样条曲线

26 圆弧线

(1)圆弧线

//参数分别为圆心坐标、圆弧半径、起始角度、是否顺时针绘制
const arc = new THREE.ArcCurve(aX,aY,aRadius,aStartAngle,aEndAngle,aClockwise)

const points = arc.getPoints(50)	//返回51个顶点

(2)setFromPoints方法
Geometry使用该方法可以把数组points中顶点数据提取出来赋值给几何体的顶点位置属性geometry.vertices,BufferGeometry和Geometry一样具有该方法,不过提取顶点后的数据赋值给geometry.attributes.position属性

const geometry = new THREE.Geometry()
const curve = new THREE.

27 轮廓填充

const points = [
	    new THREE.Vector2(-50, -50),
        new THREE.Vector2(-60, 0),
        new THREE.Vector2(0, 50),
        new THREE.Vector2(60, 0),
        new THREE.Vector2(50, -50),
        new THREE.Vector2(-50, -50),
]

const shape = new THREE.Shape(points)

const geometry = new THREE.ShapeGeometry(shape,20)

//生成外接圆
const shape = new THREE.Shape()
shape.absarc(0,0,100,0,2*Math.PI)
const geometry = new THREE.ShapeGeometry(shape,20)

28 二维路径的共有方法

//依靠点生成二维路径
const shape = new THREE.Shape()
const path = new THREE.Path(points)

//移动基点
path.moveTo()
//从currentPosition连线到改点
path.lineTo()
//绘制圆弧
path.arc(x,y,r,startAngle,endAngle,closewise)
//添加到形状的内轮廓中
shape.holes.push(path)

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

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

相关文章

Redis之String类型和Hash类型的介绍和案例应用

一. String类型基础 1.类型介绍 典型的Key-Value集合,如果要存实体,需要序列化成字符串,获取的时候需要反序列化一下。 2. 指令Api说明 ​ 编辑3.常用Api说明 (1).StringSet:写入数据,如果数据已经存在,则覆盖;可以一次性存入1…

B2B电子商务策略[在2022年发展您的业务]

常规的电子商务商店向消费者(B2C 或企业对消费者)销售产品。B2B(企业对企业)电子商务不同于常规电子商务,因为 B2B电子商务的商业模式是让一家企业在线向另一家公司销售产品。 您可能会想:如何向企业销售比…

Windows OpenGL 图像色调

目录 一.OpenGL 图像色调调节 1.原始图片2.效果演示 二.OpenGL 图像色调调节源码下载三.猜你喜欢 零基础 OpenGL ES 学习路线推荐 : OpenGL ES 学习目录 >> OpenGL ES 基础 零基础 OpenGL ES 学习路线推荐 : OpenGL ES 学习目录 >> OpenGL ES 特效 零基础 OpenGL…

Ubuntu 20.04 server永久关闭swap

方法一 编辑/etc/fstab ,sudo vim /etc/fstab,找到如下行 找到/dev/disk/by-uuid/28b306c5-92e4-4180-966d-cdedfbce3a4d /boot ext4 defaults 0 1 修改为如下图,并(/swap.img none swap sw 0 0) 将如下行注释&#…

Yolo算法检测之Anchor Boxes原理详解

刚开始yolo系列的目标检测算法,在一个网格中只能检测一个对象,但是我们在实验中发现,一个网格中很多时候存在不仅一个目标,可能存在多个目标,类似如下图所示,下面中间的网格中就存在人和车辆两个目标的中心…

嵌入式开发学习之--Git管理代码

本章主要介绍一下代码管理,在最后有常用的git指令,可以档资料收藏一下。 文章目录前言一、Github是什么二、Github的简单应用1.新建库 git init2. 添加文件 git add .2. 提交到本地仓库 git commit -m "注释"3. 创建分支 Git checkout -b [分支…

IPython工作原理

IPython工作原理 文章目录IPython是什么?IPython工作原理IPython控制台IPython内核实现一个简单的包装内核代码在IPython内核中的执行流程IPython是什么? Python最有用的功能之一就是它的交互式解释器。交互式编程允许我们非常快速地执行代码片段、测试…

[附源码]计算机毕业设计在线教育系统Springboot程序

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

详解 Intersection Observer API ( 交叉观察器 )

文章目录一、介绍二、兼容性三、内置方法/属性四、使用五、相关链接一、介绍 Intersection Observer API 提供了一种方法可以监听目标元素是否展示到视口(viewport),常见的需求场景: 图片懒加载滚动动画… 上述的需求&#xff…

基于PHP+MySQL医院门诊缴费系统的设计与实现

本医院门诊缴费系统可以说是一个综合性的医院门诊缴费系统,这它包含了挂号管理,医生信息管理,药品信息管理,患者信息管理,住院信息挂了,收费信息管理等多种功能,因而具有一定的实用性。本站是一个B/S模式系统,开发采用了目前流行的PHP技术。系统界面友好,操作简单,比较实用。 本…

浅谈小程序开源业务架构建设之路

一、业务介绍 1.1 小程序开源整体介绍 百度从做智能小程序的第一天开始就打造真正开源开放的生态,我们的愿景是:定义移动时代最佳体验,建设智能小程序行业标准,打破孤岛,共建开源、开放、繁荣的小程序行业生态。百度…

element-ui实现一个动态布局的对话框

前言:在工作中有各种各样的对话框,最多就是填写信息这些的,一般这样的内容都是el-input输入框,el-select选择框等等之内的,这时我们就可以封装成一个组件,想要什么内容就传一个json配置,像其他组…

适合Python初学者阅读的Github开源代码

程序员宝藏库:https://gitee.com/sharetech_lee/CS-Books-Store 你想要的,这里都有! Python作为一门热门的编程语言,在Github上想要找Python项目可以说是「多如牛毛」。 无论是Star数量还是项目数量,都稳居前3名。 项…

5分钟搭建一个粗粒度「视频去重」系统

Jupyter Notebook 教程: How to Build a Video Deduplication System 「视频去重」可以在海量的视频数据中实现侵权片段或者删除掉重复冗余的内容 。随着抖音、快手、Bilibili 等视频平台的兴起和火爆,类似视频这样的非结构化数据在数量上有了极大的增长。 视频平台…

【数据可视化】第四章—— 基于pandas的数据可视化(pandas基本操作)

图形绘制的代码:链接:https://pan.baidu.com/s/1pgS60sry6XDILIhth8bAvA?pwdabcd 提取码:abcd 文章目录1. Pandas库的数据运算1.1 方法形式的运算1.2 比较运算法则1.3 排序2. 基本统计分析函数2.1 基本统计分析函数2.2 累计统计分析函数2.3 …

[附源码]计算机毕业设计JAVA学生量化考核管理系统

[附源码]计算机毕业设计JAVA学生量化考核管理系统 项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM my…

基于PHP+MySQL高校毕业设计管理系统的设计与实现

直以来我国领导人提倡以人为本的治国方案,而大学是未来人才的培养基地,如何能够更好的对高校毕业设计信息进行管理,是很多高校一直在研究的一个问题,只有更加科学的对高校毕业设计信息进行管理,才能够更加积极的培养国家的栋梁之才。 管理员部分功能 1:教师新管理…

第二十二章《记事本》第1节:记事本项目简介

记事本软件能够打开、编辑、保存各种类型的文本文档,也能在文本文档中查找特定的关键字,此外在还能设定文本文档的字体、字号以及风格等。 22.1.1记事本功能简介 记事本软件的运行结果如图22-1所示。 图22-1记事本软件界面 从图21-1可以看到:记事本程序运行开始后,在没有…

OpenFeign动态代理、源码分析

1、OpenFeign概述 OpenFeign 组件的前身是 Netflix Feign 项目,由 Netflix 公司开发。后来 Feign 项目被贡献给了开源组织,随后Feign退出历史舞台。 OpenFeign是Spring Cloud在Feign的基础上支持了SpringMVC的注解,如RequestMapping等等。O…

基于springboot的家装平台设计与实现

项目描述 临近学期结束,还是毕业设计,你还在做java程序网络编程,期末作业,老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下,你想解决的问…