three.js中Meshline库的使用

three.js中Meshline的使用

  • 库的地址
  • 为什么要使用MeshLine,three.js内置的线不好用吗?
  • MeshLine入门
  • MeshLine的深入思考
  • 样条曲线
  • 一个问题

库的地址

https://github.com/spite/THREE.MeshLine?tab=readme-ov-file

为什么要使用MeshLine,three.js内置的线不好用吗?

确实不好用,比如three.js内置的线无法设置粗细,MeshLine就可以

MeshLine入门

  • 先安装库文件
npm i three.meshline
  • 然后再demo中引入库文件
import { MeshLine, MeshLineMaterial, MeshLineRaycast } from 'three.meshline/src/THREE.MeshLine.js';
  • MeshLine的简单使用
	var scene, camera, renderer, amountToAdd = 0.01;
    var points, line;

    function init() {
      scene = new THREE.Scene();//设置场景
      camera = new THREE.PerspectiveCamera(75, 640 / 480, 0.1, 1000);//设置相机

      renderer = new THREE.WebGLRenderer();//设置渲染器
      renderer.setSize(640, 480);//设置窗口大小
      document.body.appendChild(renderer.domElement);
      camera.position.z = 9;

	  //设置点集
      points = [];
      for (var i = -10; i < 10.1; i += 0.1) {
        points.push([i, Math.sin(i), 0]);
      }
      //创建线的几何体
      line = new MeshLine();
      //设置构成这条线需要的几个点
      line.setPoints(points.flat());
	
	  //设置线段需要的材质
      var material = new MeshLineMaterial({
        color: new THREE.Color(0x00FFFF),
        lineWidth: 0.1,
        //dashArray和dashRatio都是构成虚线的影响因素
        // dashArray: 0.01,
        // dashRatio: 0.2,
      });
      // material.transparent = true;//虚线功能//只要开启虚线功能后,dashArray和dashRatio才会生效
      var mesh = new THREE.Mesh(line, material);//网格=几何体+材质

      scene.add(mesh);
	  
	  //每2000毫秒边执行一次,来实现曲线上下移动的效果
      setInterval(() => { amountToAdd *= -1 }, 2000);

      animate();
    }
	
	//事件循环
    function animate() {
      points = points.map((point) => [point[0], point[1] * (1 + amountToAdd), point[2]]);
      line.setPoints(points.flat());

      renderer.render(scene, camera);
      requestAnimationFrame(animate);
    }

    init();//执行函数
  • 效果
    在这里插入图片描述

MeshLine的深入思考

因为,three.js的原配线段有很多与浏览器不合的部分,为了让用户有更好的效果,所以不得不采用MeshLine来替代three.js原来的内置线段

有一点很重要,MeshLine最主要是生成直线的,如果非要实现曲线的效果,那就需要足够的点,最终实现化直为曲的效果.
举个类似的例子,three.js的球体,其实是无数个三角形构成的,三角形越多,球体就越圆.同样的道理:直线段分的段数越多,曲线就越圆滑,而构成直线段的要素是俩个点,也就是说:点越多,曲线就越圆.

所以,我们需要很多很多的点!

样条曲线

由于我们需要很多很多的点,我们便顺理成章的引入样条曲线的概念:样条曲线可以由几个关键的点生成一个点集,这样我们就可以用Meshline来生成一条曲线了
在这里插入图片描述

一个问题

在这里插入图片描述

也就是说,我们需要用Vector3保存最开始的点,
然后用样条曲线有限的点集生成更多的点集,
最用将生成的点集转化为[x,y,z]的格式

var init_points, tmpPoints, final_points, line;
    function init() {
      init_points = [];
      final_points = [];
	
	//1.先计算几个关键点,键关键点放在init_points(Vector3的格式)中
      for (var i = 0; i < Dental_arch_line.length; i += 1) {
        Dental_arch_line[i].y += 10;
        var vec = new THREE.Vector3(Dental_arch_line[i].x, Dental_arch_line[i].y, Dental_arch_line[i].z);
        init_points.push(vec);
      }

	//2.使用样条曲线,使用init_points点集生成更多的点集tmpPoints(Vector3的格式)
      // 假设 points 是一个包含 THREE.Vector3 对象的数组
      var curve = new THREE.CatmullRomCurve3(init_points);

      // 获取曲线上的点(您可以根据需要调整分段数量)
      tmpPoints = curve.getPoints(100); // 这里的 100 表示曲线将被分成100段
      console.log('tmpPoints:', tmpPoints);//此时,将牙弓线变成了100个点

	//3.将生成的点集tmpPoints(Vector3的格式)转换成final_points([x,y,z]的格式)
      //还需要进一步转换,将Vector3的类型变成[x,y,z]的格式
      for (var i = 0; i < tmpPoints.length; i += 1) {
        final_points.push([tmpPoints[i].x, tmpPoints[i].y, tmpPoints[i].z]);
      }


	//4.然后MeshLine就可以用了final_points这种格式了
      line = new MeshLine();
      line.setPoints(final_points.flat());

      var material = new MeshLineMaterial({
        color: new THREE.Color(0x00FFFF),
        lineWidth: 1,
      });
      var mesh = new THREE.Mesh(line, material);

      scene.add(mesh);
    }
  • 补充:

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

python222网站实战(SpringBoot+SpringSecurity+MybatisPlus+thymeleaf+layui)-Tag标签管理实现

锋哥原创的SpringbootLayui python222网站实战&#xff1a; python222网站实战课程视频教程&#xff08;SpringBootPython爬虫实战&#xff09; ( 火爆连载更新中... )_哔哩哔哩_bilibilipython222网站实战课程视频教程&#xff08;SpringBootPython爬虫实战&#xff09; ( 火…

2023年CSDN年底总结-独立开源创作者第一年

2023年最大的变化&#xff0c;就是出来创业&#xff0c;当独立开源创作者&#xff0c;这一年发起SolidUI开源项目&#xff0c;把知乎重新开始运营起来。CSDN粉丝破万&#xff0c;CSDN博客专家和AI领域创作者。 2023年年度关键词&#xff1a;创业 https://github.com/CloudOrc…

HCIP:三层架构

配置r1 配置r2 给sw1在vlanif1上配地址&#xff0c;并且ping 23.1.1.1 可通 给sw2配地址 在sw1上做汇总 在sw2上做汇总 在sw1上启动 在sw2上启动 在sw1上启动vlan 在sw2上启动vlan 在sw1上给接口配置vlan 在sw2上给接口配置vlan 在sw3上划分vlan 在sw4上划分vlan 给sw5划分vlan…

小红书如何做混部?

作者&#xff1a;宋泽辉&#xff08;小红书&#xff09;、张佐玮&#xff08;阿里云&#xff09; 编者按&#xff1a; Koordinator 是一个开源项目&#xff0c;是基于阿里巴巴内部多年容器调度、混部实践经验孵化诞生&#xff0c;是行业首个生产可用、面向大规模场景的开源混…

【RabbitMQ】延迟队列之死信交换机

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是Java方文山&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的专栏《RabbitMQ实战》。&#x1f3af;&#x1f3af; &am…

10.多柱状图(MuliBarChart)

愿你出走半生,归来仍是少年&#xff01; 环境&#xff1a;.NET 7、MAUI 话接上回&#xff08;9.单柱状图&#xff08;SingleBarChart&#xff09;&#xff09;&#xff0c;从单柱拓展到多柱状图。 1.数据设置 private void InitValue(List<BasicSerieDto> dtos){Serie…

[ACM学习] 进制转换

进制的本质 本质是每一位的数位上的数字乘上这一位的权重 将任意进制转换为十进制 原来还很疑惑为什么从高位开始&#xff0c;原来从高位开始的&#xff0c;可以被滚动地乘很多遍。 将十进制转换为任意进制

泽众云真机-机型集中化运维方案升级全面完成

2024年元月份&#xff0c;泽众云真机运维团队&#xff0c;经过几个月软硬件多轮安装调试&#xff0c;机型集中化运维方案升级全面完成。解决了云真机的机型集中化运维难题&#xff0c;方便了运营人员手机管理。 具体如下&#xff1a; 1、集中化运维&#xff0c;如服务器、PC、…

数学建模学习笔记||一文了解美赛论文如何写作

目录 ​编辑 Title/标题 要求 形式 Summary Sheet/摘要 要求 三要素 书写特点 内容 开头段 中间段 格式 内容 结尾段 关键词 Contents/目录 Introduction/引言 Problem Background/问题背景 Restatement of the Problem/问题重述 Literature Review/文献综…

RabbitMQ 笔记一

概览&#xff1a; MQ基本概念 RabbitMQ入门 基本工作模 1.MQ是什么&#xff1f; MQ:Message Queue, 存储消息的中间件&#xff0c;是消息发送过程中的暂存容器&#xff0c;主要用于解决分布式系统进程间的通信。 分布式系统通信的两种方式&#xff1a;直接远程调用、借助第三…

vue---打印本地当前时间Demo

<template><view class"content" tap"getCurrentTime()">打印时间</view> </template><script>export default {data() {return {title: Hello}},onLoad() {},methods: {getCurrentTime() {//获取当前时间并打印var _this …

E7数据库备份和恢复

E7数据库备份和恢复 一、实验目的 在Mysql上&#xff0c;学习如何备份数据库和恢复的各种方法。 二、实验要求: 1、基本硬件配置:英特尔Pentium III 以上,大于4G内存&#xff1b; 2、软件要求:Mysql&#xff1b; 3、时间:1小时&#xff1b; 4、撰写实验报告并按时提交。 三、…

windows下git pull超时,ping不通github

报错 ssh: connect to host github.com port 22: Connection timed out fatal: Could not read from remote repository. Please make sure you have the correct access rights and the repository exists. 解决办法 修改hosts 最后加一行&#xff0c;文件位置&#xff1a;…

利用 “diart“ 和 OpenAI 的 Whisper 简化实时转录

利用 "diart" 和 OpenAI 的 Whisper 简化实时转录 工作原理 Diart 是一个基于人工智能的 Python 库&#xff0c;用于实时记录说话者语言&#xff08;即 "谁在什么时候说话"&#xff09;&#xff0c;它建立在 pyannote.audio 模型之上&#xff0c;专为实时…

Ubuntu 22.04安装Nginx负载均衡

君衍. 一、编译安装Nginx二、轮询算法实现负载均衡三、加权轮询算法实现负载均衡四、ip_hash实现负载均衡 一、编译安装Nginx 这里我们先将环境准备好&#xff0c;我使用的是Ubuntu22.04操作系统&#xff1a; 这个是我刚安装好的&#xff0c;所以首先我们进行保存快照防止安装…

金融OCR领域实习日志(二)——四种OCR模型效果测试(附图)

文章目录 四种模型ocr效果简单测试模型场景1.paddle框架下PP-OCRv31.1.效果如下&#xff1a;1.2.总结 2.paddle框架下ppocr_server_v22.1.效果如下2.2.总结 3.CnOCR3.1.效果如下3.2.总结 4.TesseractOCR4.1.效果如下4.2.总结 5.后续想法 四种模型ocr效果简单测试 模型 PP-OCR…

文件操作---C++

文件操作目录 1.文本文件1.1写文件1.2读文件1.2.1第一种方式&#xff1a;流输入方式1.2.2第二种方式&#xff1a;getline成员函数1.2.3第三种方式&#xff1a;getline全局函数1.2.4第四种方式&#xff1a;按一个一个字符读取 2.二进制文件2.1写文件2.2读文件 程序运行时产生的数…

【C++进阶】STL容器--list使用迭代器问题分析

目录 前言 1. list的基本使用 1.1 list构造函数 1.2 list迭代器 1.3 list capacity 1.4 list元素访问 1.5 list 修改操作 insert erase swap resize clear 2. list失效迭代器问题 3. list使用算法库函数问题 总结 前言 list&#xff08;链表&#xff09;在C中非常重要…

分享7种SQL的进阶用法

分享7种SQL的进阶用法 前言 还只会使用SQL进行简单的insert、update、detele吗&#xff1f;本文给大家带来7种SQL的进阶用法&#xff0c;让大家在平常工作中使用SQL简化复杂的代码逻辑。 1.自定义排序&#xff08;ORDER BY FIELD&#xff09; 在MySQL中ORDER BY排序除了可以…

vue模拟聊天页面列表:滚动到底部,滚动到顶部触发加载更多

先看下效果&#xff1a; 代码&#xff1a; <template><div><div style"text-align: center"><button click"scrollTop">滚动到顶部</button><button click"scrollBottom">滚动到底部</button></d…