对载入的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.rx、params.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()用旋转矩阵mx、my和mz构建 4x4 变换矩阵,这样可以保持原始矩阵的 3x3 部分用于旋转,最后的平移部分默认为零,因为我们现在只关心旋转。
2. 平移变换:
var position = Cesium.Cartesian3.fromDegrees(params.tx, params.ty, params.tz);
var m = Cesium.Transforms.eastNorthUpToFixedFrame(position);
params.tx、params.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和旋转矩阵(rotationX、rotationY和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 模型根节点的变换矩阵,通过设置这个矩阵来应用变换,从而影响整个模型或场景的显示。
变换矩阵组合的顺序:
在这个代码中,变换是按以下顺序应用的:
- 平移:首先将模型平移到指定的位置(
position)。 - 旋转:接下来按指定角度绕 X、Y、Z 轴分别旋转模型。
- 缩放:最后应用一个均匀的缩放因子,改变模型的大小。
通过这种顺序,我们可以精确地控制模型的位置、方向和大小。
代码的作用总结:
这段代码实际上是在计算一个 综合的变换矩阵,它包括了平移、旋转和缩放,并将该矩阵应用到模型的根节点上,从而影响整个模型的显示。通过调整 params 对象中的参数,你可以控制模型的最终位置、方向和尺寸。
params.rx、params.ry、params.rz:控制旋转的角度。params.tx、params.ty、params.tz:控制平移的经度、纬度和高度。params.scale:控制模型的缩放因子。
最终,通过这种方式,模型将按照指定的变换在 Cesium 中呈现。
相关文章:
对载入的3dtiles进行旋转、平移和缩放变换。
使用 params: {tx: 129.75845, //模型中心X轴坐标(经度,单位:十进制度)//小左ty: 46.6839, //模型中心Y轴坐标(纬度,单位:十进制度)//小下tz: 28, //模型中心Z轴坐标(高…...
Rust个人认为将抢占C和C++市场,逐渐成为主流的开发语言
本人使用C开发8年、C#开发15年、中间使用JAVA开发过项目、后期在学习过程中发现了Rust语言说它是最安全的语言,能够解决C、C的痛点、于是抽出一部分时间网上买书,看网上资料进行学习,这一学习起来发现和其它语言比较起来,在编码的…...
在openEuler中使用top命令
在openEuler中使用top命令 概述 top 命令是Linux系统中最常用的实时性能监控工具之一,允许用户查看系统的整体状态,包括CPU使用率、内存使用情况、运行中的进程等。本文档将详细介绍如何在openEuler操作系统中有效利用top命令进行系统监控。 启动top命令 打开终端并输入t…...
探索文件系统,Python os库是你的瑞士军刀
文章目录 探索文件系统,Python os库是你的瑞士军刀第一部分:背景介绍第二部分:os库是什么?第三部分:如何安装os库?第四部分:简单库函数使用方法1. 获取当前工作目录2. 改变当前工作目录3. 列出目…...
【小白学机器学习41】如何从正态分布的总体中去抽样? 获得指定正态分布的样本的2种方法
目录 1 目标:使用2种方法,去从正态分布的总体中去抽样,获得样本 1.1 step1: 首先,逻辑上需要先有符合正态分布的总体population 1.2 从总体中取得样本,模拟抽样的过程 2 从正态分布抽样的方法1 3 从正态分布抽样…...
将VSCode设置成中文语言环境
目录 VSCode默认是英文语言环境,这对于像我这种英语比较菜的人来说不是那么友好 另外也习惯了用中文,所以接下来介绍下如何将VSCode设置成中文语言环境。 1、打开VSCode软件,按快捷键【CtrlShiftP】 2、在弹出的搜索框中输入【configure l…...
Applied Intelligence投稿
一、关于手稿格式: 1、该期刊是一个二区的,模板使用Springer nature格式, 期刊投稿要求,详细期刊投稿指南,大部分按Soringernature模板即可,图片表格声明参考文献命名要求需注意。 2、参考文献ÿ…...
AI-agent矩阵营销:让品牌传播无处不在
矩阵营销是一种通过多平台联动构建品牌影响力的策略,而 AI-agent 技术让这一策略变得更加智能化。AI社媒引流王凭借其矩阵管理功能,帮助品牌在多个平台上实现深度覆盖与精准传播。 1. 矩阵营销的优势 品牌触达更广:多平台联动可以覆盖不同用…...
【0346】Postgres内核 Startup Process 通过 signal 与 postmaster 交互实现 (5)
1. Startup Process 进程 postmaster 初始化过程中, 在进入 ServerLoop() 函数之前,会先通过调用 StartChildProcess() 函数来开启辅助进程,这些进程的目的主要用来完成数据库的 XLOG 相关处理。 如: 核实 pg_wal 和 pg_wal/archive_status 文件是否存在Postgres先前是否发…...
NSSCTF-做题笔记
[羊城杯 2020]easyre 查壳,无壳,64位,ida打开 encode_one encode_tow encode_three 那么我们开始一步一步解密,从最外层开始 def decode_three(encrypted_str):decrypted_str ""for char in encrypted_str:char_code …...
【小白学机器学习35】数据表:整洁数据表,交叉表/列联表,以及两者转化pd.pivot_table()
目录 1 虽然这是个很基础的知识,但是我觉得有必要记录下 2 整洁数据表 3 交叉数据表的2种形式 3.0 交叉表的名字 3.1 2维的交叉表 3.2 用2维表现3维的 3.3 上述内容,具体的markdown文本 4 交叉数据表 4.1 交叉数据表并不整洁 4.2 但是交叉表也…...
springboot旅游管理系统的设计与实现
springboot旅游管理系统的设计与实现 如需源码pc端👉👉👉资源 手机端👉👉👉资源 摘 要 信息化社会内需要与之针对性的信息获取途径,但是途径的扩展基本上为人们所努力的方向,由于…...
k8s 1.28 聚合层部署信息记录
–requestheader-client-ca-file –requestheader-allowed-namesfront-proxy-client –requestheader-extra-headers-prefixX-Remote-Extra- –requestheader-group-headersX-Remote-Group –requestheader-username-headersX-Remote-User –proxy-client-cert-file –proxy-cl…...
自由学习记录(25)
只要有修改,子表就不用元表的参数了,用自己的参数(只不过和元表里的那个同名) 子表用__index“继承”了父表的值,此时子表仍然是空表 一定是创建这样一个同名的变量在原本空空的子表里, 传参要传具体的变…...
关于函数式接口和编程的解析和案例实战
文章目录 匿名内部类“匿名”在哪里 函数式编程lambda表达式的条件Supplier使用示例 ConsumeracceptandThen使用场景 FunctionalBiFunctionalTriFunctional 匿名内部类 匿名内部类的学习和使用是实现lambda表达式和函数式编程的基础。是想一下,我们在使用接口中的方…...
Linux 僵尸进程和孤儿进程, 进程优先级
僵尸进程 之间在进程状态中了解到了 "僵尸状态". 那么处于僵尸状态的进程就是僵尸进程. 僵尸状态是一种特殊的进程状态, 它表示一个进程已经完成执行, 但其父进程尚未回收其终止状态. "僵尸状态" 的本质就是死亡状态. 如何理解僵尸进程: 举个例子: 一个正…...
爬虫笔记24——纷玩岛自动抢票脚本笔记
纷玩岛自动抢票,协议抢票思路实现 一、获取Authorization凭证二、几个关键的参数三、几个关键的接口获取参数v,这个参数其实可以写死,可忽略通过价位获取演出的参数信息获取观演人信息,账号提前录入即可提交订单接口 先看实现图&a…...
《白帽子讲Web安全》15-16章
《白帽子讲Web安全》15-16章 《白帽子讲Web安全》15章15、Web Server配置安全15.1、Apache安全15.2、Nginx安全15.3、jBoss远程命令执行15.4、Tomcat远程命令执行15.5、HTTP Parameter Pollution15.6、小结 第四篇 互联网公司运营安全《白帽子讲Web安全》16章16、互联网业务安全…...
计算机毕业设计Python+LSTM天气预测系统 AI大模型问答 vue.js 可视化大屏 机器学习 深度学习 Hadoop Spark
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...
大语言模型压缩技术;推理优化技术;SparseGPT算法;GPTQ算法
目录 大语言模型落地的成本、效率与效果 模型压缩技术 推理优化技术 SparseGPT算法 GPTQ算法 大语言模型落地的成本、效率与效果 模型压缩技术 模型压缩技术是大语言模型轻量化的关键。介绍了多种模型压缩方法,其中权重量化和模型稀疏化是两种主要的技术。 权重量化:权重…...
【磁盘】每天掌握一个Linux命令 - iostat
目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat(I/O Statistics)是Linux系统下用于监视系统输入输出设备和CPU使…...
基于当前项目通过npm包形式暴露公共组件
1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹,并新增内容 3.创建package文件夹...
高危文件识别的常用算法:原理、应用与企业场景
高危文件识别的常用算法:原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件,如包含恶意代码、敏感数据或欺诈内容的文档,在企业协同办公环境中(如Teams、Google Workspace)尤为重要。结合大模型技术&…...
Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信
文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…...
LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》
这段 Python 代码是一个完整的 知识库数据库操作模块,用于对本地知识库系统中的知识库进行增删改查(CRUD)操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 📘 一、整体功能概述 该模块…...
【JavaSE】多线程基础学习笔记
多线程基础 -线程相关概念 程序(Program) 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序,比如我们使用QQ,就启动了一个进程,操作系统就会为该进程分配内存…...
(一)单例模式
一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...
在 Spring Boot 项目里,MYSQL中json类型字段使用
前言: 因为程序特殊需求导致,需要mysql数据库存储json类型数据,因此记录一下使用流程 1.java实体中新增字段 private List<User> users 2.增加mybatis-plus注解 TableField(typeHandler FastjsonTypeHandler.class) private Lis…...
全面解析数据库:从基础概念到前沿应用
在数字化时代,数据已成为企业和社会发展的核心资产,而数据库作为存储、管理和处理数据的关键工具,在各个领域发挥着举足轻重的作用。从电商平台的商品信息管理,到社交网络的用户数据存储,再到金融行业的交易记录处理&a…...
使用SSE解决获取状态不一致问题
使用SSE解决获取状态不一致问题 1. 问题描述2. SSE介绍2.1 SSE 的工作原理2.2 SSE 的事件格式规范2.3 SSE与其他技术对比2.4 SSE 的优缺点 3. 实战代码 1. 问题描述 目前做的一个功能是上传多个文件,这个上传文件是整体功能的一部分,文件在上传的过程中…...
