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
}