3D Tiles的4x4的仿射变换矩阵

news2024/9/29 19:09:24

前言

项目需要,使用Cesium技术,把STL格式模型加载进去。

一、格式转换

第一步,先将STL文件转换为glTF格式
第二步,将glTF文件转换为3D Tiles格式,使用Cesium ion

二、矩阵整体结构

这个矩阵是一个4x4的仿射变换矩阵,用于在3D Tiles中描述模型的位置、旋转和缩放。

[
   a,  b,  c,  d, 
   e,  f,  g,  h, 
   i,  j,  k,  l, 
   m,  n,  o,  p
]
  • 第一到第三行前三列表示旋转矩阵
[
   a,  b,  c,  
   e,  f,  g,   
   i,  j,  k,  
]
  • 第四行前三列(m, n, o)表示平移向量,p为齐次坐标的标准形式。
[
   m, n, o,p
]

其实就是它的模型的位置
地心坐标系(ECEF: Earth-Centered, Earth-Fixed): 在这个坐标系中,地球的中心被定义为原点,X、Y、Z 轴固定在地球上并随地球自转。通常,X 轴指向本初子午线和赤道的交点,Y 轴指向90度经度和赤道的交点,Z 轴指向北极。

3D Tiles: 通常包含几何、材质、纹理等信息,使用的是地心坐标系来定义这些信息在地球表面的位置。

具体值替换,通过其他手段获取【模型目标放置位置】的经纬度,再转成地心坐标系ECEF。

三、经纬度转地心坐标系ECEF

将经纬度转换为地心坐标系 (ECEF, Earth-Centered, Earth-Fixed) 坐标系的步骤如下:

1. 了解坐标系

  • 经纬度: 地理坐标系,表示地球表面的位置。由纬度 (latitude, φ)、经度 (longitude, λ) 和高度 (altitude, h) 定义。

    • 纬度 φ: 从赤道向北或向南的角度,范围为 -90°(南极)到 90°(北极)。
    • 经度 λ: 从本初子午线向东或向西的角度,范围为 -180°(西)到 180°(东)。
    • 高度 h: 海拔高度,即点到地球表面的垂直距离。
  • 地心坐标系 (ECEF): 地心为原点,X 轴指向赤道与本初子午线的交点,Y 轴指向赤道与经度 90° 的交点,Z 轴指向北极。

2. 转换公式

要将经纬度 (φ, λ, h) 转换为地心坐标系下的 (X, Y, Z) 坐标,需使用以下公式:

在这里插入图片描述

3. 示例代码 (Python)

import math

def lat_lon_to_ecef(lat, lon, alt):
    # 常量
    a = 6378137.0  # 长半轴 (meters)
    b = 6356752.314245  # 短半轴 (meters)
    e2 = 1 - (b**2 / a**2)  # 离心率平方

    # 将角度转换为弧度
    lat_rad = math.radians(lat)
    lon_rad = math.radians(lon)

    # 计算N
    N = a / math.sqrt(1 - e2 * math.sin(lat_rad)**2)

    # 计算X, Y, Z
    X = (N + alt) * math.cos(lat_rad) * math.cos(lon_rad)
    Y = (N + alt) * math.cos(lat_rad) * math.sin(lon_rad)
    Z = ((1 - e2) * N + alt) * math.sin(lat_rad)

    return X, Y, Z

# 示例
lat = 52.2296756  # 纬度
lon = 21.0122287  # 经度
alt = 100  # 高度 (meters)

x, y, z = lat_lon_to_ecef(lat, lon, alt)
print(f"ECEF坐标: X={x}, Y={y}, Z={z}")

4. 结果解释

  • X, Y, Z 表示点在地心坐标系中的位置。
  • 在地心坐标系中,坐标的单位通常为米 (meters)。

5. 应用场景

  • 地图渲染:将经纬度转换为地心坐标系,用于三维地球模型或地图渲染。
  • 卫星导航:将卫星的经纬度位置转换为地心坐标系,用于定位和跟踪。

通过上述公式和代码,你可以将任何经纬度坐标转换为地心坐标系 (ECEF) 的三维坐标。

四、矩阵详细参数介绍

这个矩阵通常用于3D图形学中进行平移、旋转、缩放和投影变换。以下是该矩阵中每个字母的位置和意义的详细说明:

1. 矩阵形式

原矩阵格式为:

[ a, b, c, d ]
[ e, f, g, h ]
[ i, j, k, l ]
[ m, n, o, p ]

2. 每个字母的意义

a. 旋转与缩放部分(3x3部分):
  • [a, b, c]:第一行描述的是X轴方向的旋转和缩放。
  • [e, f, g]:第二行描述的是Y轴方向的旋转和缩放。
  • [i, j, k]:第三行描述的是Z轴方向的旋转和缩放。

具体来说:

  • a, f, k:沿着X、Y、Z轴的缩放因子。

变大变小,比如把加载进来的模型缩小10倍,这三个字母全部 乘 0.1 。剩下懂吧。

  • b, c, e, g, i, j:描述旋转的混合项,表示在X、Y、Z轴之间的旋转关系。
    在这里插入图片描述

注意!!!!!进行旋转操作前一定要先把缩放因子先全部改为1,旋转完后再改回去!!!

在这里插入图片描述
下面是使用Python实现计算3D仿真变换矩阵的代码,可以沿X轴、Y轴或Z轴旋转一个给定角度,并输出对应的旋转矩阵。

import numpy as np

def rotation_matrix_x(theta):
    """返回绕X轴旋转theta角度的4x4变换矩阵"""
    return np.array([
        [1, 0, 0, 0],
        [0, np.cos(theta), -np.sin(theta), 0],
        [0, np.sin(theta), np.cos(theta), 0],
        [0, 0, 0, 1]
    ])

def rotation_matrix_y(theta):
    """返回绕Y轴旋转theta角度的4x4变换矩阵"""
    return np.array([
        [np.cos(theta), 0, np.sin(theta), 0],
        [0, 1, 0, 0],
        [-np.sin(theta), 0, np.cos(theta), 0],
        [0, 0, 0, 1]
    ])

def rotation_matrix_z(theta):
    """返回绕Z轴旋转theta角度的4x4变换矩阵"""
    return np.array([
        [np.cos(theta), -np.sin(theta), 0, 0],
        [np.sin(theta), np.cos(theta), 0, 0],
        [0, 0, 1, 0],
        [0, 0, 0, 1]
    ])

# 示例:旋转45度(π/4弧度)
theta = np.pi / 4

# 计算沿X轴、Y轴、Z轴旋转的矩阵
R_x = rotation_matrix_x(theta)
R_y = rotation_matrix_y(theta)
R_z = rotation_matrix_z(theta)

print("Rotation matrix around X axis:\n", R_x)
print("Rotation matrix around Y axis:\n", R_y)
print("Rotation matrix around Z axis:\n", R_z)

说明

  1. theta 是旋转角度,以弧度为单位。如果你有角度,可以使用 np.radians(angle_in_degrees) 来转换为弧度。
  2. rotation_matrix_x, rotation_matrix_y, 和 rotation_matrix_z 函数分别计算绕X轴、Y轴、Z轴旋转的4x4变换矩阵。
  3. 输出结果是对应轴旋转后的4x4矩阵。

运行这个代码后,你会得到沿各轴旋转45度的变换矩阵。可以根据需要调整 theta 来得到不同的旋转矩阵。

b. 平移部分(第四列的前三个元素):
  • [d, h, l]:描述的是物体在X、Y、Z轴上的平移(移动)。
    • d:表示X轴方向的平移。
    • h:表示Y轴方向的平移。
    • l:表示Z轴方向的平移。
c. 齐次坐标部分(第四行):
  • [m, n, o]:理论上应该是[0, 0, 0],表示在平移变换中不涉及旋转或缩放的部分。
  • p:通常为1,表示齐次坐标系统中的一个常数,用于确保矩阵的维度一致性。

3. 简化的理解

  • 旋转a, f, k主要控制旋转的缩放因子,b, c, e, g, i, j控制不同轴之间的旋转关系。
  • 缩放a, f, k也可以控制物体在X、Y、Z轴方向上的缩放比例。
  • 平移d, h, l直接控制物体的移动。单位为米。
  • 齐次性p保证矩阵的齐次特性(通常为1),m, n, o通常为0。

4. 示例应用

  • 如果你只需要一个简单的平移矩阵,a=f=k=1, b=c=e=g=i=j=0, d, h, l分别是X, Y, Z方向的平移量,p为1。
  • 如果你只需要旋转,比如绕Z轴旋转θ角度,那么a=cos(θ), b=-sin(θ), e=sin(θ), f=cos(θ),其余元素为0或1(没有缩放和平移)。

5. 总结

  • a, f, k:控制X、Y、Z方向的缩放。
  • b, c, e, g, i, j:控制不同轴之间的旋转关系。
  • d, h, l:控制X、Y、Z方向的平移。
  • m, n, o:通常是0,表示没有额外的仿射变换。
  • p:通常为1,表示矩阵的齐次性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2087758.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

探索多模态人工智能:融合视觉、语言与声音的未来智能系统

前言 在这个信息爆炸的时代,人工智能(AI)已经渗透到我们生活的每一个角落,从智能手机的语音助手到自动驾驶汽车,再到医疗诊断和个性化推荐系统。然而,随着技术的进步,我们对智能系统的要求也在不…

[LLM][Prompt Engineering]:大语言模型上下文学习-What、How、Why?

上下文学习 上下文学习什么是上下文学习2. 示例的选择2.1 相关度排序2.2 集合多样性2.3 大语言模型 3. 示例格式3.1 人工标注3.2 利用大语言模型自动生成 4. 示例顺序5. 上下文学习为什么可以work5.1 能力来源5.2 ICL的能力 Reference 在GPT-3的论文中,OpenAI 研究团…

深度学习示例1-全零通道的 MNIST 数据训练模型

一、代码示例 from tensorflow import keras from tensorflow.keras import layers from tensorflow.keras.datasets import mnist import numpy as np(train_images, train_labels), _ = mnist.load_data() train_images = train_images.reshape((60000, 28 * 28)) train_ima…

基于FPGA的OV5640摄像头图像采集

1.OV5640简介 OV5640是OV(OmniVision)公司推出的一款CMOS图像传感器,实际感光阵列为:2592 x 1944(即500w像素),该传感器内部集成了图像出炉的电路,包括自动曝光控制(AEC…

基于深度学习的单目标跟踪系统

基于深度学习的单目标跟踪,效果吊打传统算法,3060显卡上达到实时,代码python和c两个版本都有。 基于深度学习的单目标跟踪系统是一种先进的计算机视觉技术,它可以实现实时的、高精度的目标跟踪。与传统的基于特征匹配或模板匹配的…

实现A-Z滑动检索菜单

写个这小玩意真麻烦 <template><div id"letterPeo"><!-- <button click"getasd">获取</button>--><div class"letter"><div v-for"(item, index) in letter" :key"index" clas…

高速接口IO片上SSN分析方法

Gbps信号在当今的高速IO设计中非常常见。由于封装和板上的寄生电感&#xff0c;高速信号在高频下汲取电流&#xff0c;导致大的电源尖峰或骤降。像DDR5这样的并行总线接口有20多个高速IO一起切换&#xff0c;导致同时切换噪声&#xff08;SSN&#xff09;。SSN的不期望的产物是…

苹果手机怎么恢复微信聊天记录?原来这4个方法这么好用

苹果手机的微信聊天记录不见了怎么办&#xff1f;想要解决这个问题&#xff0c;可以先了解一下导致聊天记录消失的原因有哪些。 误触手机&#xff1a;我们有时误触到某个按钮&#xff0c;也可能恢复导致聊天记录消失。卸载微信&#xff1a;卸载微信后&#xff0c;重新安装再打…

国密起步5:GmSSL3交叉编译arm64

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 之前已经建立好了交叉编译环境…

让 Jenkins 到极狐GitLab 的迁移变得更加简单

极狐GitLab 是 GitLab 在中国的发行版&#xff0c;可以私有化部署&#xff0c;对中文的支持非常友好&#xff0c;是专为中国程序员和企业推出的企业级一体化 DevOps 平台&#xff0c;一键就能安装成功。安装详情可以查看官网指南。 文章原文可以点击极狐GitLab 官方资源中心查…

利用短信群发平台时提升短信营销打开率的关键因素

尽管众多企业依赖短信群发平台作为营销手段&#xff0c;但短信的实际打开率往往不尽如人意。以下是几个显著影响短信营销效果的关键因素及其优化策略&#xff1a; 1. 谨慎选择用词&#xff0c;规避敏感词汇 现代智能手机普遍配备了智能拦截功能&#xff0c;对包含特定敏感词汇…

C++宏展开

感觉自己一直对C的宏展开没有细致地研究过&#xff0c;这两天深入地学习了一下&#xff0c;做个笔记。 文章目录 宏展开基本规则宏嵌套展开补充说明参考资料 首先明确宏展开&#xff0c;是在预处理阶段进行的&#xff0c;进入编译期就是宏展开之后的代码了&#xff0c;所以不会…

基于Flask的新冠疫情信息可视化查询系统【案例模板】

文章目录 有需要本项目的代码或文档以及全部资源&#xff0c;或者部署调试可以私信博主每文一语 有需要本项目的代码或文档以及全部资源&#xff0c;或者部署调试可以私信博主 本项目是一个案例学习项目&#xff0c;可以作为新手进行学习系统的框架&#xff0c;本项目有数据库…

Git 学习

一、基本使用 1. 基本理论 Git 是一个免费的、开源的分布式版本控制系统&#xff0c;可以快速高效地处理从小型到大型的项目&#xff1b;版本控制是一种记录一个或者若干个文件内容变化&#xff0c;以便来查阅特定版本修订情况的系统 集中化版本控制系统&#xff1a;SVN, CV…

单片机使用cJSON的坑

文章目录 问题解决办法方法一方法二 问题 单片机USAR串口通信我想用json&#xff0c; 我不想用 分隔符的方式。感觉性能够&#xff0c;还有就是方便理解。 mcu型号 : AT32F415系列 雅特力的。 cJSON库: https://github.com/DaveGamble/cJSON/tree/master 只要把 cJSON.h 和 c…

云计算实训39——Harbor仓库的使用、Docker-compose的编排、YAML文件

一、Harbor部署 1.验证python版本 [rootdocker2 ~]#python --version 2.安装pip [rootdocker2 ~]# yum -y install python2-pip #由于版本过低&#xff0c;需要对其进行一个升级 #更新pip [rootdocker2 ~]#pip install --upgrade pip 3.指定版本号 [rootdocker2 ~]# p…

geodatatool(地图资源工具)下载高德数据及数据共享

利用geodatatool&#xff08;地图资源工具&#xff09;3.8&#xff08;新&#xff09;下载高德POI数据&#xff1a; 选择类型如下&#xff1a; 数据效果如下&#xff0c;由于用的免费的key&#xff0c;所以可能数据下载还不完全&#xff0c;但已经很多了&#xff1a; 下载数据…

小模型大智慧!港大重磅开源EasyRec,推荐系统进入语言模型时代

在当今的信息时代&#xff0c;我们每天都被海量信息所包围&#xff0c;不断面临各种选择。从网上购物、音乐播放到视频推荐&#xff0c;推荐系统已经成为我们生活中不可或缺的一部分。那么&#xff0c;这些系统是如何运作的&#xff1f;它们又是如何在信息的洪流中帮助我们找到…

《使用 LangChain 进行大模型应用开发》学习笔记(一)

前言 本文是 Harrison Chase &#xff08;LangChain 创建者&#xff09;和吴恩达&#xff08;Andrew Ng&#xff09;的视频课程《LangChain for LLM Application Development》&#xff08;使用 LangChain 进行大模型应用开发&#xff09;的学习笔记。由于原课程为全英文视频课…

智能优化特征选择|基于鲸鱼WOA优化算法实现的特征选择研究Matlab程序(KNN分类器)

智能优化特征选择|基于鲸鱼WOA优化算法实现的特征选择研究Matlab程序&#xff08;KNN分类器&#xff09; 文章目录 一、基本原理原理流程举个例子总结 二、实验结果三、核心代码四、代码获取五、总结 智能优化特征选择|基于鲸鱼WOA优化算法实现的特征选择研究Matlab程序&#x…