ThreeJS绘制流动的虚线效果

Threejs绘制等距流动线

three.js flow line

Three中LineMaterial中支持将线渲染为虚线样式,通过在LineMaterial中引入时间,可以使虚线动起来,产生流动效果。具体效果图如下:

在这里插入图片描述
在这里插入图片描述

LineMaterial

Three中绘制线,是采用instance方式来绘制的,每个线段作为一个instance进行绘制,每个instance通过着色器来生成虚线效果。

绘制LineGeometry时,LineMaterial中可以通过指定dashed来将线样式渲染为虚线。直接打开LineMaterial.js文件可以看到,fragmentshader中通过对vLineDistance + dashOffset取余来划分虚线段,即超过dashsize的像素直接丢弃不进行渲染。

if ( mod( vLineDistance + dashOffset, dashSize + gapSize ) > dashSize )  discard; // todo - FIX

通过修改vLineDistance + dashOffset部分,即对这一部分累加距离,同时累加的距离同时间相关即可实现dash部分的移动。

这里我简化直接将丢弃的部分设置为绿色,同时将vLineDistance + dashOffset修改为:

if ( mod( vLineDistance + dashOffset + elasptime, dashSize + gapSize ) > dashSize ) {lxs_color.r=0.;lxs_color.g=1.;lxs_color.b=0.;} //discard; // todo - FIX

其中elasptime为渲染时间,类型为floatlxs_color线段颜色,类型为vec3

同时将修改后的颜色赋值给gl_FragColorgl_FragColor = vec4( lxs_color, diffuseColor.a );

到此,着色器部分修改完成.

将LineMaterial.js中的UniformsLib.Line中补充属性elasptime。同时在LineMaterial原型上添加属性elasptime,即可,完成对LineMateial的修改。

UniformsLib.line = {

	linewidth: { value: 1 },
	resolution: { value: new Vector2( 1, 1 ) },
	dashScale: { value: 1 },
	dashSize: { value: 1 },
	dashOffset: { value: 0 },
	gapSize: { value: 1 }, // todo FIX - maybe change to totalSize
	opacity: { value: 1 },
	elasptime: { value: 0 },

};
		elasptime:{
			enumerable:true,
			get:function(){
				return this.uniforms.elasptime.value;
			},
			set:function(value){
				this.uniforms.elasptime.value=value;
			}
		}

使用修改后的Material

这里直接使用项目中自带的webgl_lines_fat.html,来进行测试。将animate方法中添加itimes作为渲染时间,用来对应material中的elasptime,使用如下代码传入matLine.elasptime=itimes/1000.;,打开页面,勾选dashed选项时,即可看到流动效果。

PS:虚线着色器还在阅读中。。。以上内容有待改进。。。

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中创建出具有动态效果线条。通过设置网格线的材质、添加顶点、创建缓冲区几何体和网格对象,并将其添加到场景中,就可以实现动态线的显示。
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值