Threejs绘制有宽度的线(Line2)

Line

在 API 中提供了 Line LineLoop LineSegments 三类线相关的物体, LineBasicMaterial LineDashedMaterial 两类材质,主要控制线的颜色,宽度等(线宽linewidth不生效)
在这里插入图片描述
由于底层 OpenGL 渲染的限制性,线宽的最大和最小值都只能为 1,线宽无法设置,那么线段之间的连接形状设置也就没有意义了,因此这三个设置项都是无法生效的。

Line2

如何解决线宽问题?
ThreeJS 官方提供了一个可以设置线宽的 demo,这个 demo 使用了扩展包 jsm 中的材质 LineMaterial、几何体 LineGeometry 和对象 Line2
官网DEMO
在这里插入图片描述

import * as THREE from 'three';
import { LineGeometry, LineMaterial, Line2 } from 'three/lib';

// 创建线条
const positions = []; // 顶点数据
positions.push(new THREE.Vector3(0, 0, 0));
positions.push(new THREE.Vector3(10, 0, 0));
const lineGeometry = new LineGeometry();
lineGeometry.setPositions(positions);

// 创建线条材质
const lineMaterial = new LineMaterial({
    color: 0xff0000, // 线条颜色
    linewidth: 2, // 线条宽度
    dashed: false, // 是否是虚线
});

// 创建 Line2 对象
const line = new Line2(lineGeometry, lineMaterial);
line.computeLineDistances(); // 计算线段距离以用于虚线材质

// 将线条添加到场景中
scene.add(line);

遗留问题

在使用Line2对象时,需要动态更新line2的位置(即改变positions数组),但是在创建完线添加到场景中后在调用lineGeometry.setPositions(arr)方法, 会造成线段不展示。
暂时只能通过线段销毁重新创建的方式更新线段,哪路大神路过,可以指点一下🙏🙏🙏

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Three.js 可以通过 THREE.Curve 和 THREE.Path 类来绘制线。 1. 首先,创建一个曲线对象。例如,创建一个二次贝塞尔曲线对象: ```javascript var curve = new THREE.QuadraticBezierCurve3( new THREE.Vector3(0, 0, 0), // 起点 new THREE.Vector3(50, 100, 0), // 控制点 new THREE.Vector3(100, 0, 0) // 终点 ); ``` 2. 使用 THREE.CurvePath 类来将多个曲线连接起来,形成一个路径: ```javascript var path = new THREE.CurvePath(); path.add(curve); ``` 3. 创建一个 THREE.TubeGeometry 对象,通过路径和细分数创建一个管道几何体: ```javascript var tubeGeometry = new THREE.TubeGeometry(path, 20, 2, 8, false); ``` 其中,参数说明如下: - path:路径对象。 - segments:沿曲线细分数。 - radius:管道半径。 - radialSegments:管道横向细分数。 - closed:是否闭合管道。 4. 创建一个 THREE.Mesh 对象,并将管道几何体作为其参数: ```javascript var material = new THREE.MeshBasicMaterial({ color: 0xff0000 }); var mesh = new THREE.Mesh(tubeGeometry, material); ``` 5. 将 mesh 添加到场景中即可: ```javascript scene.add(mesh); ``` 完整代码示例: ```javascript var curve = new THREE.QuadraticBezierCurve3( new THREE.Vector3(0, 0, 0), new THREE.Vector3(50, 100, 0), new THREE.Vector3(100, 0, 0) ); var path = new THREE.CurvePath(); path.add(curve); var tubeGeometry = new THREE.TubeGeometry(path, 20, 2, 8, false); var material = new THREE.MeshBasicMaterial({ color: 0xff0000 }); var mesh = new THREE.Mesh(tubeGeometry, material); scene.add(mesh); ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值