three.js 地图、地球可视化飞线轨迹线

参考资料:threejs中文网

threejs qq交流群:814702116

样条、贝塞尔曲线应用

曲线API在大屏可视化中的应用:地图大屏可视化地球大屏可视化

表示一个飞线曲线轨迹有多重方案,圆弧、椭圆弧、贝塞尔、样条…

比如你有一个项目,已知平面上两个点坐标(-100,-100)(100,100),需要生成一条飞线轨迹线,要求轨迹线把这两个点作为起始点,曲线有一定的高度。

三维样条曲线CatmullRomCurve3实现飞线轨迹

下面曲线的起始点设置在XOZ平面上,y方向为曲线高度方向。

// p1、p3轨迹线起始点坐标
const p1 = new THREE.Vector3(-100, 0, -100);
const p3 = new THREE.Vector3(100, 0, 100);
// 计算p1和p3的中点坐标
const x2 = (p1.x + p3.x)/2;
const z2 = (p1.z + p3.z)/2;
const h = 50;
const p2 = new THREE.Vector3(x2, h, z2);

const arr = [p1, p2, p3];
// 三维样条曲线
const curve = new THREE.CatmullRomCurve3(arr);

三维二次贝赛尔曲线QuadraticBezierCurve3实现飞线轨迹

下面曲线的起始点设置在XOZ平面上,y方向为曲线高度方向。

// p1、p3轨迹线起始点坐标
const p1 = new THREE.Vector3(-100, 0, -100);
const p3 = new THREE.Vector3(100, 0, 100);
// 计算p1和p3的中点坐标
const x2 = (p1.x + p3.x)/2;
const z2 = (p1.z + p3.z)/2;
const h = 100;
const p2 = new THREE.Vector3(x2, h, z2);
// 三维二次贝赛尔曲线
const curve = new THREE.QuadraticBezierCurve3(p1, p2, p3);
### 使用 D3.js 实现地图上的线效果 为了在地图上使用 D3.js 创建具有动态视觉效果的线,可以遵循以下方法: #### 1. 地图准备与数据加载 首先需准备好地理坐标数据以及要展示的地图底图。通常会利用 GeoJSON 文件来表示地理位置信息。 ```javascript // 加载GeoJson文件并投影转换成屏幕坐标系下的路径 const projection = d3.geoMercator().scale(100).translate([width / 2, height / 2]); const pathGenerator = d3.geoPath(projection); d3.json('path/to/geojson').then(function (data) { // 将地理坐标映射为SVG中的实际位置... }); ``` #### 2. 绘制基础弧线 基于给定的起点和终点构建贝塞尔曲线作为轨迹的基础形状[^2]。 ```javascript function getBezierCurve(startPoint, endPoint){ const controlX = startPoint[0]*0.7 + endPoint[0]*0.3; const controlY = startPoint[1]*0.7 + endPoint[1]*0.3; return `M${startPoint} C ${controlX},${controlY} ${(endPoint[0]+startPoint[0])/2},${ (endPoint[1]+startPoint[1])/2} ${endPoint}`; } ``` #### 3. 动画实现——通过 SVG 蒙版技术模拟“流动” 采用 SVG 的 `<mask>` 元素配合 CSS 或 JavaScript 来控制线条显示区域的变化,从而制造出一种光线沿着预定义路径传播的效果[^1]。 ```html <defs> <!-- 定义渐变颜色 --> <linearGradient id="line-gradient"> <stop offset="0%" style="stop-color:red; stop-opacity:1"/> <stop offset="100%" style="stop-color:blue; stop-opacity:.1"/> </linearGradient> <!-- 设置蒙板 --> <mask id="flying-line-mask"> <rect width="100%" height="100%" fill="#fff"></rect> <circle cx="0" cy="0" r="8" fill="#000"></circle> </mask> </defs> ``` ```javascript let line = g.append("path") .datum({ start:[], end:[] }) .attr("class", "flight-path") .style("stroke-width", 2) .style("fill", "none") .style("stroke-dasharray", function(d){return this.getTotalLength();}) .style("stroke-dashoffset", function(d){return this.getTotalLength();}) .transition() .duration(2000) .ease(d3.easeLinear) .style("stroke-dashoffset", 0); g.select(".flight-path").attr("d",getBezierCurve([x,y],[a,b])) .style("stroke","url(#line-gradient)") .attr("mask","url(#flying-line-mask)"); ``` 上述代码片段展示了如何组合使用 D3 和 SVG 特性,在网页中呈现美观且交互性强的地图线动画。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Threejs可视化

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

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

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

打赏作者

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

抵扣说明:

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

余额充值