当前位置: 首页 > news >正文

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(进阶)

前言 上一篇的最后我介绍了在表单中&#xff0c;上传文件需要使用到 method属性 和enctype属性。本篇博客主要是详细的介绍这些知识 <form action"http://localhost:8080/test" method"post" enctype"multipart/form-data"> method属性…...

Qt 每日面试题 -7

61、如何安全的在另外一个线程中调用QObject对象的接口 QObject被设计成在一个单线程中创建与使用&#xff0c;因此&#xff0c;在一个线程中创建一个对象&#xff0c;而在另外的线程中调用它的函数&#xff0c;这样的行为不能保证工作良好。使用信号槽的队列连接或者QT的反射…...

《计算机原理与系统结构》学习系列——计算机的算数运算(下)

系列文章目录 目录 浮点数的表示和运算浮点数的表示浮点数的规格化浮点数标准IEEE754浮点数表示范围浮点数的转换浮点数的运算浮点数加法浮点数加法的硬件实现 精度浮点乘法浮点运算硬件 MIPS中的浮点指令 浮点数的表示和运算 浮点数的表示 表达非整型的数 可以表达很小和很大…...

二叉树进阶学习——从前序和中序遍历序列构造二叉树

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

【数据分享】2000—2023年我国省市县三级逐年植被覆盖度(FVC)数据(Shp/Excel格式)

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

【Python】Streamlit:为数据科学与机器学习打造的简易应用框架

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

OpenJudge | 置换选择排序

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

如何提取b站的视频字幕,下载视频

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

Vue中使用ECharts实现热力图的详细教程

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

Arduino UNO R3自学笔记13 之 Arduino使用LM35如何测量温度?

注意&#xff1a;学习和写作过程中&#xff0c;部分资料搜集于互联网&#xff0c;如有侵权请联系删除。 前言&#xff1a;学习使用传感器测温。 1.LM35介绍 一般来讲当知道需求&#xff0c;就可以 通过既定要求的条件来筛选需要的器件&#xff0c;多方面的因素最终选定了器件…...

Debian系统简介

目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版&#xff…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂

蛋白质结合剂&#xff08;如抗体、抑制肽&#xff09;在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上&#xff0c;高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术&#xff0c;但这类方法普遍面临资源消耗巨大、研发周期冗长…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容

基于 ​UniApp + WebSocket​实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配​微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

uniapp微信小程序视频实时流+pc端预览方案

方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度​WebSocket图片帧​定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐​RTMP推流​TRTC/即构SDK推流❌ 付费方案 &#xff08;部分有免费额度&#x…...

解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错

出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上&#xff0c;所以报错&#xff0c;到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本&#xff0c;cu、torch、cp 的版本一定要对…...

Docker 本地安装 mysql 数据库

Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker &#xff1b;并安装。 基础操作不再赘述。 打开 macOS 终端&#xff0c;开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...

Mysql中select查询语句的执行过程

目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析&#xff08;Parser&#xff09; 2.4、执行sql 1. 预处理&#xff08;Preprocessor&#xff09; 2. 查询优化器&#xff08;Optimizer&#xff09; 3. 执行器…...

Java数值运算常见陷阱与规避方法

整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...

基于Springboot+Vue的办公管理系统

角色&#xff1a; 管理员、员工 技术&#xff1a; 后端: SpringBoot, Vue2, MySQL, Mybatis-Plus 前端: Vue2, Element-UI, Axios, Echarts, Vue-Router 核心功能&#xff1a; 该办公管理系统是一个综合性的企业内部管理平台&#xff0c;旨在提升企业运营效率和员工管理水…...

STM32---外部32.768K晶振(LSE)无法起振问题

晶振是否起振主要就检查两个1、晶振与MCU是否兼容&#xff1b;2、晶振的负载电容是否匹配 目录 一、判断晶振与MCU是否兼容 二、判断负载电容是否匹配 1. 晶振负载电容&#xff08;CL&#xff09;与匹配电容&#xff08;CL1、CL2&#xff09;的关系 2. 如何选择 CL1 和 CL…...