当前位置: 首页 > news >正文

对载入的3dtiles进行旋转、平移和缩放变换。

 使用

params: {tx: 129.75845, //模型中心X轴坐标(经度,单位:十进制度)//小左ty: 46.6839, //模型中心Y轴坐标(纬度,单位:十进制度)//小下tz: 28, //模型中心Z轴坐标(高程,单位:米)rx: 0, //X轴(经度)方向旋转角度(单位:度)ry: 0, //Y轴(纬度)方向旋转角度(单位:度)rz: 1.6, //Z轴(高程)方向旋转角度(单位:度)小右scale: 0.8 //缩放比例},promise.then((result) => {this.update3dtilesMaxtrix(result, params) //改变位置
}

源码

 update3dtilesMaxtrix(tileset, params) {//旋转var mx = Cesium.Matrix3.fromRotationX(Cesium.Math.toRadians(params.rx))var my = Cesium.Matrix3.fromRotationY(Cesium.Math.toRadians(params.ry))var mz = Cesium.Matrix3.fromRotationZ(Cesium.Math.toRadians(params.rz))var rotationX = Cesium.Matrix4.fromRotationTranslation(mx)var rotationY = Cesium.Matrix4.fromRotationTranslation(my)var rotationZ = Cesium.Matrix4.fromRotationTranslation(mz)//平移var position = Cesium.Cartesian3.fromDegrees(params.tx, params.ty, params.tz)var m = Cesium.Transforms.eastNorthUpToFixedFrame(position)//旋转、平移矩阵相乘Cesium.Matrix4.multiply(m, rotationX, m)Cesium.Matrix4.multiply(m, rotationY, m)Cesium.Matrix4.multiply(m, rotationZ, m)//比例缩放var scale = Cesium.Matrix4.fromUniformScale(params.scale)Cesium.Matrix4.multiply(m, scale, m)console.log('矩阵m:', m)//赋值给tilesettileset._root.transform = m},

这段代码展示了如何在 CesiumJS 中为一个 3D Tiles 模型应用旋转、平移和缩放变换,并通过 tileset._root.transform 将最终的变换矩阵应用到模型的根节点(_root)。我将逐步解析代码的作用,并解释它如何组合成一个变换矩阵来影响模型的变换。

代码解析:

1. 旋转变换
var mx = Cesium.Matrix3.fromRotationX(Cesium.Math.toRadians(params.rx));
var my = Cesium.Matrix3.fromRotationY(Cesium.Math.toRadians(params.ry));
var mz = Cesium.Matrix3.fromRotationZ(Cesium.Math.toRadians(params.rz));
  • 这里首先为 X、Y 和 Z 轴上的旋转创建了三个 3x3 旋转矩阵params.rxparams.ry 和 params.rz 分别表示绕 X、Y 和 Z 轴旋转的角度,单位是度。Cesium.Math.toRadians() 将角度转换为弧度,因为 Cesium 使用弧度作为角度单位。
var rotationX = Cesium.Matrix4.fromRotationTranslation(mx);
var rotationY = Cesium.Matrix4.fromRotationTranslation(my);
var rotationZ = Cesium.Matrix4.fromRotationTranslation(mz);
  • Cesium.Matrix4.fromRotationTranslation() 用旋转矩阵 mxmy 和 mz 构建 4x4 变换矩阵,这样可以保持原始矩阵的 3x3 部分用于旋转,最后的平移部分默认为零,因为我们现在只关心旋转。
2. 平移变换
var position = Cesium.Cartesian3.fromDegrees(params.tx, params.ty, params.tz);
var m = Cesium.Transforms.eastNorthUpToFixedFrame(position);
  • params.txparams.ty 和 params.tz 分别是模型在 经纬度坐标系 中的平移量(经度、纬度、高度),单位是度。Cesium.Cartesian3.fromDegrees() 将这些经纬度值转换为 Cartesian3 坐标系中的坐标。
  • Cesium.Transforms.eastNorthUpToFixedFrame(position) 返回一个 从指定位置到地球坐标系的变换矩阵。这个矩阵将模型的局部坐标系(East-North-Up 坐标系)转换为世界坐标系(FixedFrame)。它用于将模型从地理坐标系中转换到地球固定坐标系中。
3. 旋转和平移矩阵的组合
Cesium.Matrix4.multiply(m, rotationX, m);
Cesium.Matrix4.multiply(m, rotationY, m);
Cesium.Matrix4.multiply(m, rotationZ, m);
  • 通过多次调用 Cesium.Matrix4.multiply(),将平移矩阵 m 和旋转矩阵(rotationXrotationY 和 rotationZ)依次相乘。矩阵乘法遵循从右到左的顺序,即首先应用绕 Z 轴的旋转,然后是绕 Y 轴的旋转,最后是绕 X 轴的旋转。
4. 缩放变换
var scale = Cesium.Matrix4.fromUniformScale(params.scale);
Cesium.Matrix4.multiply(m, scale, m);
  • Cesium.Matrix4.fromUniformScale(params.scale) 创建一个均匀缩放矩阵,其中 params.scale 是缩放因子。均匀缩放表示在所有轴上使用相同的比例因子。
  • Cesium.Matrix4.multiply(m, scale, m) 将缩放矩阵应用到之前的变换矩阵 m 上,完成缩放操作。
5. 最终矩阵应用到模型
tileset._root.transform = m;
  • 最终的变换矩阵 m 包含了平移、旋转和缩放的综合变换。tileset._root.transform 是 3D Tiles 模型根节点的变换矩阵,通过设置这个矩阵来应用变换,从而影响整个模型或场景的显示。

变换矩阵组合的顺序:

在这个代码中,变换是按以下顺序应用的:

  1. 平移:首先将模型平移到指定的位置(position)。
  2. 旋转:接下来按指定角度绕 X、Y、Z 轴分别旋转模型。
  3. 缩放:最后应用一个均匀的缩放因子,改变模型的大小。

通过这种顺序,我们可以精确地控制模型的位置、方向和大小。

代码的作用总结:

这段代码实际上是在计算一个 综合的变换矩阵,它包括了平移、旋转和缩放,并将该矩阵应用到模型的根节点上,从而影响整个模型的显示。通过调整 params 对象中的参数,你可以控制模型的最终位置、方向和尺寸。

  • params.rxparams.ryparams.rz:控制旋转的角度。
  • params.txparams.typarams.tz:控制平移的经度、纬度和高度。
  • params.scale:控制模型的缩放因子。

最终,通过这种方式,模型将按照指定的变换在 Cesium 中呈现。

http://www.lryc.cn/news/494499.html

相关文章:

  • Rust个人认为将抢占C和C++市场,逐渐成为主流的开发语言
  • 在openEuler中使用top命令
  • 探索文件系统,Python os库是你的瑞士军刀
  • 【小白学机器学习41】如何从正态分布的总体中去抽样? 获得指定正态分布的样本的2种方法
  • 将VSCode设置成中文语言环境
  • Applied Intelligence投稿
  • AI-agent矩阵营销:让品牌传播无处不在
  • 【0346】Postgres内核 Startup Process 通过 signal 与 postmaster 交互实现 (5)
  • NSSCTF-做题笔记
  • 【小白学机器学习35】数据表:整洁数据表,交叉表/列联表,以及两者转化pd.pivot_table()
  • springboot旅游管理系统的设计与实现
  • k8s 1.28 聚合层部署信息记录
  • 自由学习记录(25)
  • 关于函数式接口和编程的解析和案例实战
  • Linux 僵尸进程和孤儿进程, 进程优先级
  • 爬虫笔记24——纷玩岛自动抢票脚本笔记
  • 《白帽子讲Web安全》15-16章
  • 计算机毕业设计Python+LSTM天气预测系统 AI大模型问答 vue.js 可视化大屏 机器学习 深度学习 Hadoop Spark
  • 大语言模型压缩技术;推理优化技术;SparseGPT算法;GPTQ算法
  • Facebook的开源项目解析:推动开发者社区的技术进步
  • 力扣--LCR 149.彩灯装饰记录I
  • Rust SQLx CLI 同步迁移数据库
  • 批量生成不同用户的pdf 文件(html样式)
  • 混淆零碎知识点
  • 排序算法2
  • 【Web开发基础学习——corsheaders 应用的理解】
  • Redis和MySQL之间如何进行数据同步
  • css:转换
  • 状态管理与存储:Vuex 和 sessionStorage
  • Redis和MySQL保持一致性的延迟双删(Delay Double Delete)策略