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

Threejs绘制方形管道

        之前有用Threejs的TubeGeometry绘制管道效果,但是TubeGeometry的管道效果默认是圆形的截面,这节实现方形截面的管道绘制。

        因为Threejs不提供方形截面的管道,所以使用的是绘制截面,然后拉伸的方式,所以需要先绘制一个方形,当然在此之前还是要先创建一个场景,包括灯光,相机,渲染器等,之前章节已有过就不再贴代码了,下面先通过Shape创建一个截面

const shape = new THREE.Shape();// 创建形状
shape.moveTo(0, 0);
shape.lineTo(2, 0);
shape.lineTo(2, 2);
shape.lineTo(0, 2);
shape.lineTo(0, 0);

        然后用CatmullRomCurve3绘制出曲线,也是后面轨道的轨迹,

 const curve = new THREE.CatmullRomCurve3([new THREE.Vector3( -10, -50, -50 ),new THREE.Vector3( 10, 0, 0 ),new THREE.Vector3( 8, 50, 50 ),new THREE.Vector3( -5, 0, 100)]);

通过ExtrudeGeometry拉伸的方法,将shape截面和曲线curve传入后,进行拉伸,并设置路径的精度,就可以得到一个几何体geometry,再添加一个材质,创建网格模型,添加到场景中。就可以得到下面的3D模型,

const geometry = new THREE.ExtrudeGeometry(shape,  { // 创建挤出几何体extrudePath:curve,//扫描轨迹steps:100 //沿着路径细分精度,越大越光滑});const material = new THREE.MeshBasicMaterial({ color: 0x00ff00 });// 创建材质const mesh = new THREE.Mesh(geometry, material); // 创建网格
this.scene.add(mesh);// 将网格添加到场景中

但是这个管道为纯色,下面给这个管道添加贴图,让他更真实,我就随便找了张图片作为贴图,代替原有的材质,完整代码如下:

initExtrudeGeometry(){  // 创建挤出几何体const shape = new THREE.Shape();// 创建形状shape.moveTo(0, 0);shape.lineTo(4, 0);shape.lineTo(4, 4);shape.lineTo(0, 4);shape.lineTo(0, 0);// 扫描轨迹:创建轮廓的扫描轨迹(3D样条曲线)const curve = new THREE.CatmullRomCurve3([new THREE.Vector3( -10, -50, -50 ),new THREE.Vector3( 10, 0, 0 ),new THREE.Vector3( 8, 50, 50 ),new THREE.Vector3( -5, 0, 100)]);const geometry = new THREE.ExtrudeGeometry(shape,  { // 创建挤出几何体extrudePath:curve,//扫描轨迹steps:100 //沿着路径细分精度,越大越光滑});const texLoader = new THREE.TextureLoader();//纹理贴图加载器TextureLoaderconst texture = texLoader.load('/static/images/cold1.png');// .load()方法加载图像,返回一个纹理对象Textureconst material = new THREE.MeshBasicMaterial({ // 设置纹理贴图:Texture对象作为材质map属性的属性值map: texture,//map表示材质的颜色贴图属性});// 设置阵列模式texture.wrapS = THREE.RepeatWrapping;texture.wrapT = THREE.RepeatWrapping;// uv两个方向纹理重复数量texture.repeat.set(0.5,0.5);//注意选择合适的阵列数量// const material = new THREE.MeshBasicMaterial({ color: 0x00ff00 });// 创建材质const mesh = new THREE.Mesh(geometry, material); // 创建网格this.scene.add(mesh);// 将网格添加到场景中},

最终的效果如下,不过贴图还是根据实际场景选择,效果会更好

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • IO进程day01(标准IO、缓存区)
  • 51单片机最快能生成多高频率的方波?
  • 趣味算法------试用 6 和 9 组成的最大数字
  • flutter 动画
  • 软件测试学习笔记丨Chrome开发者模式
  • [Day 65] 區塊鏈與人工智能的聯動應用:理論、技術與實踐
  • Neo4j导入csv数据,并创建节点
  • Vue3 pinia
  • C++设计模式6:适配器模式
  • 使用GitHub Actions的Self-hosted runner
  • leetcode541:反转字符串II
  • io进程----文件io
  • 8月27日,每日信息差
  • 【深度学习】爱因斯坦求和约定
  • STM32 - 笔记3
  • 77. Combinations
  • angular组件开发
  • Cookie 在前端中的实践
  • echarts花样作死的坑
  • Golang-长连接-状态推送
  • markdown编辑器简评
  • MYSQL如何对数据进行自动化升级--以如果某数据表存在并且某字段不存在时则执行更新操作为例...
  • Python 基础起步 (十) 什么叫函数?
  • SAP云平台里Global Account和Sub Account的关系
  • SegmentFault 技术周刊 Vol.27 - Git 学习宝典:程序员走江湖必备
  • 安装python包到指定虚拟环境
  • 对超线程几个不同角度的解释
  • 基于HAProxy的高性能缓存服务器nuster
  • 使用parted解决大于2T的磁盘分区
  • 我的业余项目总结
  • 详解NodeJs流之一
  • 一文看透浏览器架构
  • 栈实现走出迷宫(C++)
  • - 转 Ext2.0 form使用实例
  • TPG领衔财团投资轻奢珠宝品牌APM Monaco
  • (1)(1.13) SiK无线电高级配置(六)
  • (C#)Windows Shell 外壳编程系列4 - 上下文菜单(iContextMenu)(二)嵌入菜单和执行命令...
  • (Spark3.2.0)Spark SQL 初探: 使用大数据分析2000万KF数据
  • (附源码)php投票系统 毕业设计 121500
  • (附源码)ssm基于jsp高校选课系统 毕业设计 291627
  • (强烈推荐)移动端音视频从零到上手(上)
  • (图文详解)小程序AppID申请以及在Hbuilderx中运行
  • (万字长文)Spring的核心知识尽揽其中
  • (五)关系数据库标准语言SQL
  • .【机器学习】隐马尔可夫模型(Hidden Markov Model,HMM)
  • .NET Core 发展历程和版本迭代
  • .Net 垃圾回收机制原理(二)
  • .NET/C# 在代码中测量代码执行耗时的建议(比较系统性能计数器和系统时间)
  • .NET设计模式(11):组合模式(Composite Pattern)
  • .Net实现SCrypt Hash加密
  • @column注解_MyBatis注解开发 -MyBatis(15)
  • [ vulhub漏洞复现篇 ] Hadoop-yarn-RPC 未授权访问漏洞复现
  • [2013][note]通过石墨烯调谐用于开关、传感的动态可重构Fano超——
  • [ACL2022] Text Smoothing: 一种在文本分类任务上的数据增强方法
  • [AIGC] SQL中的数据添加和操作:数据类型介绍