three.js中Meshline库的使用

news2024/12/24 3:03:36

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);
    }
  • 补充:

在这里插入图片描述

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

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

相关文章

一个监控小技巧,巧妙破解超低温冰箱难题!

在当今科技飞速发展的时代&#xff0c;超低温冰箱监控系统以其在各行各业中关键的温度控制和环境监测功能而备受关注。 超低温环境对于存储生物样本、药品和其他温度敏感物品至关重要&#xff0c;而监控系统则提供了实时、精准的环境数据&#xff0c;确保这些物品的质量和安全性…

(2)Elastix图像配准:参数文件(配准精度的关键)

文章目录 前言一、Elastix简介二、参数文件&#xff08;类型&#xff09;三、参数文件&#xff08;定义&#xff09;&#xff1a;由多个组件组成&#xff0c;每个组件包含多个参数。3.1、组件的相关参数3.2、图解组件3.2.1、图解 - 金字塔&#xff08;pyramid&#xff09;3.2.2…

Mediasoup Demo-v3笔记(二)——server.js和room.js分析

server.js 主要运行逻辑 async function run() {// Open the interactive server.await interactiveServer();// Open the interactive client.if (process.env.INTERACTIVE true || process.env.INTERACTIVE 1)await interactiveClient();// Run a mediasoup Worker.await…

基于node.js和Vue3的医院挂号就诊住院信息管理系统

摘要&#xff1a; 随着信息技术的快速发展&#xff0c;医院挂号就诊住院信息管理系统的构建变得尤为重要。该系统旨在提供一个高效、便捷的医疗服务平台&#xff0c;以改善患者就医体验和提高医院工作效率。本系统基于Node.js后端技术和Vue3前端框架进行开发&#xff0c;利用其…

spring中循环依赖问题、Servlet 的过滤器与 Spring 拦截器区别

spring中的循环依赖问题 当A类中关联B&#xff0c;B类中关联A class A {B b; } class B {A a; } 正常java代码中new A时&#xff0c;b为null&#xff1b;new B时&#xff0c;a为null&#xff1b; 但是在spring中&#xff0c;由于对象是由spring容器管理的&#xff0c;当创建…

Netty Reactor 模式解析

目录 Reactor 模式 具体流程 配置 初始化 NioEventLoop ServerBootstrapAcceptor 分发 Reactor 模式 在刚学 Netty 的时候&#xff0c;我们肯定都很熟悉下面这张图&#xff0c;它就是单Reactor多线程模型。 在写Netty 服务端代码的时候&#xff0c;下面…

vue 解决:Module not found: Error: Can‘t resolve ‘vue-router‘ 的问题

1、问题描述&#xff1a; 其一、报错为&#xff1a; Module not found: Error: Cant resolve vue-router 中文为&#xff1a; 找不到模块&#xff1a;错误&#xff1a;无法解析“vue-router” 其二、问题描述为&#xff1a; 根据报错的中文信息可知&#xff1a;应该是无法…

PWN入门Protostar靶场Stack系列

Protostar靶场地址 https://exploit.education/protostar/溢出 源码分析 #include <stdlib.h> #include <unistd.h> #include <stdio.h>int main(int argc, char **argv) {volatile int modified; //定义一个变量char buffer[64]; //给…

Git服务器、GitLab介绍及搭建、HIS代码托管、CI/CD概述、Jenkins部署、Jenkins插件、Jenkins工程构建

案例1&#xff1a;GitLab服务器搭建 使用rpm包本地部署GitLab服务器 #确认GitLab主机硬件配置[rootGitLab ~]# free -mtotal used free shared buff/cache availableMem: 3896 113 3691 8 90 3615…

day31WEB攻防-通用漏洞文件上传js验证mimeuser.ini语言特性

目录 1.JS验证 2.JS验证MIME 3.JS验证.user.ini 4.JS验证.user.ini短标签 &#xff08;ctfshow154&#xff0c;155关&#xff09; 5.JS验证.user.ini短标签过滤 [ ] 6.JS验证.user.ini短标签加过滤文件头 有关文件上传的知识 1.为什么文件上传存在漏洞 上传文件…

视频汇聚/云存储平台EasyCVR级联上级播放后一直发流是什么原因?

可视化云监控平台/安防视频监控系统EasyCVR视频综合管理平台&#xff0c;采用了开放式的网络结构&#xff0c;可以提供实时远程视频监控、视频录像、录像回放与存储、告警、语音对讲、云台控制、平台级联、磁盘阵列存储、视频集中存储、云存储等丰富的视频能力&#xff0c;同时…

大创项目推荐 题目: 基于深度学习的疲劳驾驶检测 深度学习

文章目录 0 前言1 课题背景2 实现目标3 当前市面上疲劳驾驶检测的方法4 相关数据集5 基于头部姿态的驾驶疲劳检测5.1 如何确定疲劳状态5.2 算法步骤5.3 打瞌睡判断 6 基于CNN与SVM的疲劳检测方法6.1 网络结构6.2 疲劳图像分类训练6.3 训练结果 7 最后 0 前言 &#x1f525; 优…

spire.doc合并word文档

文章目录 spire.doc合并word文档1. 引入maven依赖2. 需要合并的word3. 合并文档代码4. 合并结果 spire.doc合并word文档 1. 引入maven依赖 <repositories><repository><id>com.e-iceblue</id><name>e-iceblue</name><url>https://r…

JVM篇----第五篇

系列文章目录 文章目录 系列文章目录前言一、Java 中堆和栈有什么区别?二、描述一下 JVM 加载 class 文件的原理机制三、GC 是什么?为什么要有 GC?前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通…

LIMS源码,实验室信息系统源码,后端框架:asp.net

LIMS(laboratory information management system)即实验室信息管理系统是实验室管理科学发展的成果&#xff0c;是实验室管理科学与现代信息技术结合的产物&#xff0c;是利用计算机网络技术、数据存储技术、快速数据处理技术等&#xff0c;对实验室进行全方位管理的计算机软件…

利用tpu-mlir工具将深度学习算法模型转成算能科技平台.bmodel模型的方法步骤

目录 1 TPU-MLIR简介 2 开发环境搭建 2.1 下载镜像 2.2 下载SDK 2.3 创建容器 2.4 加载tpu-mlir 3 准备工作目录 4 onnx转mlir文件 5 mlir转INT8 模型 5.1 生成校准表 5.2 便以为INT8对称量化模型 参考文献&#xff1a; 之前是用nntc转算能科技的模型的&#xff0c…

ExperimentalWarning: The http2 module is an experimental API.

错误提示 Node.js:ExperimentalWarning: The fs.promises API is experimental原因是node的版本不是最新的&#xff0c;而在项目引入的模块是最新的&#xff0c;node.js的版本低于模块的版本&#xff1a; 解决方法: 1、升级版本 npm install -g npm 更新npm到最新版 npm ins…

【C++干货铺】 RAII实现智能指针

个人主页点击直达&#xff1a;小白不是程序媛 C系列专栏&#xff1a;C干货铺 代码仓库&#xff1a;Gitee 目录 为什么需要智能指针&#xff1f; 内存泄漏 什么是内存泄漏&#xff0c;内存泄露的危害 内存泄漏的分类 堆内存泄漏&#xff08;Heap leak&#xff09; 系统资…

内衣洗衣机有必要买吗?五款好用的迷你洗衣机推荐

冬天正在临近&#xff0c;普通的衣服有日常的洗衣机洗&#xff0c;但内衣裤就成了很多小伙伴的困扰&#xff0c;在我们的观念中&#xff0c;内衣裤是绝对不可以和普通的衣服一起清洗&#xff0c;在冰冷的冬季还要手洗这些贴身衣物&#xff0c;真的很难受&#xff0c;所以拥有一…

fpga外置flash程序烧录流程

Fpga外置FLASH程序烧录流程&#xff1a; step1&#xff1a; 打开vivado2019.2软件&#xff0c;找到hardware manager选项&#xff0c;进入该功能界面&#xff1b; Step2&#xff1a; 确定连接状态&#xff0c;当JTAG正确连接到板卡的调试插针后&#xff0c;会在状态窗口显示…