Threejs进阶之十八:使用ExtrudeGeometry从二维图形创建三维几何体

news2024/11/16 3:29:24

目录

  • ExtrudeGeometry类
    • 构造函数
      • options包含的参数
  • 使用ExtrudeGeometry从二维图形创建三维图形的基本步骤
    • 1.创建二维图形
    • 2.创建轮廓线(outline)
    • 3.创建材质和网格对象
    • 补充内容:将拉伸图形生成为线框模式

上一节我们介绍了Threejs中二维图形相关的类,这一节我们来聊一聊如何通过创建的二维图形来生成三维图形

ExtrudeGeometry类

ExtrudeGeometry类(挤压缓冲几何体)是Three.js中的一个类,用于将二维轮廓线沿着指定路径拉伸成三维立体形状。它的构造函数如下所示:

构造函数

ExtrudeGeometry(shape, options)

该对象将一个二维形状挤出为一个三维几何体
ExtrudeGeometry的参数

  • shape:ExtrudeGeometry所需的形状对象或者一个包含形状的数组。
  • options:ExtrudeGeometry的选项对象。具体包含有下列参数:

options包含的参数

  • curveSegments — int,曲线上点的数量,默认值是12。
  • steps — int,用于沿着挤出样条的深度细分的点的数量,默认值为1。
  • depth — float,挤出的形状的深度,默认值为1。
  • bevelEnabled — bool,是否在侧面添加斜角,默认值为true。
  • bevelThickness — float,设置原始形状上斜角的厚度。默认值为0.2。
  • bevelSize — float。斜角与原始形状轮廓之间的延伸距离,即每一个斜角的长度,默认值为bevelThickness-0.1。
  • bevelOffset — float. 对象的轮廓线的偏移量。默认值为 0。
  • bevelSegments — int。斜角的分段层数,默认值为3。
  • extrudePath — THREE.Curve对象。一条沿着被挤出形状的三维样条线。路径拉伸不支持斜面。
  • UVGenerator — Object。提供了UV生成器函数的对象。

使用ExtrudeGeometry从二维图形创建三维图形的基本步骤

1.创建二维图形

要从二维图形创建三维图形,首先需要创建二维图形。我们可以使用两个Three.js对象来创建二维图形:THREE.ShapeTHREE.Path。这两个类的具体特性和方法,我们在上一节Threejs进阶之十七:Threejs中的Path、Shape和ShapeGeometry类中已经介绍过了,不了解的小伙伴请参考上一节的博客内容。这里只做简单的介绍

Shape
Shape是一个二维轮廓线,由一系列的点、线条和圆弧等组成。可以通过将这些基本图元组合在一起来构造一个具有复杂轮廓的形状。
我们可以通过以下代码创建一个包含矩形和圆弧的Shape对象:

var shape1 = new THREE.Shape();
//向shape对象中添加矩形和圆弧
shape1.moveTo(0, 0);//起始点
shape1.lineTo(0, 10);//下直线
shape1.lineTo(20, 10);//右直线
shape1.lineTo(20, 0);//上直线
shape1.lineTo(0, 0);//左直线
var holePath = new THREE.Path();
holePath.absellipse(10, 5, 5, 5, 0, Math.PI * 2, true);
shape1.holes.push(holePath);

上面代码中,我们首先通过moveTo()方法定义了矩形的起始点,然后使用lineTo()方法定义了矩形的四条边界。接着,我们使用absellipse()方法创建圆弧,并将其作为内部空洞添加到Shape中。

Path
在创建Shape对象时,我们也可以使用Path对象来定义形状的基本轮廓线,它由一系列的点和线条构成。
我们可以通过以下代码创建一个包含梯形和圆角的Path对象:

var path = new THREE.Path();
path.moveTo(0, 0);
path.lineTo(20, 10);
path.lineTo(20, 20);
path.lineTo(0, 10);
path.lineTo(0, 0);

var circlePath = new THREE.Path();
circlePath.absarc(10, 10, 5, 0, Math.PI * 2);
path.holes.push(circlePath);

在上述代码中,我们通过moveTo()方法指定了梯形的左下角点位置,然后使用lineTo()方法定义了梯形的四个顶点位置。接着,我们使用absarc()方法创建了一个圆角,并将其添加到Path对象的缺省孔洞中。

这里我们使用shape来创建二维图形,代码如下:我们通过shape创建一个心形

  var shape = new THREE.Shape();
  shape.moveTo( 0, 20 );
  shape.bezierCurveTo( 0, 10, -18, 0, -25, 0 );
  shape.bezierCurveTo( -55, 0, -55, 35, -55, 35 );
  shape.bezierCurveTo( -55, 55, -35, 77, 0, 95 );
  shape.bezierCurveTo( 35, 77, 55, 55, 55, 35 );
  shape.bezierCurveTo( 55, 35, 55, 0, 25, 0 );
  shape.bezierCurveTo( 18, 0, 0, 10, 0, 20 );

2.创建轮廓线(outline)

有了二维形状ShapePath对象,我们可以通过THREE.ExtrudeGeometry的构造函数中的shapes参数来创建相应的轮廓线(outline)。

var extrudeSettings = {
    depth: 10,
    bevelEnabled: false,
    steps: 1
};
var geometry = new THREE.ExtrudeGeometry(shape, extrudeSettings);

在上述代码中,使用ExtrudeGeometry的构造函数和extrudeSettings参数来创建ExtrudeGeometry对象。

3.创建材质和网格对象

创建材质和网格对象Mesh,并将上面的geometry 和材质作为参数传入

var material = new THREE.MeshPhongMaterial( { color: 0xffffff, specular: 0x111111, shininess: 200 } )
var mesh = new THREE.Mesh( geometry, material )
scene.add( mesh );

刷新浏览器,可以看到浏览器里已经根据我们创建的心形二维图形拉伸了一个深度为10的三维心形图形
在这里插入图片描述

补充内容:将拉伸图形生成为线框模式

我们可以将三维图形生成为线框模式,步骤如下:

1.创建一个WireframeGeometry对象,将ExtrudeGeometry对象传递给其中:

var wireGeometry = new THREE.WireframeGeometry( extrudeGeometry );

2.将WireframeGeometry对象传递给LineSegments对象以显示线框几何:

var wireMaterial = new THREE.LineBasicMaterial( { color: 0xffffff } );
var wireframe = new THREE.LineSegments( wireGeometry, wireMaterial );
scene.add( wireframe );

在这里插入图片描述
好了,今天就先到这里,喜欢的小伙伴点赞关注收藏哦!

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

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

相关文章

(转载)基于模拟退火算法的TSP问题求解(matlab实现)

1 理论基础 1.1 模拟退火算法基本原理 模拟退火(simulated annealing,SA)算法的思想最早是由Metropolis等提出的。其出发点是基于物理中固体物质的退火过程与一般的组合优化问题之间的相似性。模拟退火法是一种通用的优化算法,其物理退火过程由以下三部分组成&am…

【6.08 代随_51day】 最佳买卖股票时机含冷冻期、买卖股票的最佳时机含手续费

最佳买卖股票时机含冷冻期、买卖股票的最佳时机含手续费 最佳买卖股票时机含冷冻期1.方法图解步骤递归代码 买卖股票的最佳时机含手续费1.方法代码 最佳买卖股票时机含冷冻期 力扣连接:309. 最佳买卖股票时机含冷冻期(中等) 1.方法 1.具体…

【uniapp 小程序实现已授权用户直接自动登录,未授权用户展示授权页面并实现一键登录】

uniapp 小程序实现已授权用户直接自动登录,未授权用户展示授权页面并实现一键登录 前言一、实现思路1. 后端接口a. LoginByCodeb. LoginMpAlic. LoginMpWx 二、最终实现流程图1.流程图在这里插入图片描述 总结 前言 项目背景 : 项目是使用 uniapp 来实现的多端小程序 , 当前实…

LVS负载均衡群集部署——DR直接路由模式

这里写目录标题 一 、 LVS-DR 工作原理二、数据包流向分析三、LVS-DR 模式的特点四、ARP问题4.1 问题一:IP地址冲突4.2 问题二:第二次再有访问请求 五、部署LVS-DR集群5.1 配置Tomcat 多实例服务器5.2 配置web节点服务器配置web1节点服务器配置Nginx七层…

00后干一年跳槽就20K,测试老油条表示真怕被这个“卷王”干掉····

在程序员职场上,什么样的人最让人反感呢? 是技术不好的人吗?并不是。技术不好的同事,我们可以帮他。 是技术太强的人吗?也不是。技术很强的同事,可遇不可求,向他学习还来不及呢。 真正让人反感的,是技术平平&#x…

2023-06-05 stonedb-在聚合的场景查询为空无法执行case属性-问题分析-及定位问题的思路

目录 摘要: 查询SQL: 处理该问题的思路分析: 削减查询SQL的操作符 tianmu引擎的查询SQL innodb引擎的查询SQL mysql/sql和innodb执行分析: 执行过程的trace日志: 摘出一些涉及查询执行的部分 思路分析: mysql/sql层的核心处理: Item_func_case::fix_fields 调用堆…

【OpenCV DNN】Flask 视频监控目标检测教程 07

欢迎关注『OpenCV DNN Youcans』系列,持续更新中 【OpenCV DNN】Flask 视频监控目标检测教程 07 3.7 OpenCVFlask实时监控人脸识别cvFlask08 项目的文件树cvFlask08 项目的Python程序cvFlask08 项目的网页模板cvFlask08 项目的运行 本系列从零开始,详细…

2023上海国际嵌入式展 | 如何通过人工智能驱动的自动化测试工具提升嵌入式开发效率

2023年6月14日到16日,龙智将在2023上海国际嵌入式展(embedded world China 2023)A055展位亮相。同时,6月14日下午3:00-3:30,龙智资深DevSecOps顾问巫晓光将于创新技术及应用发展论坛第二论坛区(A325展位&am…

idea代码检查插件

1,SonarLint Idea 安装 Sonar 插件提升代码质量_idea sonar插件_打代码的苏比特的博客-CSDN博客 2,immomo Mybatis XML Mapper SQL注入漏洞发现与一键修复-----项目静态代码安全审计idea插件工具MOMO CODE SEC INSPECTOR-Java_idea sql注入 插件_North…

【蓝桥刷题】备战国赛——交通信号

蓝桥杯2022国赛真题——交通信号 🚀 每日一题,冲刺国赛 🚀 题目导航: 交通信号 🎇思路: d i j k s t r a dijkstra dijkstra 🔱思路分析: 要求从一点到另一点的最短距离&#xff0…

软件测试的生命周期、Bug

一、软件测试的生命周期 1、软件的生命周期: 需求分析:分析需求是否正确、完整。 设计:项目的上线时间、开始开发时间、测试时间、人员... 计划:设计技术文档、进行UI设计... 编码:写代码(实现用户需求&am…

Tomcat启动闪退的详细解决方法(捕获的野生的java1.8.0_321和野生的Tomcat8实验)

1.实验说明 本实验将采用捕获的野生的java1.8.0_321和野生的Tomcat8进行实验。而且不需要安装服务。 2.配置声明: java -version javac -version CATALINA_HOME 说明:CATALINA_HOME配置到放置到tomcat的目录 Path 说明:Path路径配置到tomca…

如和使用matlab实现香农编码和解码

文章目录 前言效果截图如下代码解析完整代码完结 撒花 前言 在网上看了好多 , 都是对香农进行编码的案例 , 却没有 进行解码的操作 , 今天就来补齐这个欠缺 效果截图如下 代码解析 text 你好; % 待编码的文本定义一个字符串类型的变量text,其值为’你好’。 [en…

2023水博会新热门:北斗时空智能 助力水利数字孪生

当“北斗”遇上“智慧水利”将会碰撞出怎样的新意? 6月7日,2023中国水博会暨第十八届中国(国际)水务高峰论坛正式召开。会上,由千寻位置提出的“北斗时空智能助力水利数字孪生”理念及相应解决方案,受到了与…

肠道菌群、性激素与疾病:探索它们的交互作用

谷禾健康 我们的身体中有很多不同的器官,组织,腺体等会产生许多信号分子来精确控制和影响身体的反应和活动,这些信号分子包括激素、神经递质、生长因子、细胞因子等。它们可以促进或抑制细胞的生长和分化,调节细胞间的相互作用和通…

搭建lanproxy客户端与服务端实现内网穿透

一、首先要配置java环境 1.可以使用这个,或者官网下载,或者其他版本皆可。https://download.csdn.net/download/qq_44821149/87878658 2.采用jdk-8u144-linux-x64.zip压缩包。java version 为1.8.0_144。 3.具体操作为: mkdir /usr/java u…

使用 Iptables 命令详细图文教程

目录 一、防火墙管理工具 二、Iptables 2.1 策略与规则链 2.2 基本的命令参数 2.2.1. 在 iptables 命令后添加 -L 参数查看已有的防火墙规则链。 2.2.2 在 iptables 命令后添加 -F 参数清空已有的防火墙规则链。 2.2.3 把 INPUT 规则链的默认策略设置为拒绝。 2.2.4…

【Web服务应用】部署LVS-DR集群

LVS-DR集群 一、LVS-DR工作原理二 、DR数据包流向分析2.1DR模式中名词解释2.2数据包流向 三、ARP问题3.1问题一:IP 地址冲突3.2 问题二:第二次再有访问请求 四、LVS-DR实战 一、LVS-DR工作原理 LVS-DR(Linux Virtual Server Director Server&…

Pandas的groupby用法说明

Pandas的groupby用法说明 1、功能说明 按官方文档说明groupby功能,可以参考与SQL中的分组操作进行理解。 By “group by” we are referring to a process involving one or more of the following steps: Splitting the data into groups based on some criteri…

VMware® vSphere虚拟化平台限制虚拟机网卡速率一例

本文介绍VMware vSphere对虚拟服务器进行网卡限速的案例 一、案例背景 目前有一套生产环境的虚拟化平台基于VMware vSphere构建。宿主机外连网卡均为主、备各10Gb,核心交换机出口至外部网络带宽也是10Gb。某业务系统使用nginx搭建了两台固件升级服务器对外提供下载…