three.js中Meshline库的使用

本文介绍了在three.js中如何使用MeshLine库替代内置线功能,特别是处理线段粗细和曲线生成的需求。作者详细展示了MeshLine的安装、入门示例以及如何利用样条曲线创建更平滑的曲线效果。
摘要由CSDN通过智能技术生成

库的地址

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

在这里插入图片描述

  • 14
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
three.js是一种用于在Web浏览器上创建并呈现3D图形的JavaScript。它提供了丰富的功能和工具,可以实现各种复杂的三维效果。动态线是在three.js创建的一种特殊的几何体,称为MeshLine。 通过使用MeshLine,我们可以在three.js创建出具有动态效果的线条。MeshLine可以用于绘制平滑的曲线、动画路径、连接不同点之间的线条等等。 创建一个动态线需要以下几个步骤: 1. 创建一个网格线的材质(Material):在three.js,我们可以使用MeshLineMaterial来定义网格线的材质。该材质可以设置线条的颜色、宽度、透明度等属性。 2. 创建一个空的几何体(Geometry):使用MeshLine的构造函数来创建一个空的几何体。这将成为我们动态线的基础。 3. 添加线条的顶点:通过向几何体的顶点数组添加点的坐标,我们可以定义出一条线的形状。可以通过遍历数组,逐个添加点的坐标,也可以使用内置的函数来添加点的坐标。 4. 创建线条的缓冲区(BufferGeometry):将添加了顶点的几何体转换为缓冲区几何体。这样可以提高渲染性能。 5. 创建动态线条的网格(Mesh):使用MeshLine的构造函数来创建网格对象,并传入缓冲区几何体和网格线材质。 6. 将网格对象添加到场景:通过将网格对象添加到场景,就可以实现动态线条的显示。 通过在更新循环不断修改网格线的顶点坐标,可以实时改变动态线的形状。例如,可以使用Tween.js来平滑地过渡线条的形状。 总结:使用MeshLine可以在three.js创建出具有动态效果的线条。通过设置网格线的材质、添加顶点、创建缓冲区几何体和网格对象,并将其添加到场景,就可以实现动态线的显示。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

踏过山河,踏过海

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值