Threejs进阶之十七:Threejs中的Path、Shape和ShapeGeometry类

news2024/11/23 20:28:50

在实际的应用中,有时候需要我们根据一个二维图形拉伸为三维图形的情况,这就需要我们对Threejs中提供的二维图形相关的类有一个深入的了解,这一节我们就深入的聊一聊Threejs中的Path、Shape和ShapeGeometry类

目录

  • Path类
    • 构造函数
    • 常用属性
    • 常用方法
    • 示例代码
  • Shape类
    • 构造函数
    • 常用属性
    • 常用方法
    • 示例代码
  • ShapeGeometry类
    • 构造函数
    • 常用属性
    • 常用方法
    • 示例代码

Path类

Path是一个多用途的路径(路径)对象,它通常在创建Shape对象时使用。可以定义多条直线或曲线路径,以及其交点。Path可以由多个子路径构成,每个子路径可以包含多个路径段。Path对象由Three.js的THREE.Path构造函数构造。

构造函数

Path( points : Array ):从传入的点中创建一条Path。第一个点定义了偏移量, 接下来的点作为LineCurves被添加到curves数组中。
points – (可选参数)Vector2s数组。
倘若没有点被指定,将会创建一条空路径,.currentPoint将被设置为原点。

常用属性

  • .currentPoint:表示当前路径点对象的属性。默认情况下,它是(0,0)。
  • .autoClose:表示路径是否自动关闭的属性。默认情况下,它是false。

常用方法

  • .moveTo( x, y ):将路径的起点移动到一个新的位置(x,y),并在路径中创建一个新的点。无返回值。示例代码:
    path.moveTo( 10, 10 );
    
  • .lineTo( x, y ):在路径中创建一个新的点(x,y),并在该点和上一个点之间画一条直线。无返回值。示例代码:
    path.lineTo( 50, 50 );
    
  • .quadraticCurveTo( cx, cy, x, y ):在路径中创建一个控制点(cx,cy),并与当前点和结束点形成二次贝塞尔曲线。无返回值。示例代码:
    path.quadraticCurveTo( 40, 10, 60, 50 );
    
  • .bezierCurveTo( cx1, cy1, cx2, cy2, x, y ):在路径中创建两个控制点(cx1,cy1)和(cx2,cy2),并与当前点和结束点形成三次贝塞尔曲线。无返回值。示例代码:
    path.bezierCurveTo( 15, 15, 25, 45, 50, 50 );
    
  • .ellipse( x, y, rx, ry, astart, aend, acw ):创建一个椭圆形的路径段。无返回值。示例代码:
    path.ellipse( 50, 50, 15, 8, 0, Math.PI * 2, false );
    
  • arc(aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise) - 在当前子路径中创建一条弧线段。示例代码:
    path.arc( 0, 0, 20, 0, Math.PI, true );
    
  • ellipse(aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation) - 在当前子路径中创建一个椭圆形。示例代码:
    javascript path.ellipse( 0, 0, 20, 30, 0, Math.PI, true,0 );
  • absarc(x, y, radius, startAngle, endAngle, clockwise) - 在形状上添加一个有中心和半径的弧形。
  • absellipse(x, y, xRadius, yRadius, startAngle, endAngle, clockwise) - 在形状上添加一个椭圆。

示例代码

function initMesh() {
  // 创建一个新的路径对象
  const path = new THREE.Path(); 
  // 设置路径起点
  path.moveTo( 0, 0 ); 
  // 创建一条曲线段
  path.quadraticCurveTo( 10, 10, 20, 0 ); 
  // 创建一条弧线段
  path.arc( 0, 0, 10, 0, Math.PI, true ); 
  // 在路径末尾自动添加一条线段,形成闭合路径
  path.autoClose = true; 
  const points = path.getPoints();
  // 创建一个线性材质,并使用定义的路径创建一个网格对象
  const material = new THREE.LineBasicMaterial({
    color: 0xffffff
  });
  const geometry = new THREE.BufferGeometry().setFromPoints( points );
  const mesh = new THREE.Line(geometry, material); 
  // 添加网格对象到场景中
  scene.add(mesh);
}

运行代码,刷新浏览器,可以看到已经绘制了一个二维图形
在这里插入图片描述

Shape类

Shape是用于创建平面形状的类。它基于Path,使用路径以及可选的孔洞来定义一个二维形状平面,因此具有路径对象的所有功能。Shape可以用来创建一个简单的二维形状,然后使用ShapeGeometry将其转换为可呈现的封闭形状。它可以和ExtrudeGeometry、ShapeGeometry一起使用,获取点,或者获取三角面。

构造函数

Shape( points : Array ):从点来创建一个Shape。第一个点定义了偏移量, 接下来的点被作为LineCurves加入到curves中。
points – (可选参数) 一个Vector2数组。
如果没有点被指定,一个空的形状将会被创建,且.currentPoint将会被设为原点。

常用属性

  • .uuid : 字符串类型,该类所创建的实例的UUID。它是自动被指定的,因此它不应当被编辑、更改。
  • .holes:表示形状内部的零或多个孔的数组。即表示包含所有内部空洞(也是Shape对象)的数组。默认值是一个空数组 。
    其共有属性与path相同

常用方法

Shape具有Path的所有方法。

  • .moveTo( x, y )-将绘图点的起点移动到一个新的位置(x,y)并在Shape路径的路径中创建一个新的点。无返回值。示例代码:
    shape.moveTo( 10, 10 );
    
  • .lineTo( x, y )-向Shape路径中添加一条直线,从当前点到新点(x,y)。无返回值。示例代码:
    shape.lineTo( 50, 50 );
    
  • .quadraticCurveTo( cx, cy, x, y )-向Shape路径中添加一个二次贝塞尔曲线,该曲线以控制点(cx, cy)结束,终点为(x, y)。无返回值。示例代码:
    shape.quadraticCurveTo( 40, 10, 60, 50 );
    
  • .bezierCurveTo( cx1, cy1, cx2, cy2, x, y )-向Shape路径中添加一个三次贝塞尔曲线,该曲线以两个控制点结束,终点为(x, y)。无返回值。示例代码:
    shape.bezierCurveTo( 15, 15, 25, 45, 50, 50 );
    
  • .arc( x, y, radius, startAngle, endAngle, counterclockwise )-创建一段圆弧,并将其添加到当前Shape路径中。counterclockwise控制弧是顺时针还是逆时针形式。无返回值。示例代码:
    shape.arc( 50, 50, 15, 0, Math.PI * 2, false );
    
  • absarc(x, y, radius, startAngle, endAngle, clockwise) - 在形状上添加一个有中心和半径的弧形。
  • absellipse(x, y, xRadius, yRadius, startAngle, endAngle, clockwise) - 在形状上添加一个椭圆。
  • extractPoints(divisions : Integer) - divisions – 结果的精细程度(细分数)。在形状以及.holes(孔洞)数组上调用getPoints,并返回一个来自于:
    {
    	shape
    	holes
    }
    
    的对象,其中的形状和孔洞是Vector2数组。
  • .getPointsHoles ( divisions : Integer ) : Array。 获取一个表示形状上的孔洞的Vector2s数组。
    divisions – 结果的精细程度(细分数)。
    在Threejs开发指南中找到一个比较详细介绍上述方法的图表,参考如下
    在这里插入图片描述

示例代码

function initShapeMesh() {
  // 创建一个形状
  const shape = new THREE.Shape();
  // 创建一个闭合路径
  shape.moveTo(0, 0);
  shape.lineTo(1, 0);
  shape.lineTo(1, 1);
  shape.lineTo(0, 1);
  shape.lineTo(0, 0); 
  // 创建线性材质
  const material = new THREE.MeshBasicMaterial({
    color: 0x00ff00
  });
  const geometry = new THREE.ShapeGeometry( shape );
  const mesh = new THREE.Mesh(geometry, material); 
  // 添加网格对象到场景中
  scene.add(mesh);
}

运行代码,刷新浏览器,可以看到已经绘制了一个二维图形
在这里插入图片描述

ShapeGeometry类

ShapeGeometry类从一个或多个路径形状中创建一个单面多边形几何体。它将封闭的Shape对象转换为Geometry对象,然后可以由Mesh使用。

其实在上面的示例中,我们已经使用到了ShapeGeometry类

构造函数

ShapeGeometry(shapes : Array, curveSegments : Integer)
shapes — 一个单独的shape,或者一个包含形状的Array。默认为单个三角形。
curveSegments - Integer - 每一个形状的分段数,默认值为12。

常用属性

共有属性请参见其基类BufferGeometry。

  • .parameters : Object-一个包含着构造函数中每个参数的对象。在对象实例化之后,对该属性的任何修改都不会改变这个几何体。

常用方法

共有方法请参见其基类BufferGeometry。

示例代码

function initShapeGeometry() {
  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 );
 
  var geometry = new THREE.ShapeGeometry( shape );
  var material = new THREE.MeshBasicMaterial( { color: 0xff0000 } );
  var mesh = new THREE.Mesh( geometry, material );
  scene.add( mesh );
}

运行代码,刷新浏览器,看效果
在这里插入图片描述
ok,这次就先写到这里,喜欢的小伙伴关注点赞收藏哦!
需要源码的小伙伴可以扫描下面的二维码关注我的公众号,输入关键字“shape”,获取下载链接
在这里插入图片描述

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

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

相关文章

chatgpt赋能python:Python字符串跨行:如何在代码中处理长字符串

Python字符串跨行:如何在代码中处理长字符串 当你编写Python代码时,可能会遇到需要编写很长的字符串的情况。例如,你可能需要将一大段文本或HTML代码嵌入到Python程序中。在这种情况下,你需要学会如何将长字符串跨行编写&#xf…

[chatGPT攻略] 如何检测文本内容是否由ChatGPT生成 ?

[chatGPT攻略] 如何检测文本内容是否由ChatGPT生成 ? 在 ChatGPT 爆火的两个月内,学生就已经自发用这种工具做作业、写论文偷懒,编剧会用它编故事试试出乎人意料的故事走向,文案编辑用它来给自己打工。 在用工具给自己省事这件事上&#xf…

无条件抽奖和条件抽奖(互动功能发起端JS-SDK)

无条件抽奖功能概述 允许开始前对抽奖进行奖品、中奖人数、中奖人员等设置,完成设置后可以开始抽奖。 本功能只支持讲师、嘉宾、助教、管理员这四种角色进行抽奖的发起和停止。支持自定义设置中奖用户信息采集字段。支持设置预设中奖用户。支持设置定时开奖可查看…

论文翻译——Test Selection for Deep Learning Systems

文章目录 AbstractIntroductionRelated work(这部分没有翻译完全,我主要是用来做课程回报的,后面的实验就够讲了,这里就不讲了)3 Motivation and Problem Definition4 Test Selection MetricsMetrics Derived from the…

C++与Qt深度融合:高效设计多线程应用框架

C与Qt深度融合:高效设计多线程应用框架 1. C与Qt线程的混合使用1.1 C线程与Qt线程的基本概念1.2 线程间的相互依赖关系1.3 设计合理的代码框架 二、深入理解C和Qt线程模型2.1 C线程模型2.2 Qt线程模型2.3 C和Qt线程模型的比较 三、C和Qt线程间的互操作性3.1 std::th…

chatgpt赋能python:Python如何获取微信聊天记录

Python如何获取微信聊天记录 作为世界上最受欢迎的即时通讯工具之一,微信被大量用户使用。然而,微信聊天记录的备份和管理是一个重要的问题,特别是对于那些需要在工作和个人生活中快速查找重要信息的人来说。 幸运的是,Python编…

Cloud篇——GateWay 网关

1、GateWay是什么 官网讲解: SpringCloud Gateway 是 Spring Cloud 的一个全新项目,基于 Spring 5.0Spring Boot 2.0 和 Project Reactor 等技术开发的网关,它旨在为微服务架构提供一种简单有效的统一的 API 路由管理方式。 SpringCloud Gate…

READ-自动驾驶大场景神经渲染

这是一个针对自动驾驶场景的神经渲染方案,提出了一种大规模神经渲染方法来合成自动驾驶场景(READ),这使得通过各种采样方案在PC上合成大规模驾驶场景成为可能。 疑问:文中提到基于nerf的方法和神经渲染方法&#xff0…

kali 2023.2安装、换源、更新、SSH

kali2023版本已经更新了,为了体验新版,下载试用了一下。记录初始的安装过程,以备复习用,不足之处欢迎批评指正。 一、下载 1、官网下载,地址:https://www.kali.org/,因为我准备在VM虚拟机中使用…

chatgpt赋能python:Python如何抓取数据

Python如何抓取数据 介绍 Python是一种功能强大的编程语言,它被广泛使用于网络抓取和数据分析。无论您是想要从网站上抓取数据,还是使用API抓取数据,Python都是一种非常适合的工具。在本文中,我们将介绍Python如何抓取数据&…

WINDOWS权限维持

Meterpreter权限维持 meterpreter中的权限维持技术有两种: persistence(注册表后门)metsvc的后门(服务后门) 1、注册表后门 windows/local/persistence 这个方法是执行vbs脚本,这里很容易被杀软拦截&a…

Android 12.0 系统设置显示主菜单添加屏幕旋转菜单实现旋转屏幕功能

1.前言 在android12.0的系统rom定制化开发中,在对系统设置进行定制开发中,有产品需求要求增加 旋转屏幕功能的菜单,就是在点击旋转屏幕菜单后弹窗显示旋转0度,旋转 90度,旋转180度, 旋转270度针对不同分辨率的无重力感应的大屏设备的屏幕旋转功能的实现, 接下来就来分析…

MySQL数据库 12:约束

约束: 在MySQL中,约束是一种限制数据表中列值的规定。保证数据库中的数据正确,有效性和完整性。MySQL中的约束有以下几种: 1. 主键约束(Primary Key Constraint):主键是用于唯一标识表中每行记…

浅谈Servlet、HTTP

一、Servlet Servlet 是Java Web 开发的规范。任何一个mvc的框架都是servlet发展来的。SpringMVC使用DispatcherServlet拦截所有API请求,自定义注解进行URL匹配。 Servlet层次结构 Setvlet生命周期 1、工作流程 1.Web Client 向Servlet容器(Tomcat&…

Java 实现更新顺序表中的指定元素

一、思路 1.定义一个 pos 变量为要更新的位置,定义一个 value 变量为更新后的数值. 2.顺序表不能是空的,就肯定不可以更新元素. 3.pos位置要合法,要保证 pos 位置是处在顺序表范围内的. 4.更新功能不需要考虑扩容,因为不涉及到元素…

传统制作 VS AI制作,如何一键制作PPT ?

教你如何快速的生成一个可用的 PPT,以及现在比较主流的 ChatGPT PPT 衍生工具推荐。 一、原理 结合AI生成 PPT 的原理其实非常简单, 现有的一些 PPT 软件或者开源工具会提供一种文本格式,我们只需要给出定固定的格式,把内容输入…

分享几个实用的C站AI模型平替网站

分享几个实用的C站AI模型平替网站 部分用户可能没有mofa工具访问Civitai ( C站)下载AI模型,所以给大家分享几款国内版AI模型素材库,无障碍访问下载Stable diffusion模型。 1、LiblibAI 访问速度快,作品墙、有提示词参考,无需登录…

SciencePub学术 | 智能交通类重点SCIEI征稿中

SciencePub学术刊源推荐: 智能交通类SCI&EI征稿中!进展顺利,录用率高,连续十年IF稳定上升。信息如下,录满为止: 一、期刊概况: 【期刊简介】IF:4.0-4.5↑, JCR 2区,…

剪映自动打关键帧

牙叔教程 简单易懂 这是给单张图片打关键帧的教程, 给图片打关键帧有四个步骤 鼠标点选图片打起始帧跳转到图片末尾打结束帧 打帧是一件很费手的事情, 所以我写了个自动化的代码, 专门用来打关键帧, 使用的软件是 AutoHotkey 关键帧参数的详细解释 剪映 自动打关键帧 AutoH…

chatgpt赋能python:Python中如何精确表示小数

Python中如何精确表示小数 在日常的数学计算过程中,小数是不可避免的。然而,由于计算机在存储和处理小数时的固有限制,会导致精度上的问题。Python作为一种通用的编程语言,也具有这样的限制。但是,在Python中&#xf…