Threejs实现模拟管道液体流动

1,介绍

该示例使用的是 r95版本Three.js库。

主要实现功能:模拟管道液体流动。效果图如下:

2,主要说明

模拟管道液体流动实现步骤:创建管道,添加纹理,位移纹理实现流动效果。

如下函数:定义管道位置坐标,创建管道并赋予材质,并添加到场景中

function initTubeModel() {
	var pointsArr = [
		[42, 0, 10],
		[21, 0, 10],
		[21, 0, 1],
		[-3, 0, 1],
		[-3, 0, -18],
		[-10, 0, -18],
		[-10, 0, 5],
		[1, 0, 5],
		[1, 0, 24],
		[-27, 0, 24],
		[-27, 0, 18],
		[-46, 0, 19],
		[-46, 0, -4],
		[-25, 0, -6],
		[-25, 0, -19],
		[-35, 0, -20],
		[-35, 0, -26],
		[-30, 0, -30],
		[3, 0, -30]
	];
	var curve = createPath(pointsArr)
	var tubeGeometry = new THREE.TubeGeometry(curve, 1000, 0.5, 100, false);
	var textureLoader = new THREE.TextureLoader();
	texture = textureLoader.load('assets/textures/arrow1.jpg'); //./ZS箭头.svg  ./arrow.jpg
	// 设置阵列模式为 RepeatWrapping
	texture.wrapS = THREE.RepeatWrapping
	texture.wrapT = THREE.RepeatWrapping
	texture.repeat.x = 50;
	texture.repeat.y = 2;
	texture.offset.y = 0.5;

	var tubeMaterial = new THREE.MeshPhongMaterial({
		map: texture,
		transparent: true,
		color: 0x47d8fa,
		side: THREE.DoubleSide,
		//opacity: 0.4,
	});

	// 设置数组材质对象作为网格模型材质参数
	var mesh = new THREE.Mesh(tubeGeometry, tubeMaterial); //网格模型对象Mesh
	mesh.position.y = 2;
	mesh.rotateZ(3.14);
	mesh.scale.set(2, 2, 2);
	scene.add(mesh); //网格模型添加到场景中
}
function createPath(pointsArr) {
	pointsArr = pointsArr.map((point) => new THREE.Vector3(...point)); // 将参数数组转换成点数组的形式

	// 方法一:自定义三维路径 curvePath
	const path = new THREE.CurvePath();
	for (let i = 0; i < pointsArr.length - 1; i++) {
		const lineCurve = new THREE.LineCurve3(pointsArr[i], pointsArr[i + 1]); // 每两个点之间形成一条三维直线
		path.curves.push(lineCurve); // curvePath有一个curves属性,里面存放组成该三维路径的各个子路径
	}
	return path;
}

流动效果关键一步,动态刷新调用,位移材质 

function renderScene() {
	TWEEN.update();
	orbit.update();
	// 使用requestAnimationFrame函数进行渲染
	requestAnimationFrame(renderScene);
	renderer.render(scene, camera);
	texture.offset.x -= 0.04
}
  • 8
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

左本Web3D

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

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

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

打赏作者

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

抵扣说明:

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

余额充值