Cesium 自定义箭头坐标轴 圆坐标轴(一)

本文介绍了在Cesium中实现自定义箭头坐标轴和圆坐标轴的方法,包括利用矩阵运算创建primitive,通过调整材质、宽度和长度来绘制箭头坐标,以及通过获取坐标点并进行矩阵转换来绘制圆坐标。文章还提供了代码示例,并强调了坐标轴转换矩阵的重要性,为后续模型的平移和旋转操作奠定了基础。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Cesium 自定义箭头坐标轴 圆坐标轴(一)

箭头坐标轴和圆坐标轴

为了实现Cesium 对模型的拖拽平移和旋转,需要以模型为中心建立箭头坐标轴(沿坐标轴方向移动)和圆坐标轴(沿圆弧方向旋转)。
效果展示

实现思路

利用Cesium的矩阵运算,创建primitive,操作矩阵实现各种坐标轴。箭头坐标轴比圆坐标轴简单很多,Cesium内置了箭头材质,更改材质即可。

绘制箭头坐标

Cesium中添加图形的两种方法,一种是entities,一种是primitives。后者更适合开发,主要用到modelmatrix属性。添加箭头可以理解为添加同一个坐标起点的本地沿坐标轴方向的三条箭头线。
宽度和长度可根据需求自己调节。主要更改material即可。

// 创建x方向的箭头
  var arrowx = viewer.entities.add({
   
   
    name:"arrowx",
    polyline:{
   
   
      positions:Cesium.Cartesian3.fromDegreesArrayHeights([
        lon,lat,hei,lon+0.00003,lat,hei]),
      width:25,
      arcType:Cesium.ArcType.NONE,
      material:new Cesium.PolylineArrowMaterialProperty(Cesium.Color.RED),
    },
  });

依次画出y、z坐标。

绘制圆坐标

绘制圆坐标的话,用primitive来画,要用到modelmatrix。用线画圆可以调节圆的宽度。可以创建圆后,拿到圆的坐标,再用线绘制。
绘制圆,granularity越小,密度越大。

  var circle = new Cesium.CircleOutlineGeometry({
   
   
    center:Cesium.Cartesian3.fromDegrees(lan,lat,height),
    radius:3.0,
    granularity:0.001
  });
### 绘制带箭头的线段 在 Cesium 中,可以通过 `Polyline` 和 `PolylineArrowMaterialProperty` 来创建带有箭头效果的线段。以下是详细的实现方法: #### 使用 Entity 方式绘制箭头线 通过定义起点和终点坐标,并利用 `Cesium.PolylineArrowMaterialProperty` 设置材质属性来实现箭头效果。 ```typescript import * as Cesium from 'cesium'; // 初始化 Cesium Viewer const viewer = new Cesium.Viewer('cesiumContainer'); // 定义线条的起点和终点 (经纬度转三维笛卡尔坐标) var start = Cesium.Cartesian3.fromDegrees(-75.59777, 40.03883); var end = Cesium.Cartian3.fromDegrees(-80.50, 35.14); // 添加实体对象到场景中 viewer.entities.add({ polyline: { positions: Cesium.Cartesian3.fromDegreesArray([-75.59777, 40.03883, -80.50, 35.14]), // 起点和终点数组 width: 4, material: new Cesium.PolylineArrowMaterialProperty(Cesium.Color.YELLOW) // 箭头材质颜色 } }); // 飞向目标区域以便观察效果 viewer.zoomTo(viewer.entities); ``` 上述代码展示了如何使用 `Entity` 的方式绘制条带有黄色箭头的线段[^1]。 --- #### 自定义箭头样式 如果需要更复杂的自定义箭头形状(例如三角形或其他几何图形),可以考虑以下两种替代方案之: 1. **使用 PointPrimitiveCollection**:手动计算箭头方向并向末端添加个小三角形标记。 2. **使用 Billboard 图像资源**:将箭头图标作为纹理贴图附加在线条末端。 ##### 方法:PointPrimitiveCollection 示例 此方法适合动态调整箭头位置的情况。 ```typescript import * as Cesium from 'cesium'; const viewer = new Cesium.Viewer('cesiumContainer'); const primitives = viewer.scene.primitives; // 创建个 Primitive Collection const pointCollection = new Cesium.PointPrimitiveCollection(); primitives.add(pointCollection); // 计算箭头端点的位置偏移量 function addArrowTip(startPosition, directionVector, length) { const tipPosition = Cesium.Cartesian3.clone(startPosition); Cesium.Cartesian3.multiplyByScalar(directionVector, length, directionVector); Cesium.Cartesian3.add(tipPosition, directionVector, tipPosition); return tipPosition; } // 示例数据 let startPosition = Cesium.Cartesian3.fromDegrees(-75.59777, 40.03883); let endPosition = Cesium.Cartesian3.fromDegrees(-80.50, 35.14); // 获取方向矢量并标准化 let direction = Cesium.Cartesian3.subtract(endPosition, startPosition, new Cesium.Cartesian3()); direction = Cesium.Cartesian3.normalize(direction, direction); // 添加箭头尖端 pointCollection.add({ position: addArrowTip(endPosition, direction, 1e5), // 增加定长度表示箭头 color: Cesium.Color.RED, pixelSize: 10 }); ``` 这种方法允许灵活控制箭头的方向和大小[^2]。 --- #### 注意事项 - 如果希望提高性能,建议减少频繁更新的操作次数。 - 对于大规模的数据集渲染,推荐优先采用 `Primitives API` 替代传统的 `Entities API`。 ---
评论 27
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值