ThreeJS:Mesh网格与三维变换

news2024/11/24 1:17:58

Mesh网格

        ThreeJS中,Mesh表示基于以三角形为多边形网格(polygon mesh)的物体的类,同时也作为其它类的基类。

        通过Mesh网格,我们可以组合Geometry几何体与Material材质属性,在3D世界中,定义一个物体。例如:之前我们创建的立方体物体,

//TODO:创建几何体
const geometry = new THREE.BoxGeometry(1, 1, 1);
//TODO:创建材质
const material = new THREE.MeshBasicMaterial({ color: 0x00ff00 });
//TODO:创建网格
const mesh = new THREE.Mesh(geometry, material);

        创建之后,只需要将其add添加到scene场景中即可,

//TODO:将网格添加到场景中
scene.add(mesh);

Mesh:物体位移

Vector3三维向量

        Mesh网格提供了position局部位置属性,通过修改该属性值,可以定义物体的位移。

        position局部位置属性是Vector3类型,表示三维向量,对应于物体的XYZ三个分量。ThreeJS提供了一系列方法,可以用于实现三维向量与标量的运算、三维向量之间的运算。

        通过set方法,可以修改position(Vector3类型)局部坐标的分量值,

        例如,我们将position进行修改,可以看到物体的位移效果,

//TODO:修改物体的position局部坐标属性
mesh.position.set(1,1,2);

 Mesh:物体层级关系

        Mesh网格所表达的空间实体,相互之间是可以具备层级关系的,但是,一个对象仅能有一个父级。

        例如:我们为上面定义的立方体添加一个子元素cube1,

//TODO:为mesh物体添加子元素
const material1 = new THREE.MeshBasicMaterial({color:0xffff00});
const cube1 = new THREE.Mesh(geometry,material1);
//TODO:添加到mesh中
mesh.add(cube1);

        此时,仅仅能够看到新添加的cube1,是因为旧的mesh被新的cube1遮挡住了,两者的位置显然是相同的。

Mesh:父子物体位移关系

        我们尝试修改子物体cube1的局部位置坐标,并查看修改之后的位置关系。

//TODO:为mesh物体添加子元素
const material1 = new THREE.MeshBasicMaterial({color:0xffff00});
const cube1 = new THREE.Mesh(geometry,material1);
//TODO:添加到mesh中
mesh.add(cube1);

cube1.position.set(1,0,0,);

        可以看到:子物体默认将父物体的位置作为坐标原点,然后进行位移操作;而父元素的局部坐标默认就和世界坐标相一致。

Mesh:物体缩放

        Mesh网格提供了scale局部缩放属性,通过修改该属性,可以实现物体的缩放操作。

        此时:Vector3的X、Y、Z分量,分别表示在X轴、Y轴、Z轴方向上的缩放比例值。

        例如:我们将上面的mesh放大2倍,可以看到:将父物体mesh放大2倍,子物体cube1默认也被放大2倍,

//mesh放大2倍
mesh.scale.set(2,2,2);

        接着,我们将子物体cube1放大0.5倍,

//cube1放大0.5倍
cube1.scale.set(0.5,0.5,0.5);

        可以看到,子物体cube1被缩小至原来的1/2,但是父物体mesh没有改变。

Mesh:物体旋转

        Mesh网格提供了rotation局部旋转属性,通过修改该属性,可以实现物体的旋转操作。

        物体旋转是以弧度制为基准的,

欧拉角Euler

        欧拉角Euler,描述一个旋转变换,通过指定轴顺序和各个轴向上的制定旋转角度来旋转一个物体。

使用欧拉角旋转物体

        例如:我们现在将父物体mesh绕Y轴旋转45度,

//mesh绕Y轴旋转45度
mesh.rotation.x = Math.PI /4 ;

        可以看到:父物体mesh和子物体cube1都被旋转了,

        接着,我们将子物体cube1绕Y轴旋转-45度,

mesh绕Y轴旋转-45度
cube1.rotation.x = -Math.PI / 4;

        可以看到,仅仅是子物体cube1被旋转了,

        因此,可以总结:具备层级关系的父物体mesh和子物体cube1,子物体cube1的平移、旋转、缩放都是相对于父物体而言的,即:子物体cube1将父物体的位置视为局部坐标系原点;而父物体的平移、旋转、缩放会直接作用在子物体上

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

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

相关文章

Unity ParticleSystem 入门

概述 在项目的制作过程成,一定少不了粒子系统的使用吧,如果你想在项目粒子效果,那这部分的内容一定不要错过喔!我添加了理解和注释更好理解一点! 这次的内容比较多,右侧有目录,可以帮助快速导…

高中数学:三角函数公式汇总及推导

一、定义 常用三角函数值 参考: 三角函数定义 二、基本三角函数及相互关系 sinx cosx tanx cscx secx cotx 函数间相互关系 参考: cosx、sinx、tanx的函数图像与性质 secx、cscx、cotx函数图像及相关关系 三、诱导公式 口诀:奇变…

通信接口——时钟和信号

前言 所有接口只要抓住三个核心点就能分清:时钟同步和异步,时钟的来源,信号的传输方向。 一、时钟同步和异步 接口之间的交互方式存在多种形式,如果按照是否有公共时钟CLK的参与,可以分为同步传输和异步传输。 同步&…

C语言——队列的实现

队列按照先进先出(FIFO,First In First Out)的原则管理数据。这意味着最先进入队列的元素会被最先移出,类似于排队等候服务的情况。队列通常有两个主要操作:入队(enqueue),将元素添加…

DRF返回值源码分析

DRF返回值源码分析 1 返回值 在视图中定义finalize_response方法(也可以用来判断是否异常) 自定义异常 配置文件 # settings.py REST_FRAMEWORK {"EXCEPTION_HANDLER": utils.handlers.exception_handler # 自定义的exceptional_handler路…

Sarcasm detection论文解析 |利用对话语境进行讽刺分析

论文地址: 论文地址:Sarcasm Analysis Using Conversation Context | Computational Linguistics | MIT Press github地址:https://github.com/debanjanghosh/sarcasm_context Alex-Fabbri/deep_learning_nlp_sarcasm: code for deep learnin…

基于springboot实现公司日常考勤系统项目【项目源码+论文说明】

基于springboot实现公司日常考勤系统演示 摘要 目前社会当中主要特征就是对于信息的传播比较快和信息内容的安全问题,原本进行办公的类型都耗费了很多的资源、传播的速度也是相对较慢、准确性不高等许多的不足。这个系统就是运用计算机软件来完成对于企业当中出勤率…

debug的基本使用

1.简介   首先看下IDEA中Debug模式下的界面。 如下是在IDEA中启动Debug模式,进入断点后的界面,我这里是Windows,可能和Mac的图标等会有些不一样。就简单说下图中标注的8个地方: ① 以Debug模式启动服务,左边的一个按…

Redis运维篇-快速面试笔记(速成版)

文章目录 1. Redis的持久化1.1 RDB(快照模式)1.2 AOF 模式 2. Redis主从模型(高可用)2.1 Redis的主从复制2.2 Redis拓扑结构 3. Redis集群模式(高并发)3.1 Redis的Slots3.2 集群模式的常用命令3.3 多主多从…

win下vscode的vim切换模式的中英文切换

问题描述 在vscode中安装vim插件后,如果insert模式下完成输入后,在中文输入方式下按esc会发生无效输入,需要手动切换到英文。 解决方法 下载完成vscode并在其中配置vim插件下载github—im-select.exe插件(注意很多博文中的gitcod…

Node.js -- express 框架

文章目录 1. express 使用2. 路由2.1 路由的使用2.2 获取请求报文参数2.3 获取路由参数2.4 路由参数练习 3. express 响应设置4. 中间件4.1 全局中间件4.2 路由中间件4.3 静态资源中间件 5. 获取请求体数据 body-parser6. 防盗链7. 路由模块化8. 模板引擎8.1 了解EJS8.2 列表渲…

InfluxDB安装使用介绍

1.介绍 InfluxDB是一个由InfluxData开发的开源时序型数据。它由Go写成,着力于高性能地查询与存储时序型数据。InfluxDB被广泛应用于存储系统的监控数据,IoT行业的实时数据等场景。 2.对常见关系型数据库(MySQL)的基础概念对比 1…

Spring Cloud——Circuit Breaker上篇

Spring Cloud——Circuit Breaker上篇 一、分布式系统面临的问题1.服务雪崩2.禁止服务雪崩故障 二、Circuit Breaker三、resilience4j——服务熔断和降级1.理论知识2.常用配置3.案例实战(1)COUNT_BASED(计数的滑动窗口)&#xff0…

UE4_Niagara_两个模型之间的粒子幻化

学习笔记,仅供参考! 操作步骤: 1、新建niagara system,添加空的发射器,渲染改为网格体渲染器,网格体为1M_Cube. 2、创建粒子材质重载。 3、渲染网格体的材质设置: 4、在发射器属性面板&#x…

LeetCode 213 —— 打家劫舍 II

阅读目录 1. 题目2. 解题思路3. 代码实现 1. 题目 2. 解题思路 此题是 LeetCode 198—— 打家劫舍 的升级版,多了一个首尾相连的设定。 因为首尾相连,所以第一个房屋和最后一个房屋只能偷窃其中一个。 所以,第一种方案就是不偷窃最后一个房…

Web APIs 学习归纳6--- BOM浏览器对象

前面几节主要针对DOM进行了学习,现在开始新的内容的学习---DOM浏览器对象。 DOM是更注重页面(document)内容的设计,但是BOM不仅限于页面(document)的设计,而是更加全面包括页面的刷新&#xff0…

SpringBoot使用ResponseBodyAdvice和RequestBodyAdvice实现请求体解密、响应体加密

文章目录 一、写在前面二、实现细节1、定义加解密注解2、请求体解密逻辑3、响应体加密逻辑4、测试类5、测试结果 三、源码分析1、RequestResponseBodyMethodProcessor2、RequestBodyAdvice3、ResponseBodyAdvice 一、写在前面 项目中经常需要对接第三方平台,每次对…

redis ZRANGE 使用最详细文档

环境: redis_version:7.2.2 本文参考 redis 官方文档1 语法 ZRANGE key start stop [BYSCORE | BYLEX] [REV] [LIMIT offset count] [WITHSCORES]参数含义key是有序集合的键名start stop在不同语境下,可用值不一样BYSCORE | BYLEX按照分数查询 | 相…

Node.js -- mongoose

文章目录 1. 介绍2. mongoose 连接数据库3. 插入文件4. 字段类型5. 字段值验证6. 文档处理6.1 删除文档6.2 更新文档6.3 读取文档 7. 条件控制8. 个性化读取9. 代码模块化 1. 介绍 Mongoose是一个对象文档模型库,官网http://www.mongoosejs.net/ 方便使用代码操作mo…

2021-10-21 51单片机两位数码管显示0-99循环

缘由单片机两位数码管显示0-99循环-编程语言-CSDN问答 #include "REG52.h" #include<intrins.h> sbit K1 P3^0; sbit K2 P3^1; sbit K3 P3^2; sbit K4 P3^3; sbit bpP3^4; bit k1,wk10,wk20; unsigned char code SmZiFu[]{63,6,91,79,102,109,125,7,127,1…