三、Three.js模型对象、材质

一、三维向量Vector3与模型位置

点模型Points、线模型Line、网格网格模型Mesh等模型对象的父类都是Object3D,如果想对这些模型进行旋转、缩放、平移等操作,如何实现,可以查询Threejs文档Object3D对相关属性和方法的介绍

1、三维向量Vector3

三维向量Vector3有xyz三个分量,threejs中会用三维向量Vector3表示很多种数据,本节课提到的比较简单,就是位置.position和缩放.scale属性。

查看three.js文档你可以知道Vector3对象具有属性.x.y.zVector3对象还具有.set()等方法。

const v3 = new THREE.Vector3(100,100,100);
v3.set(50,50,50)
console.log('sad',v3);

2、位置属性.position

// 位置属性.position使用threejs三维向量对象Vector3表示的
console.log('模型位置属性.position的值', mesh.position);

模型位置.position属性用一个三维向量表示,那意味着,以后你想改变位置属性,就应该查询文档Vector3。

这里之所以强调这一点,课程目的不单单是给你介绍具体的知识点,也是在引导你学会查文档,降低记忆压力。

3、改变位置属性

通过模型位置属性.position可以设置模型在场景Scene中的位置。模型位置.position的默认值是THREE.Vector3(0.0,0.0,0.0),表示坐标原点。

设置网格模型y坐标

mesh.position.y = 80;

设置模型xyz坐标

mesh.position.set(80,2,10);

 4、缩放

属性.scale表示模型对象的xyz三个方向上的缩放比例,.scale的属性值是一个三维向量对象Vector3,默认值是THREE.Vector3(1.0,1.0,1.0)

轴方向放大2倍

mesh.scale.x = 2.0;

网格模型xyz方向分别缩放0.5,1.5,2倍

mesh.scale.set(2, 1.5, 2)

 

5、平移

执行.translateX().translateY()等方法本质上改变的都是模型的位置属性.position

网格模型沿着x轴正方向平移100,可以多次执行该语句,每次执行都是相对上一次的位置进行平移变换。

// 等价于mesh.position = mesh.position + 100;
mesh.translateX(100);//沿着x轴正方向平移距离100

沿着Z轴负方向平移距离50。

mesh.translateZ(-50);

 

二、欧拉Euler与角度属性.rotation 

模型的角度属性.rotation和四元数属性.quaternion都是表示模型的角度状态,只是表示方法不同,.rotation属性值是欧拉对象Euler,.quaternion属性值是是四元数对象Quaternion

大家刚入门,就先给大家介绍比较容易理解的角度属性.rotation和对应属性值欧拉对象Euler

 1、欧拉对象Euler

// 创建一个欧拉对象,表示绕着xyz轴分别旋转45度,0度,90度
const Euler = new THREE.Euler( Math.PI/4,0, Math.PI/2);

通过属性设置欧拉对象的三个分量值。

const Euler = new THREE.Euler();
Euler.x = Math.PI/4;
Euler.y = Math.PI/2;
Euler.z = Math.PI/4;

 2、改变角度属性.rotation

角度属性.rotation的值是欧拉对象Euler,意味着你想改变属性.rotation,可以查询文档关于Euler类的介绍。

//绕y轴的角度设置为60度
mesh.rotation.y += Math.PI/4;
//绕y轴的角度增加60度
mesh.rotation.y += Math.PI/4;
//绕y轴的角度减去60度
mesh.rotation.y -= Math.PI/4;

3、旋转方法.rotateX().rotateY().rotateZ() 

 模型执行.rotateX().rotateY()等旋转方法,你会发现改变了模型的角度属性.rotation

mesh.rotateX(Math.PI/4);//绕x轴旋转π/4
// 绕着Y轴旋转90度
mesh.rotateY(Math.PI / 2);
//控制台查看:旋转方法,改变了rotation属性
console.log(mesh.rotation);
cube.rotateX(0.5)
cube.rotateY(0.5)
cube.rotateZ(0.5)

4、旋转动画

function render() {cube.rotation.y += 0.01renderer.render(scene, camera)requestAnimationFrame(render)
}render()
function render() {cube.rotateY(0.01)renderer.render(scene, camera)requestAnimationFrame(render)
}render()

5、绕某个轴旋转

网格模型绕(0,1,0)向量表示的轴旋转π/8

const axis = new THREE.Vector3(0,1,0);//向量axis
mesh.rotateOnAxis(axis,Math.PI/8);//绕axis轴旋转π/8

三、模型材质颜色(Color对象)

你去文档搜索MeshBasicMaterial、MeshLambertMaterial、MeshPhongMaterial等网格材质,可以看到他们都有一个颜色属性.color

下面结合threejs文档,带领大家探索一下,如何通过查询文档来修改模型材质的颜色值.color

1、材质颜色属性.color

如果你想修改材质的颜色属性.color,那么你就需要了解该属性对应属性值的形式。

  1. 查文档,找到.color属性,可以发现threejs材质对象颜色属性.color是threejs的颜色对象Color

  2. console.log()打印:浏览器控制台查看材质颜色属性的属性值

console.log('material.color',material.color);

2、颜色对象Color

查看颜色对象Color文档,可以看到颜色对象有三个属性,分别为.r.g.b,表示颜色RGB的三个分量。

// 创建一个颜色对象
const color = new THREE.Color();//默认是纯白色0xffffff。
console.log('查看颜色对象结构',color);//可以查看rgb的值

3、通过.r.g.b属性改变颜色值 

const color = new THREE.Color();
color.r = 0.5;
console.log('颜色',color);

4、改变颜色的方法

查看Color文档,可以看到Color提供了.setHex().setRGB().setStyle().set()等修改颜色值的方法。

color.setRGB(0,1,0);//RGB方式设置颜色
color.setHex(0x00ff00);//十六进制方式设置颜色
color.setStyle('#00ff00');//前端CSS颜色值设置颜色

.setHex().setStyle()风格的颜色值都可以作为.set()的参数

color.set(0x00ff00);//十六进制方式设置颜色
color.set('#00ff00');//前端CSS颜色值设置颜色

5、重置模型材质的颜色

十六进制颜色

material.color.set(0x00ffff);

前端CSS风格颜色值:'#00ff00'、'rgb(0,255,0)'等形式

material.color.set('#00ff00');
material.color.set('rgb(0,255,0)');

 

四、 模型材质父类Material

1、材质父类Material

查询threejs文档,你可以看到基础网格材质MeshBasicMaterial、漫反射网格材质MeshLambertMaterial、高光网格材质MeshPhongMaterial等网格材质都有一个共同的父类Material

2、网格材质继承父类属性 

从JavaScript语法角度看子类都会继承父类的属性和方法,threejs的材质同样道理。

MeshBasicMaterial、MeshLambertMaterial、MeshPhongMaterial等子类网格材质会从父类Material继承一些属性和方法,比如透明度属性.opacity、面属性.side、是否透明属性.transparent等等。

3、材质半透明设置

material.transparent = true;//开启透明
material.opacity = 0.5;//设置透明度

4、材质面属性.side

你可以用矩形平面PlaneGeometry来测试材质的面属性.side

查看文档,可以知道材质面属性.side默认值是THREE.FrontSide,表示网格模型正面可以看到,THREE.BackSide表示背面可以看到,THREE.DoubleSide表示双面可以看到。

material.side = THREE.BackSide;//背面可以看到
material.side = THREE.DoubleSide;//双面可见

THREE.FrontSideTHREE.BackSideTHREE.DoubleSide其实在theeejs内部都表示一个数字,你可以通过浏览器控制log打印查看验证,具体可以查看src目录下constants.js的源码文件。

console.log('material.side',material.side);

五、模型材质和几何体属性

几何体.geometry和材质属性.material

1、浏览器控制台查看对象和属性

浏览器控制打印模型对象mesh,可以展开对象,查看对象的几何体.geometry和材质属性.material

const mesh = new THREE.Mesh(geometry, material);
console.log('mesh',mesh);

浏览器控制台打印模型的几何体属性.geometry和材质属性.material

console.log('mesh.geometry',mesh.geometry);
console.log('mesh.material',mesh.material);

2、访问改变模型材质属性

const cube = new THREE.Mesh(geometry, material);
//这两种写法等价
cube.material.color.set('blue')
material.color.set('blue')

3、访问改变模型几何体属性

const cube = new THREE.Mesh(geometry, material);
//这两种写法等价
cube.geometry.translate(0, 100, 0)
geometry.translate(0, 100, 0)

4、材质或几何体共享

const mesh = new THREE.Mesh(geometry, material);
const mesh2 = new THREE.Mesh(geometry, material);
mesh2.position.x = 100;
// 两个mesh共享一个材质,改变一个mesh的颜色,另一个mesh2的颜色也会跟着改变
// mesh.material和mesh2.material都指向同一个material
// 三者等价:mesh.material、mesh2.material、material
mesh.material.color.set(0xffff00);
// 三者等价:mesh.geometry、mesh2.geometry、geometry
mesh.geometry.translate(0,100,0);

 六、克隆.clone()和复制.copy()

 克隆.clone()、复制.copy()是threejs很多对象都具有的方法,比如三维向量对象Vector3、网格模型Mesh、几何体、材质。

1、克隆.clone()

克隆.clone()简单说就是复制一个和原对象一样的新对象,下面以三维向量对象Vector3给大家举例,其他的threejs对象都可以参照类似的写法。

const v1 = new THREE.Vector3(1, 2, 3);
console.log('v1',v1);
//v2是一个新的Vector3对象,和v1的.x、.y、.z属性值一样
const v2 = v1.clone();
console.log('v2',v2);

2、复制.copy()

 复制.copy()简单说就是把一个对象属性的属性值赋值给另一个对象,下面以三维向量对象Vector3给大家举例,其他的threejs对象都可以参照类似的写法。

const v1 = new THREE.Vector3(1, 2, 3);
const v3 = new THREE.Vector3(4, 5, 6);
//读取v1.x、v1.y、v1.z的赋值给v3.x、v3.y、v3.z
v3.copy(v1);

3、Mesh克隆.clone()

通过mesh克隆.clone()一个和mesh一样的新模型对象mesh2。

const scene = new THREE.Scene();const geometry = new THREE.BoxGeometry(100, 100, 100);
const material = new THREE.MeshBasicMaterial({color: 'green',
})
const cube = new THREE.Mesh(geometry, material);
const mesh = cube.clone()mesh.position.x = 150
mesh.material.color.set('blue')
scene.add(cube,mesh);

4、几何体和材质克隆.clone()

const mesh2 = mesh.clone();
// 克隆几何体和材质,重新设置mesh2的材质和几何体属性
mesh2.geometry = mesh.geometry.clone();
mesh2.material = mesh.material.clone();
// 改变mesh2颜色,不会改变mesh的颜色
mesh2.material.color.set(0xff0000);

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025.2.16机器学习笔记:TimeGan文献阅读

2025.2.9周报 一、文献阅读题目信息摘要Abstract创新点网络架构一、嵌入函数二、恢复函数三、序列生成器四、序列判别器损失函数 实验结论后续展望 一、文献阅读 题目信息 题目: Time-series Generative Adversarial Networks会议: Neural Information…

【第二节】C++设计模式(创建型模式)-抽象工厂模式

目录 引言 一、抽象工厂模式概述 二、抽象工厂模式的应用 三、抽象工厂模式的适用场景 四、抽象工厂模式的优缺点 五、总结 引言 抽象工厂设计模式是一种创建型设计模式,旨在解决一系列相互依赖对象的创建问题。它与工厂方法模式密切相关,但在应用…

微信小程序:多菜单栏设计效果

一、实现效果 二、代码 wxml 编辑前端界面,步骤 菜单逻辑: 逐步取出数组中的项,首先取出顶部菜单项,然后选中后取出选中的底部数据(左侧菜单+右侧内容),然后点击左侧菜单取出选中的左侧菜单对应的右侧内容 ①这里我的数据是全部封装到一个数组对象的,首先我的循环…

Memcached和redis对比了解

1.介绍 Memcached 是一个高性能、分布式的内存缓存系统,用于加速动态 Web 应用程序,减少数据库负载。它的核心功能是将数据存储在内存中,并通过基于键值对(Key-Value)的方式快速读取数据。 Redis 和 Memcached 选择建…

李沐详解图神经网络(GNN/GCN)

图 顶点可以用向量来表示,边也是,全局信息也是 把image表示成graph 把text表示成graph 一个词和下一个词之间有一条边 分子图 社交网络 空手道俱乐部 引用图(有向) 三大类问题 1.图层面的任务 识别环,对图进行分…

在PyCharm中运行Jupyter Notebook的.ipynb文件及其pycharm软件的基础使用

(注意需使用PyCharm专业版,学生、教师可以申请免费使用:https://www.jetbrains.com/shop/eform/students) 1. pycharm2024版汉化 https://blog.csdn.net/m0_74103046/article/details/144560999 2. pycharm中的python控制台和J…

【算法】----多重背包问题I,II(动态规划)

🌹作者:云小逸 📝个人主页:云小逸的主页 📝Github:云小逸的Github 🤟motto:要敢于一个人默默的面对自己,强大自己才是核心。不要等到什么都没有了,才下定决心去做。种一颗树,最好的时间是十年前…

前后端项目部署服务器(传统部署和Docker部署)

内外网 开发环境连外网(8.140.26.187),测试/生产环境连内网(172.20.59.17) 内外网地址不同,但指定的库是同一个 内网IP地址范围包括: 10.0.0.0 到 10.255.255.255172.16.0.0 到 172.31.2551…

【从0做项目】Java搜索引擎(7) web模块

阿华代码,不是逆风,就是我疯 你们的点赞收藏是我前进最大的动力!! 希望本文内容能够帮助到你!! 目录 文章导读 零:项目结果展示 一:后端web模块 1:思路 2&#xff1a…

掌握.NET Core后端发布流程,如何部署后端应用?

无论你是刚接触.NET Core的新手还是已有经验的开发者,在这篇文章中你将会学习到一系列实用的发布技巧与最佳实践,帮助你高效顺利地将.NET Core后端应用部署到生产环境中 目录 程序发布操作 Docker容器注册表 文件夹发布 导入配置文件 网站运行操作 …

嵌入式工业级显示器在环保垃圾柜设备中发挥着至关重要的作用

嵌入式工业级显示器在环保垃圾柜设备中发挥着至关重要的作用。以下是其具体作用的分析: 一、提供交互界面 嵌入式工业级显示器为环保垃圾柜设备提供了一个直观、易用的交互界面。用户可以通过触摸屏幕进行操作,如选择垃圾分类类别、查看投放指南、查询…

Apifox 增强 AI 接口调试功能:自动合并 SSE 响应、展示DeepSeek思考过程

在API调试的世界里,效率和准确性往往决定了开发者的成败。你是否曾为处理SSE(Server-Sent Events)响应而烦恼?又是否期待在调试时能直观看到AI的“思考过程”?Apifox这次全新升级,将AI接口调试功能推向新高…

[python]windows上安装yolov12环境

yolov12出来了,地址github.com/sunsmarterjie/yolov12,咱们看看怎么在windows上把环境安装一下首先看看官方安装流程: wget https://github.com/Dao-AILab/flash-attention/releases/download/v2.7.3/flash_attn-2.7.3cu11torch2.2cxx11abiF…

前端知识点---vue的声明周期(vue)

文章目录 创建挂载更新销毁 vue的生命周期有四个阶段: 创建 挂载, 更新和销毁 创建 是vue组件从创建到准备渲染的过程 dom还没挂载到页面中 进行了初始化工作: 初始化数据(data,props) . 设置计算属性computed 初始化方法 methods 绑定事件watch 创建阶段的钩子函数beforeCrea…

装修流程图: 装修前准备 → 设计阶段 → 施工阶段 → 安装阶段 → 收尾阶段 → 入住

文章目录 引言I 毛坯房装修的全流程**1. 装修前准备****1.1 确定装修预算****1.2 选择装修方式****1.3 选择装修公司****1.4 办理装修手续****2. 设计阶段****2.1 量房****2.2 设计方案****2.3 确认方案****3. 施工阶段****3.1 主体拆改****3.2 水电改造****3.3 防水工程****3.…

智能马达保护器:为工业电机安全运行保驾护航

在工业生产中,电动机作为核心动力设备,其稳定运行直接关系到生产效率与安全性。然而,复杂的工况环境、频繁启停和突发负载变化,常导致电机面临过载、缺相、短路等故障风险。安科瑞智能马达保护器凭借其智能化、高精度、多功能的设…

Unity学习part4

1、ui界面的基础使用 ui可以在2d和矩形工具界面下操作,更方便,画布与游戏窗口的比例一般默认相同 如图所示,图片在画布上显示的位置和在游戏窗口上显示的位置是相同的 渲染模式:屏幕空间--覆盖,指画布覆盖在游戏物体渲…

雷龙CS SD NAND(贴片式TF卡)测评体验

声明:非广告,为用户体验文章 前段时间偶然获得了雷龙出品的贴片式 TF 卡芯片及转接板,到手的是两片贴片式 nand 芯片搭配一个转接板,其中有一片官方已经焊接好了,从外观来看,正面和背面设计布局合理&#x…

tailwindcss学习01

系列教程 01 入门 02 vue中接入 03 工具类优先 入门 # 注意使用cmd不要powershell npm init -y # 如果没有npx则安装 npm install -g npx npm install -D tailwindcss3.4.17 --registry http://registry.npm.taobao.org npx tailwindcss init修改tailwind.config.js /** ty…

爱普生SG-8002CE智能家居中控系统的精准 “心脏起搏器”

智能家居中控系统是整个智能家居生态的关键枢纽,承担着连接、管理和协调各类智能设备的重任,涵盖智能灯光、智能窗帘、智能家电等,致力于实现家居设备的互联互通与智能化控制,打造便捷、舒适的智慧生活环境。在这一系统中&#xf…