【threejs】飞线效果

时间:2025-04-07 17:21:56
/** * 创建线条模型 */ var geometry = new THREE.BufferGeometry(); //创建一个缓冲类型几何体 // 三维样条曲线 var curve = new THREE.CatmullRomCurve3([ new THREE.Vector3(100, 0, -100), new THREE.Vector3(0, 80, 0), // new THREE.Vector3(0, 80, 90), new THREE.Vector3(-100, 0, 100), ]); //曲线上等间距返回多个顶点坐标 var points = curve.getSpacedPoints(100); //分段数100,返回101个顶点 // setFromPoints方法从points中提取数据赋值给 geometry.setFromPoints(points); var material = new THREE.LineBasicMaterial({ color: 0x006666, //轨迹颜色 }); //线条模型对象 var line = new THREE.Line(geometry, material); scene.add(line); var index = 20; //取点索引位置 var num = 10; //从曲线上获取点数量 var points2 = points.slice(index, index + num); //从曲线上获取一段 var geometry2 = new THREE.BufferGeometry(); geometry2.setFromPoints(points2); // 批量计算所有顶点颜色数据 var posNum = points2.length - 2; //分界点黄色,两端和轨迹线一个颜色青色 var colorArr = []; for (var i = 0; i < points2.length; i++) { var color1 = new THREE.Color(0x006666); //轨迹线颜色 青色 var color2 = new THREE.Color(0xffff00); //黄色 var color = null; // 飞线段里面颜色设置为黄色,两侧设置为青色,也就是说中间某个位置向两侧颜色渐变 if (i < posNum) { color = color1.lerp(color2, i / posNum) } else { color = color2.lerp(color1, (i - posNum) / (points2.length - posNum)) } colorArr.push(color.r, color.g, color.b); } // 设置几何体顶点颜色数据 geometry2.attributes.color = new THREE.BufferAttribute(new Float32Array(colorArr), 3); var material2 = new THREE.LineBasicMaterial({ // color: 0xffff00, //轨迹颜色 vertexColors: THREE.VertexColors, //使用顶点颜色,不用设置color linewidth: 3.0, // 设置线宽 }); //线条模型对象 var line2 = new THREE.Line(geometry2, material2); scene.add(line2);