Cesium 中如何根据位置、方位(朝向)和间距绘制另一个点

在开发 Cesium 过程中,我曾经遇到过根据当前点的位置、方位(朝向)和间距来绘制另一个点?

虽然这个问题很简单,但是毕竟是亲身开发经历遇到过的问题,于是记录整理了这篇文章(当作是成长的脚印)。

效果

如图所示,青色圆点作为原点,然后,我向下 300 米绘制了红色圆点,向上 1000 米绘制了蓝色圆点,最后垂直向上 1000 米,向后 1600 米绘制绿色圆点。

过程

  1. 获取 CesiumJS 核心类Cesium.Viewer:
tsx 复制代码
const viewer = new Cesium.Viewer(cesiums.current, {
  contextOptions: {
    webgl: {
      alpha: true,
    },
  },
  selectionIndicator: false,
  animation: false, //是否显示动画控件
  baseLayerPicker: false, //是否显示图层选择控件
  geocoder: false, //是否显示地名查找控件
  timeline: false, //是否显示时间线控件
  sceneModePicker: false, //是否显示投影方式控件
  navigationHelpButton: false, //是否显示帮助信息控件
  infoBox: false, //是否显示点击要素之后显示的信息
  fullscreenButton: false,
});
viewerRef.current = viewer;
  1. 确定原点坐标:
tsx 复制代码
let center = Cesium.Cartesian3.fromDegrees(114.0535, 22.557904, 300);
  1. 根据原点,向下 300 米绘制了红色圆点:
tsx 复制代码
// 从具有东北向上轴的参考帧计算4x4变换矩阵以提供的原点为中心,以提供的椭球的固定参考系为中心。
let matrix = Cesium.Transforms.eastNorthUpToFixedFrame(center);
// 创建围绕z轴的旋转矩阵
let mx = Cesium.Matrix3.fromRotationX(Cesium.Math.toRadians(-90));
// 从Matrix3计算代表旋转的Matrix4实例和代表翻译的Cartesian3
let rotationX = Cesium.Matrix4.fromRotationTranslation(mx);
// 计算两个矩阵(matrix * rotationX)的乘积
Cesium.Matrix4.multiply(matrix, rotationX, matrix);
let redResult = Cesium.Matrix4.multiplyByPoint(
  matrix,
  new Cesium.Cartesian3(0, 300, 0),
  new Cesium.Cartesian3(),
);

setPoint(viewer, redResult, Cesium.Color.RED);
  1. 根据原点,向上 1000 米绘制了蓝色圆点:
tsx 复制代码
let matrix = Cesium.Transforms.eastNorthUpToFixedFrame(center);
let mx = Cesium.Matrix3.fromRotationX(Cesium.Math.toRadians(90));
let rotationX = Cesium.Matrix4.fromRotationTranslation(mx);
Cesium.Matrix4.multiply(matrix, rotationX, matrix);
let blueResult = Cesium.Matrix4.multiplyByPoint(
  matrix,
  new Cesium.Cartesian3(0, 1000, 0),
  new Cesium.Cartesian3(),
);

setPoint(viewer, blueResult, Cesium.Color.BLUE);
  1. 根据原点,垂直向上 1000 米,向后 1600 米绘制绿色圆点:

这里的垂直向上 1000 米,和绘制蓝色原点重合了,所以我在此基础上,来绘制绿点

tsx 复制代码
// 从具有东北向上轴的参考帧计算4x4变换矩阵以提供的原点为中心,以提供的椭球的固定参考系为中心。
let matrix = Cesium.Transforms.eastNorthUpToFixedFrame(blueResult);
// 创建围绕z轴的旋转矩阵
let mx = Cesium.Matrix3.fromRotationZ(Cesium.Math.toRadians(180));
// 从Matrix3计算代表旋转的Matrix4实例和代表翻译的Cartesian3
let rotationZ = Cesium.Matrix4.fromRotationTranslation(mz);
// 计算两个矩阵(matrix * rotationZ)的乘积
Cesium.Matrix4.multiply(matrix, rotationZ, matrix);
let greenResult = Cesium.Matrix4.multiplyByPoint(
  matrix,
  new Cesium.Cartesian3(0, 1600, 0),
  new Cesium.Cartesian3(),
);

setPoint(viewer, greenResult, Cesium.Color.GREEN);

知识点补充

  1. Cesium.Transforms.eastNorthUpToFixedFrame

通过调用 Cesium.Transforms.eastNorthUpToFixedFrame(enuPoint),将该点从东北天(East-North-Up,ENU)坐标系转换到固定坐标系,并得到一个变换矩阵 fixedFrameMatrix。

固定坐标系通常是一个全局坐标系,例如地球的固定坐标系可以是地球的惯性坐标系。

  1. Cesium.Matrix3.fromRotationX

Cesium.Matrix3.fromRotationX 方法是 Cesium JavaScript 库中的一个函数,用于创建一个绕 X 轴旋转的 3x3 旋转矩阵。

在三维图形学中,旋转矩阵用于描述对象或坐标系绕某个轴旋转的变换。

Cesium.Matrix3.fromRotationX 方法接收一个表示旋转角度的参数,并返回一个旋转矩阵,用于绕 X 轴进行旋转变换。

  1. Cesium.Matrix4.fromRotationTranslation

Cesium.Matrix4.fromRotationTranslation 方法是 Cesium JavaScript 库中的一个函数,用于创建一个旋转平移变换的 4x4 变换矩阵。

在三维图形学中,变换矩阵用于描述对象在三维空间中的旋转、平移和缩放等变换操作。

Cesium.Matrix4.fromRotationTranslation 方法接收一个旋转矩阵和平移向量作为参数,并返回一个包含旋转和平移变换的 4x4 变换矩阵。

  1. Cesium.Matrix4.multiply

Cesium.Matrix4.multiply 方法是 Cesium JavaScript 库中的一个函数,用于计算两个 4x4 矩阵的乘积。

在三维图形学中,矩阵乘法用于组合多个变换操作。 Cesium.Matrix4.multiply 方法接收两个 Cesium.Matrix4 对象作为参数,并返回它们的乘积结果,即一个新的 4x4 矩阵。

  1. Cesium.Matrix4.multiplyByPoint

Cesium.Matrix4.multiplyByPoint 方法是 Cesium JavaScript 库中的一个函数,用于将一个 4x4 变换矩阵与一个三维点进行相乘操作。

在三维图形学中,矩阵乘法用于将点或向量应用于变换矩阵。

Cesium.Matrix4.multiplyByPoint 方法接收一个 Cesium.Cartesian3 对象表示的三维点和一个 Cesium.Matrix4 对象表示的变换矩阵作为参数,并返回一个新的 Cesium.Cartesian3 对象,表示将点应用于变换矩阵后的结果。

相关资料

相关推荐
Laravel技术社区几秒前
用PHP8实现斗地主游戏,实现三带一,三带二,四带二,顺子,王炸功能(第二集)
前端·游戏·php
m0_738120721 小时前
应急响应——知攻善防Web-3靶机详细教程
服务器·前端·网络·安全·web安全·php
hh随便起个名7 小时前
力扣二叉树的三种遍历
javascript·数据结构·算法·leetcode
我是小路路呀8 小时前
element级联选择器:已选中一个二级节点,随后又点击了一个一级节点(仅浏览,未确认选择),此时下拉框失去焦点并关闭
javascript·vue.js·elementui
程序员爱钓鱼8 小时前
Node.js 编程实战:文件读写操作
前端·后端·node.js
PineappleCoder8 小时前
工程化必备!SVG 雪碧图的最佳实践:ID 引用 + 缓存友好,无需手动算坐标
前端·性能优化
JIngJaneIL9 小时前
基于springboot + vue古城景区管理系统(源码+数据库+文档)
java·开发语言·前端·数据库·vue.js·spring boot·后端
敲敲了个代码9 小时前
隐式类型转换:哈基米 == 猫 ? true :false
开发语言·前端·javascript·学习·面试·web
澄江静如练_9 小时前
列表渲染(v-for)
前端·javascript·vue.js