Three.js基础内容(一)
目录
一、几何体顶点和模型
1.1、点模型对象(Points)渲染顶点数据
1.2、线模型(Line)渲染顶点数据(画个心)
1.3、网格模型(Mesh)渲染顶点数据(三角形概念)
1.4、构建一个矩形平面几何体
1.5、几何顶点索引数据
1.6、顶点法线数据
1.7、查看three.js自带几何体顶点结构
1.8、BufferGeometry的旋转、缩放、平移方法
二、三维向量和模型属性
2.1、三维向量Vector3与模型位置、缩放属性
2.2、欧拉Euler与角度属性.rotation
2.3、模型材质颜色(Color对象)
2.4、模型材质和几何体属性
2.5、克隆.clone()和复制.copy()
一、几何体顶点和模型
已知:缓冲类型几何体(BufferGeometry)是一个没有任何形状的空几何体,用它定义顶点数据。
1.1、点模型对象(Points)渲染顶点数据
1.2、线模型(Line)渲染顶点数据(画个心)
核心代码:7个点连成一个简约心(对称美)
const vertices = new Float32Array([0, 0, 0, -80, 50, 0, -40, 80, 0, 0, 50, 0, 40,80, 0, 80, 50, 0,0, 0, 0,
]);
// 线模型
const material=new THREE.LineBasicMaterial({color:0xffff00
})
const line=new THREE.Line(geometry,material)
const line=new THREE.LineLoop(geometry,material)//闭合线条,自己连接
const line=new THREE.LineSegments(geometry,material)//非连续线条
export default line
注意:
LineLoop:会把所有点连起来,用它画个心就不需要最后再加点(6个点就可以);
LineSegments:每两个点连成一条线,每根线条之间会断开;
1.3、网格模型(Mesh)渲染顶点数据(三角形概念)
网格模型三角形:正反面
正面:逆时针看
反面:顺时针看
比如下面这个三角形,构成顺序如下图:
此时,正面是逆时针,但是反面是看不到的,因为three.js的材质默认是正面可见,背面不可见。
// 网格模型
const material = new THREE.MeshBasicMaterial({color: 0x00fffff,side: THREE.DoubleSide, //双面可见(DoubleSide);默认正面可见(FrontSide);背面可见(BackSide)
});
const mesh = new THREE.Mesh(geometry, material);
export default mesh;
1.4、构建一个矩形平面几何体
几何体其实就是由不同的三角形构成的,比如矩形就是由两个三角形构成的,从一个方向看,这两个三角形都是逆时针或者顺时针。
如下图:
坐标点共6个,其中有两处是重合的,每个三角形的顶点(按顺序)从正面看都是逆时针。
1.5、几何顶点索引数据
根据1.4的案例,我们可以只写4个顶点,通过4个index构成两个三角形。
const vertices = new Float32Array([0, 0, 0,60, 0, 0,60, 60, 0,0,60, 0,
]);
//属性缓冲对象(BufferAttribute)表示顶点数据
const attribute = new THREE.BufferAttribute(vertices, 3);
geometry.attributes.position = attribute; //设置几何体的顶点位置属性const indexes=new Uint16Array([0,1,2,0,2,3
]);//通过JS的Uint16Array创建顶点索引.index的数据
geometry.index=new THREE.BufferAttribute(indexes,1)
顶点坐标数据是Js的类型化数组Float32Array创建的;
顶点法线数据是Js的类型化数组Float32Array创建的;
顶点索引数据是Js的类型化数组Uint16Array创建的;
1.6、顶点法线数据
法线:垂直于该平面的向量。
因为MeshBasicMaterial不受光照影响,所以上述图形可以正常显示;
但如果使用受光照影响的材质,此时几何体就需要定义顶点法线数据,才能正常显示。
const norlmals=new Float32Array([0, 0, 1,0, 0, 1,0, 0, 1,0, 0, 1,
]);//数量和坐标数量一致
// 定义顶点法线(法向量)数据
geometry.attributes.normal=new THREE.BufferAttribute(norlmals,3)
设置顶点坐标位置:geometry.attributes.position
设置顶点法线位置:geometry.attributes.normal
设置顶点索引位置:geometry.index
1.7、查看three.js自带几何体顶点结构
import * as THREE from "three";
const geometry = new THREE.BoxGeometry(100,100,100); //创建一个长方体
const geometry = new THREE.PlaneGeometry(100,100,2,2); //创建一个矩形平面
const geometry = new THREE.SphereGeometry(50); //创建一个球体console.log(geometry.attributes.position,'.position');
console.log(geometry.index,'.index');// 网格模型
const material = new THREE.MeshBasicMaterial({color: 0x00fffff,wireframe:true
});
const mesh = new THREE.Mesh(geometry, material);
export default mesh;
(1)、材质属性wireframe
线条渲染模式( wireframe:true),查看几何体三角形结构 。
(2)、几何体细分数
以矩形平面为例:2,2的意思就是将它分别从宽度、高度分为两部分,即4个矩形。
1.8、BufferGeometry的旋转、缩放、平移方法
rotate()、scale()、translate()本质上就是改变顶点数据。
geometry.translate(50,0,0); //沿X轴平移50
geometry.center(); //回到原点(即使上面平移了,也会回到原点)
geometry.scale(2,2,2); //沿XYZ三个方向放大2倍
geometry.rotateX(Math.PI/6); //沿X轴旋转30度
二、三维向量和模型属性
已知:Points、Line、Mesh等模型对象的父类都是三维物体(Object3D)。
2.1、三维向量Vector3与模型位置、缩放属性
// 创建一个三维向量对象Vector3
const v3 = new THREE.Vector3(100, 100, 100);
v3.set(50, 50, 50);
console.log(v3.x, "v3.x");mesh.position.set(0, 100, 0);
mesh.position.z = 100;mesh.scale.set(2, 2, 2);
mesh.scale.x = 3;mesh.position.x = 100;
mesh.translateX(100);//沿着X轴正方向平移距离100
//等价于mesh.position=mesh.position+100【相对上一次的位置进行平移变换】const axis = new THREE.Vector3(1, 1, 1); //向量Vector3对象表示方向
axis.normalize(); //转化为单位向量(向量归一化)
console.log(axis, "axis");
mesh.translateOnAxis(axis, 100);//沿着axis轴表示方向平移100
2.2、欧拉Euler与角度属性.rotation
模型的角度属性.rotation和四元数属性.quaternion都是表示模型的角度状态
.rotation的属性值是欧拉对象Euler;.quaternion的属性值是四元数对象Quaternion
const mesh = new THREE.Mesh(geometry, material);const eu = new THREE.Euler(Math.PI / 2, Math.PI, 0);
eu.x = Math.PI;mesh.rotation.y = Math.PI / 8;
// mesh.rotation.y += Math.PI / 8;mesh.rotateZ(Math.PI / 4);//绕着Z轴旋转45度
console.log(eu.x, "eu.x", mesh.rotation, "mesh.rotation");
//================================在index.js旋转
function render() {// model.rotateY(0.01); 原来写法,等价于下面model.rotation.y += 0.01;renderer.render(scene, camera); //一定要更新内容requestAnimationFrame(render); //请求动画帧==实现周期性循环
}
render();
2.3、模型材质颜色(Color对象)
const color = new THREE.Color();
color.r = 0;//等价于material.color.r=0
color.b=0
// color.g=1color.setRGB(0,1,0)//RGB方式
color.setStyle('#0000ff')//前端CSS方式(蓝色)
color.setHex(0x00ff00)//十六进制方式
// setStyle()和setHex()也可以直接用.set("颜色值")console.log(color, "color");
//输出 {isColor: true,b: 0,g: 1,r: 0} 等价于color.setRGB(0,1,0)
material.color = color;//此时颜色为绿色
2.4、模型材质和几何体属性
已知:模型材质的父类是Material
const mesh = new THREE.Mesh(geometry, material);
const mesh1 = new THREE.Mesh(geometry, material);
mesh1.position.x = 100;// 两个mesh共享一个材质,改变一个mesh的颜色,另一个mesh的颜色也会改变
mesh.material.color.set(0xffff00)
export { mesh, mesh1 };//========================在index.js中引入=========================
import { mesh, mesh1 } from "./mesh.js";
const scene = new THREE.Scene();
scene.add(mesh, mesh1);
2.5、克隆.clone()和复制.copy()
const mesh = new THREE.Mesh(geometry, material);
// const mesh1 = new THREE.Mesh(geometry, material);
const mesh1 = mesh.clone(); //等价于上面
mesh1.position.x = 100;// 克隆材质后,改变mesh1的颜色不会改变mesh的颜色
mesh1.material = mesh.material.clone();
mesh1.material.color.set(0xffff00);
// 练习:mesh.position.copy()
mesh.position.copy(mesh1.position); //位置相同
mesh.position.y += 80; //在原来y的基础上增加80
export { mesh, mesh1 };
总结:
1、复制
深度复制:clone() 方法默认进行深度复制,即复制对象的所有子对象(例如,网格的几何体、材料、变换、Vector3等;
浅复制:copy() 方法通常进行浅复制,即只复制对象本身的属性,不复制子对象(例如,变换信息(位置、旋转、缩放)或者材料属性等;
2、性能
因为 clone() 会复制对象及其所有子对象,所以可能会消耗更多的性能和内存;
因为 copy() 只复制对象的属性,所以通常比 clone() 更高效;
3、目标对象
clone() 的对象不会继承原始对象的事件监听器或动画状态;
copy() 需要一个已经存在的目标对象来接收属性。
相关文章:

Three.js基础内容(一)
目录 一、几何体顶点和模型 1.1、点模型对象(Points)渲染顶点数据 1.2、线模型(Line)渲染顶点数据(画个心) 1.3、网格模型(Mesh)渲染顶点数据(三角形概念) 1.4、构建一个矩形平面几何体 1.5、几何顶点索引数据 1.6、顶点法线数据 1.7、查看three…...

网站建设制作需要注意
网站建设制作不仅仅是简单的技术活,更是一个企业或个人在互联网上展示自己形象和实力的重要手段。本文将探讨网站建设制作的重要性、步骤和关键要素。 1. 网站建设的重要性 1.1 品牌形象与宣传 一个精心设计的网站能够突显企业或个人的品牌形象,传递清晰…...

【Python】Uvicorn:Python 异步 ASGI 服务器详解
Uvicorn 是一个为 Python 设计的 ASGI(异步服务器网关接口)Web 服务器。它填补了 Python 在异步框架中缺乏一个最小化低层次服务器/应用接口的空白。Uvicorn 支持 HTTP/1.1 和 WebSockets,是构建现代异步Web应用的强大工具。 ⭕️宇宙起点 &a…...

类型转换【C++提升】(隐式转换、显式转换、自定义转换、转换构造函数、转换运算符重载......你想知道的全都有)
更多精彩内容..... 🎉❤️播主の主页✨😘 Stark、-CSDN博客 本文所在专栏: C系列语法知识_Stark、的博客-CSDN博客 座右铭:梦想是一盏明灯,照亮我们前行的路,无论风雨多大,我们都要坚持不懈。 一…...

微信小程序hbuilderx+uniapp+Android 新农村综合风貌旅游展示平台
目录 项目介绍支持以下技术栈:具体实现截图HBuilderXuniappmysql数据库与主流编程语言java类核心代码部分展示登录的业务流程的顺序是:数据库设计性能分析操作可行性技术可行性系统安全性数据完整性软件测试详细视频演示源码获取方式 项目介绍 小程序端…...

【AI大模型】使用Embedding API
一、使用OpenAI API 目前GPT embedding mode有三种,性能如下所示: 模型每美元页数MTEB得分MIRACL得分text-embedding-3-large9,61554.964.6text-embedding-3-small62,50062.344.0text-embedding-ada-00212,50061.031.4 MTEB得分为embedding model分类…...
面试速通宝典——11
188. 总结static的应用和作用 函数体内static变量的作用范围为该函数体,不同于auto变量,该变量的内存只被分配一次,因此其值在下次调用时仍维持上次的值。在模块内的static全局变量可以被模块内所用函数访问,但不能被模块外其他函…...
python:reportlab 将多个图片合并成一个PDF文件
承上一篇:java:pdfbox 3.0 去除扫描版PDF中文本水印 # 导出扫描版PDF文件中每页的图片文件 java -jar pdfbox-app-3.0.3.jar export:images -prefixtest -i your_book.pdf 导出 Writing image: test-1.jpg Writing image: test-2.jpg Writing image: t…...
决策树:机器学习中的强大工具
什么是决策树? 决策树是一种通过树状结构进行决策的模型。它的每个节点代表一个特征(或属性),每个分支代表特征的可能值,而每个叶子节点则代表最终的决策结果或分类。想象一下,在选择晚餐时,你…...

平面电磁波(解麦克斯韦方程)电场相位是复数的积分常数,电场矢量每个分量都有一个相位。磁场相位和电场一样,这是因为无损介质中实数的波阻抗
注意无源代表你立方程那个点xyzt处没有源,电场磁场也是这个点的。 j电流面密度,电流除以单位面积,ρ电荷体密度,电荷除以单位体积。 j方程组有16个未知数,每个矢量有三个xyz分量,即三个未知数,…...

复习HTML(进阶)
前言 上一篇的最后我介绍了在表单中,上传文件需要使用到 method属性 和enctype属性。本篇博客主要是详细的介绍这些知识 <form action"http://localhost:8080/test" method"post" enctype"multipart/form-data"> method属性…...
Qt 每日面试题 -7
61、如何安全的在另外一个线程中调用QObject对象的接口 QObject被设计成在一个单线程中创建与使用,因此,在一个线程中创建一个对象,而在另外的线程中调用它的函数,这样的行为不能保证工作良好。使用信号槽的队列连接或者QT的反射…...

《计算机原理与系统结构》学习系列——计算机的算数运算(下)
系列文章目录 目录 浮点数的表示和运算浮点数的表示浮点数的规格化浮点数标准IEEE754浮点数表示范围浮点数的转换浮点数的运算浮点数加法浮点数加法的硬件实现 精度浮点乘法浮点运算硬件 MIPS中的浮点指令 浮点数的表示和运算 浮点数的表示 表达非整型的数 可以表达很小和很大…...

二叉树进阶学习——从前序和中序遍历序列构造二叉树
1.题目解析 题目来源:105.从前序与中序遍历序列构造二叉树——力扣 测试用例 2.算法原理 首先要了解一个概念 前序遍历:按照 根节点->左子树->右子树的顺序遍历二叉树 中序遍历:按照 左子树->根节点->右子树的顺序遍历二叉树 题目…...

【数据分享】2000—2023年我国省市县三级逐年植被覆盖度(FVC)数据(Shp/Excel格式)
之前我们分享过2000—2023年逐月植被覆盖度(FVC)栅格数据(可查看之前的文章获悉详情)和Excel和Shp格式的省市县三级逐月FVC数据(可查看之前的文章获悉详情),原始的逐月栅格数据来源于高吉喜学者…...

【Python】Streamlit:为数据科学与机器学习打造的简易应用框架
Streamlit 是一个开源的 Python 库,专为数据科学家和机器学习开发者设计,旨在快速构建数据应用。通过简单的 Python 脚本,开发者无需掌握前端技术,即可将数据分析和模型结果转化为直观、交互式的 Web 应用。其简洁的 API 设计使得…...

OpenJudge | 置换选择排序
总时间限制: 1000ms 内存限制: 65536kB 描述 给定初始整数顺串,以及大小固定并且初始元素已知的二叉最小堆(为完全二叉树或类似完全二叉树,且父元素键值总小于等于任何一个子结点的键值),要求利用堆实现置换选择排序&a…...

如何提取b站的视频字幕,下载视频
打开视频地址 按F12打开—开发者工具 在开发者工具打开Network 过滤器关键字: 自动生成字幕:ai_subtitle 自制:json 打开/关闭字幕 刷新页面 找到字幕 点选字幕的respond 将方框中的内容复制; 复制到:https://www.drea…...

Vue中使用ECharts实现热力图的详细教程
在数据可视化领域,热力图是一种非常直观的表现形式,它通过颜色深浅来展示数据分布情况。在Vue项目中,我们可以使用ECharts这一强大的图表库来实现热力图。下面我将详细介绍如何在Vue中使用ECharts实现热力图。效果如下图: 一、准备…...

Arduino UNO R3自学笔记13 之 Arduino使用LM35如何测量温度?
注意:学习和写作过程中,部分资料搜集于互联网,如有侵权请联系删除。 前言:学习使用传感器测温。 1.LM35介绍 一般来讲当知道需求,就可以 通过既定要求的条件来筛选需要的器件,多方面的因素最终选定了器件…...
uniapp 对接腾讯云IM群组成员管理(增删改查)
UniApp 实战:腾讯云IM群组成员管理(增删改查) 一、前言 在社交类App开发中,群组成员管理是核心功能之一。本文将基于UniApp框架,结合腾讯云IM SDK,详细讲解如何实现群组成员的增删改查全流程。 权限校验…...

网络六边形受到攻击
大家读完觉得有帮助记得关注和点赞!!! 抽象 现代智能交通系统 (ITS) 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 (…...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)
CSI-2 协议详细解析 (一) 1. CSI-2层定义(CSI-2 Layer Definitions) 分层结构 :CSI-2协议分为6层: 物理层(PHY Layer) : 定义电气特性、时钟机制和传输介质(导线&#…...
解锁数据库简洁之道:FastAPI与SQLModel实战指南
在构建现代Web应用程序时,与数据库的交互无疑是核心环节。虽然传统的数据库操作方式(如直接编写SQL语句与psycopg2交互)赋予了我们精细的控制权,但在面对日益复杂的业务逻辑和快速迭代的需求时,这种方式的开发效率和可…...
Linux简单的操作
ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...

Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具
文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...

多种风格导航菜单 HTML 实现(附源码)
下面我将为您展示 6 种不同风格的导航菜单实现,每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...

搭建DNS域名解析服务器(正向解析资源文件)
正向解析资源文件 1)准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2)服务端安装软件:bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...
Python+ZeroMQ实战:智能车辆状态监控与模拟模式自动切换
目录 关键点 技术实现1 技术实现2 摘要: 本文将介绍如何利用Python和ZeroMQ消息队列构建一个智能车辆状态监控系统。系统能够根据时间策略自动切换驾驶模式(自动驾驶、人工驾驶、远程驾驶、主动安全),并通过实时消息推送更新车…...
BLEU评分:机器翻译质量评估的黄金标准
BLEU评分:机器翻译质量评估的黄金标准 1. 引言 在自然语言处理(NLP)领域,衡量一个机器翻译模型的性能至关重要。BLEU (Bilingual Evaluation Understudy) 作为一种自动化评估指标,自2002年由IBM的Kishore Papineni等人提出以来,…...