three.js绘制宽度大于1的线,并动态新增顶点

three.js提供的两种线,Line 和 Line2 有所区别。前者只支持宽度为1的线,后者则支持任意线宽。

按照官方示例,可以很容易绘制出已确定顶点位置的线要素(静态的线)

然而很多时候我们都需要动态的往线要素里添加新的顶点,网上查了很多资料,大体思路都是构造新的几何体(LineGeometry)替换已有线对象的几何体,然后重新设置点位(line.geometry = new LineGeometry(); line.geometry.setPositions(positions););或是移除原有的线,然后构造新的线对象。这两种方式原理相似,如果在频繁加入顶点的情况下,会造成明显的性能问题。

我认为更好的做法是对已有线几何体的顶点位置做更新。由于改变顶点缓冲区的大小会耗费性能,基本等同于创建新几何体的开销。因此,初始给一个比较大的顶点容量,这样不用担心顶点不够用要去重新构建几何体对象了。

javascript 复制代码
const maxPoints = 100; // 最多支持的顶点个数
const geometry = new LineGeometry();
geometry.setPositions(new Float32Array(maxPoints * 3));
const material = new LineMaterial({ 
  color: 0xffffff,
  linewidth: 3,
});
const line = new Line2(geometry, material);
scene.add(line);

创建线要素时分配较大的缓冲区用于存放顶点位置

在有新顶点加入时更新缓冲区内的顶点数据就行。Line2 继承了 LineSegments2 ,由一系列线段组成,同时采用实例化方式绘制,因此使用方式和 Line 有些区别。更新 instanceStart 属性改变某一段的起点位置,更新 instanceEnd 属性改变某一段的终点位置,用 instanceCount 属性代替 setDrawRange 方法限制实际绘制的顶点个数(预留的缓冲区较大,实际只用到了一部分)。示例代码如下。

javascript 复制代码
const instanceIndex = pointsCount < 3 ? 0 : (pointsCount - 3) + 1; // 折线的第几段,从0开始计数
if (pointsCount == 1) {
	line.geometry.attributes.instanceStart.setXYZ(instanceIndex, newPosition[0], newPosition[1], newPosition[2]);
} else {
	line.geometry.attributes.instanceEnd.setXYZ(instanceIndex, newPosition[0], newPosition[1], newPosition[2]);
	line.geometry.attributes.instanceStart.setXYZ(instanceIndex + 1, newPosition[0], newPosition[1], newPosition[2]);
	line.geometry.attributes.instanceStart.needsUpdate = true;
	line.geometry.attributes.instanceEnd.needsUpdate = true;
	line.geometry.instanceCount = pointsCount - 1;
}

添加新的顶点位置到线要素

|---|
| |

动态绘制宽度大于1的线

相关推荐
总要学点什么12 小时前
第89篇:三维特效-螺旋圆效果——让螺旋臂卷起一圈圈外扩的涟漪
开发语言·javascript·ecmascript·webgl·cesium·空间分析·1024程序员节
暴走约伯20 小时前
【VFX工具链源码拆解 02】告别机械劳动(上):一键统改百个子粒子颜色与批量重命名
3d·unity·c#·材质
GoldenSpider.AI1 天前
一张户型图做成浏览器 3D 漫游:house.json 统一模型、1.2 m 剖切图纸与分阶段验收
ai编程·webgl·three.js·3d漫游·claude code
Solange__1 天前
AI世界模型、3D场景生成和游戏引擎怎么选?按5类任务比较交互、物理与导出
开发语言·人工智能·游戏·平面·3d·自然语言处理·游戏引擎
Solange__1 天前
物流园区怎么用AI生成3D调度预演?从道路底图、车辆转弯到网页评审
图像处理·人工智能·游戏·3d·ai·自然语言处理·关卡设计
言乐62 天前
通过 3D 动画直观演示球形瓶内可滑动半圆机构在倾倒时防粘盖、回正时刮膏体的运动学过程
python·3d·django·virtualenv·pygame
苏州福兰克2 天前
没有3D内容,裸眼3D显示器还能用吗?
3d·计算机外设
慧都CAD开发笔记2 天前
汽车零部件检测软件如何用统一接口直读多种 CAD:3D InterOp 的三类数据接入
3d·汽车
苏州福兰克2 天前
长期看裸眼3D显示器容易视觉疲劳吗?
3d·计算机外设
苏州福兰克2 天前
商用裸眼3D显示器和家用款主要差别在哪里?
3d·计算机外设