Three.js和Cesium.js中坐标

在了解Three.js和Cesium.js前先了解并弄清楚图形学关于空间的基本概念流程:

计算机图形学

 图形学中涉及到多个坐标空间,这些空间之间的变换是图形渲染中的核心部分。下面是一些常见的图形学空间及其变换顺序:

  1. 对象空间(Object Space)

    • 这是模型的原始坐标空间,模型的顶点数据是在这个空间中定义的。
    • 变换:通常通过模型变换(Model Transformation)来改变模型在对象空间中的位置、旋转和缩放。
  2. 世界空间(World Space)

    • 模型在场景中的位置,旋转和缩放都是在世界空间中定义的。
    • 变换:世界变换(World Transformation)。
  3. 观察空间(View Space 或 Camera Space)

    • 这是从相机视角看到的场景。
    • 变换:视图变换(View Transformation)或摄像机变换。
  4. 裁剪空间(Clip Space)

    • 在这里进行透视除法,得到规范化设备坐标。
    • 变换:透视变换(Perspective Transformation)。
  5. 规范化设备坐标空间(Normalized Device Coordinates,NDC)

    • 所有的顶点坐标都被映射到[-1, 1]的范围内。
    • 变换:规范化。
  6. 屏幕空间(Screen Space)

    • 最后一步变换,将NDC坐标映射到屏幕像素坐标。
    • 变换:视口变换(Viewport Transformation)。

变换的顺序通常是从对象空间开始,经过模型变换,然后是世界变换,接着是视图变换,透视变换,规范化,最后是视口变换。

在图形管线中,几何数据首先被转换到世界空间(World Space),然后到相机空间(Camera Space),接着进行投影变换,得到裁剪空间的坐标。这个裁剪空间的坐标在[-w, w]范围内,其中w是顶点的齐次坐标的w分量。

裁剪空间中的坐标之后会经过视口变换(Viewport Transformation),将其映射到屏幕空间,最终渲染到屏幕上。

在裁剪空间中,可以进行裁剪操作,例如剔除不在视锥体内部的顶点,这样可以提高渲染效率。

在计算裁剪空间坐标时,通常使用齐次坐标来表示顶点位置,这样可以简化透视除法的计算。透视除法将裁剪空间中的坐标转换为规范化设备坐标(Normalized Device Coordinates,NDC),其x、y和z坐标范围在[-1, 1]之间。

案例参考GAMES101 04 games101-变换(模型、视图、投影)-CSDN博客

Three.js

Canvas画布空间(规范化设备空间)(-1,1)

Canvas画布布局和全屏

threejs渲染输出的结果就是一个Cavnas画布,canvas画布也是HTML的元素之一,这意味着three.js渲染结果的布局和普通web前端习惯是一样的。

通过renderer.domElement属性可以访问threejs的渲染结果,也就是HTML的元素canvas画布。

12. Canvas画布布局和全屏 | Three.js中文网

屏幕空间

 坐标转化(屏幕坐标转标准设备坐标)[transformI]

// .offsetY、.offsetX以canvas画布左上角为坐标原点,单位px
const px = event.offsetX;
const py = event.offsetY;
//屏幕坐标px、py转WebGL标准设备坐标x、y
//width、height表示canvas画布宽高度
const x = (px / width) * 2 - 1;
const y = -(py / height) * 2 + 1;

纹理贴图UV坐标空间

顶点UV坐标可以在0~1.0之间任意取值,纹理贴图左下角对应的UV坐标是(0,0)右上角对应的坐标(1,1)

UV纹理空间转到Canvas画布空间(裁剪空间) [transformII]

物体坐标空间

 局部坐标(x,y,z)

坐标转换流程
   模型转换:(不同坐标系)

  局部坐标 -> 世界坐标 -> 观察空间坐标 -> 裁剪空间坐标 -> 屏幕空间坐标

我们将 观察空间坐标系 和 裁剪空间坐标系 之间的转换统一处理,最终得到 标准设备坐标系

  局部坐标 Inverse MVP ->世界坐标 -> MVP标准设备坐标 transformI->屏幕空间坐标

纹理转换:(不同坐标系)

    纹理坐标 (transformII)-->裁剪空间坐标(Inverse MVP)->世界坐标

  ->  (MVP)标准设备坐标  ->(Inverse transformII)纹理坐标

MVP矩阵API
const viewMatrix = orthoCamera.matrixWorldInverse;//视图矩阵:世界到相机的变换矩阵。
const projectionMatrix = orthoCamera.projectionMatrix;//投影矩阵:三维到二维屏幕。
orthVpMatrix = new THREE.Matrix4();
orthVpMatrix.multiplyMatrices(projectionMatrix, viewMatrix);//为先投影,后视图

orthVpMatrix.getInverse()//获取逆矩阵

Matrix4: 用于创建和操作 4x4 矩阵。

// 创建一个单位矩阵

const matrix = new THREE.Matrix4();

// 平移物体

matrix.makeTranslation(x, y, z);

// 旋转物体

matrix.makeRotationX(angle);

// 缩放物体

matrix.makeScale(scaleX, scaleY, scaleZ);

Object3D.matrix: 用于表示物体的变换矩阵。

// 创建一个立方体

const geometry = new THREE.BoxGeometry();

const material = new THREE.MeshBasicMaterial({ color: 0x00ff00 });

const cube = new THREE.Mesh(geometry, material);

// 设置物体的位置、旋转和缩放 cube.position.set(x, y, z);

cube.rotation.set(rx, ry, rz); cube.scale.set(sx, sy, sz);

ShaderMaterial.uniforms: 用于向着色器传递 uniform 变量,包括 MVP 矩阵。

// 创建着色器材质

const material = new THREE.ShaderMaterial

({ uniforms:

{ // 传递 MVP 矩阵给着色器

modelViewProjectionMatrix: { value: new THREE.Matrix4() }

},

vertexShader: vertexShaderCode,

fragmentShader: fragmentShaderCode });

以上是一些常用的 MVP 矩阵相关的 API 和方法,可以通过它们来创建和操作模型的视图和投影变换。

Cesium

Cesium中常用的坐标有两种:WGS84地理坐标系笛卡尔空间坐标系。其中,WGS84地理坐标系包括:WGS84经纬度坐标系(没有实际的对象)和 WGS84弧度坐标系(Carto-graphic);笛卡尔空间坐标系包括:笛卡尔空间直角坐标系(Cartesian3)、平面坐标系(Cartesian2),4D笛卡尔坐标系(Cartesian4)。

三维

WGS-84坐标实例创建icon-default.png?t=N7T8https://blog.csdn.net/qq_27814951/article/details/131645978?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522171431375216800186598178%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=171431375216800186598178&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~rank_v31_ecpm-2-131645978-null-null.142^v100^control&utm_term=cesium%E4%B8%AD%E5%9D%90%E6%A0%87%E7%B3%BB%E5%8F%8A%E5%85%B6%E8%BD%AC%E6%8D%A2&spm=1018.2226.3001.4187#1.WGS-84%E5%9D%90%E6%A0%87%E5%AE%9E%E4%BE%8B%E5%88%9B%E5%BB%BA

Cartographic

(1)通过弧度创建实例:new Cesium.Cartographic(lng, lat, height)     //lng, lat为弧度,height为高度(m)

(2)通过弧度创建实例:Cesium.Cartographic.fromRadians(lng, lat, height)   //lng, lat为弧度,height为高度(m)

(3)通过角度创建实例:Cesium.Cartographic.fromDegrees(lng, lat, height)    //lng, lat为角度,height高度(m)

弧度与角度转换:

  1. // 弧度转角度

  •  Cesium.Math.toDegrees()
  1. //角度转弧度

  •  Cesium.Math.toRadians()

世界坐标系(笛卡尔)实例创建icon-default.png?t=N7T8https://blog.csdn.net/qq_27814951/article/details/131645978?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522171431375216800186598178%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=171431375216800186598178&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~rank_v31_ecpm-2-131645978-null-null.142^v100^control&utm_term=cesium%E4%B8%AD%E5%9D%90%E6%A0%87%E7%B3%BB%E5%8F%8A%E5%85%B6%E8%BD%AC%E6%8D%A2&spm=1018.2226.3001.4187#2.%E4%B8%96%E7%95%8C%E5%9D%90%E6%A0%87%E7%B3%BB%E5%AE%9E%E4%BE%8B%E5%88%9B%E5%BB%BA

Cartesian3

(1)通过笛卡尔空间直角坐标系创建实例:new Cesium.Cartesian3(x, y, z) 

经纬度转Cartesian3

(2)通过弧度创建实例:Cesium.Cartesian3.fromRadians(lng, lat, height)    //lng, lat为弧度,height为高度(m)

(3)通过角度创建实例:Cesium.Cartesian3.fromDegrees(lng, lat, height)    //lng, lat为角度,height为高度(m)

Cesium中的坐标系统及其转换-CSDN博客

(4)   // 方法:借助ellipsoid对象,先转换成弧度再转换
var cartographic = Cesium.Cartographic.fromDegrees(lng, lat, height); //单位:度,度,米 
var cartesian3 = ellipsoid.cartographicToCartesian(cartographic)

  3.WGS-84坐标实例和世界坐标系实例相互转换icon-default.png?t=N7T8https://blog.csdn.net/qq_27814951/article/details/131645978?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522171431375216800186598178%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=171431375216800186598178&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~rank_v31_ecpm-2-131645978-null-null.142^v100^control&utm_term=cesium%E4%B8%AD%E5%9D%90%E6%A0%87%E7%B3%BB%E5%8F%8A%E5%85%B6%E8%BD%AC%E6%8D%A2&spm=1018.2226.3001.4187#3.WGS-84%E5%9D%90%E6%A0%87%E5%AE%9E%E4%BE%8B%E5%92%8C%E4%B8%96%E7%95%8C%E5%9D%90%E6%A0%87%E7%B3%BB%E5%AE%9E%E4%BE%8B%E7%9B%B8%E4%BA%92%E8%BD%AC%E6%8D%A2

(1)世界坐标转WGS-84坐标:

  • Cesium.Cartographic.fromCartesian(cartesian3);

(2)WGS-84坐标转世界坐标:

  • Cesium.Cartographic.toCartesian(cartographic);

二维 

Cartesian2->Cartesian3
  • 应用:屏幕坐标转场景坐标-获取倾斜摄影或模型点击处的坐标

 Cesium.SceneTransforms.wgs84ToWindowCoordinates(viewer.scene,cartesian3);

viewer.screenSpaceEventHandler.setInputAction(function (event) {
    // 获取屏幕坐标;Cartesian2平面坐标格式
    const windowPosition = event.position; 
    const ray = viewer.camera.getPickRay(windowPosition); //相交的射线
 
    // 获取世界坐标系地表坐标,考虑地形,不包括模型,倾斜摄影模型表面;
    const cartesian = viewer.scene.globe.pick(ray, viewer.scene); 
    
    // 获取倾斜摄影模型或其他三维模型点击位置的世界坐标系场景坐标
    const cartesian = viewer.scene.pickPosition(windowPosition); 
 
    // 获取世界坐标系椭球面坐标,不考虑地形,模型,倾斜摄影模型表面等;
    const cartesian = viewer.scene.camera.pickEllipsoid(windowPosition);     
}) 

空间变换

Cesium为我们提供了很有用的变换工具类:Cesium.Cartesian3(相当于Point3D)Cesium.Matrix3(3x3矩阵,用于描述旋转变换)Cesium.Matrix4(4x4矩阵,用于描述旋转加平移变换),Cesium.Quaternion(四元数,用于描述围绕某个向量旋转一定角度的变换)。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

分类神经网络1:VGGNet模型复现

目录 分类网络的常见形式 VGG网络架构 VGG网络部分实现代码 分类网络的常见形式 常见的分类网络通常由特征提取部分和分类部分组成。 特征提取部分实质就是各种神经网络,如VGG、ResNet、DenseNet、MobileNet等。其负责捕获数据的有用信息,一般是通过…

ASP.NET基于WEB的选课系统

摘要 设计本系统的目的是对选课信息进行管理。学生选课系统维护模块主要完成的是系统管理与维护功能。课题研究过程中,首先对系统管理模块进行了详尽的需求分析,经分析得到系统管理模块主要完成如下的功能:用户基本信息、选课信息的录入,查看…

Spring Boot 如何实现缓存预热

Spring Boot 实现缓存预热 1、使用启动监听事件实现缓存预热。2、使用 PostConstruct 注解实现缓存预热。3、使用 CommandLineRunner 或 ApplicationRunner 实现缓存预热。4、通过实现 InitializingBean 接口,并重写 afterPropertiesSet 方法实现缓存预热。 1、使用…

华为先进芯片麒麟9010效能再升级,挑战新高度 | 百能云芯

根据最新的彭博资讯报道,华为再次引领了智能手机行业的先进技术,其最新发布的Pura 70系列智能手机搭载了由中芯国际生产的麒麟9010高阶处理器。这一消息再次证明了华为在芯片设计和生产领域的持续创新能力,并且表明华为对于提升智能手机性能和…

【机器学习】集成学习---Bagging之随机森林(RF)

【机器学习】集成学习---Bagging之随机森林(RF) 一、引言1. 简要介绍集成学习的概念及其在机器学习领域的重要性。2. 引出随机森林作为Bagging算法的一个典型应用。 二、随机森林原理1. Bagging算法的基本思想2. 随机森林的构造3. 随机森林的工作机制 三…

开源文本嵌入模型M3E

进入正文前,先扯点题外话 这两天遇到一个棘手的问题,在用 docker pull 拉取镜像时,会报错: x509: certificate has expired or is not yet valid 具体是下面👇这样的 rootDS918:/volume2/docker/xiaoya# docker pul…

一款神奇的地理数据可视化python库

在地理信息系统(GIS)和地理数据可视化领域,Python的易用性和强大的库支持使其成为处理地理数据的理想选择之一。今天我们介绍Cartopy库,它为地理数据可视化提供了强大的支持。无论是对于GIS专业人士还是对地理数据可视化感兴趣的初…

同事上班这样摸鱼,我坐边上咋看他都在专心写代码啊

我边上有个同事,我坐他边上,但是每天看着他都眉头紧锁,忙的不亦乐乎,但终于有一天,我发现了他上班摸鱼的秘诀。 我劝你千万不要学会这4招,要不就该不好好上班了。 目录 1 上班看电影? 2 上班…

<计算机网络自顶向下> Internet Protocol(未完成)

互联网中的网络层 IP数据报格式 ver: 四个比特的版本号(IPV4 0100, IPV6 0110) headlen:head的长度(头部长度字段(IHL)指定了头部的长度,以32位字(4字节)为单位计算。这…

pytest测试基础

assert 验证关键字 需要pahton版本大于3.6,因为有个工具pip3;因为做了映射,所以下面命令pip3即pip pip install -U pytest -U参数可选,是如果已安装可更新。 如果上述demo变化 通过验证代码,测试环境没问题。…

接口测试-笔记

Date 2024年4月23日21:19:51 Author KarrySmile 1. 前言 因为想更加规范地开发接口,同时让自己测试接口的时候更加高效,更好地写好接口文档。所以学习黑马的《接口自动化测试》课程。链接:黑马程序员软件测试接口自动化测试全套视频教程&a…

MATLAB 运算符

MATLAB 运算符 运算符是一个符号,告诉编译器执行特定的数学或逻辑操作。MATLAB设计为主要在整个矩阵和数组上运行。因此,MATLAB中的运算符既可以处理标量数据,也可以处理非标量数据。MATLAB允许以下类型的基本运算- 算术运算符 关系运算符…

【linux】Linux第一个小程序-进度条

1. 预备知识:回车和换行 回车(Carriage Return,CR): 在早期的机械打字机中,回车指的是将打字机的打印头移回到行首的操作,这样打印头就可以开始新的一行的打印。在ASCII编码中,回车用…

数据库介绍(Mysql安装)

前言 工程师再在存储数据用文件就可以了,为什么还要弄个数据库? 一、什么是数据库? 文件保存数据有以下几个缺点: 文件的安全性问题文件不利于数据查询和管理文件不利于存储海量数据文件在程序中控制不方便 数据库存储介质: 磁…

编译支持播放H265的cef控件

接着在上次编译的基础上增加h265支持编译支持视频播放的cef控件(h264) 测试页面,直接使用cef_enhancement,里边带着的那个html即可,h265视频去这个网站下载elecard,我修改的这个版本参考了里边的修改方式,不过我的这个…

Blender面操作

1.细分Subdivide -选择一个面 -右键,细分 -微调,设置切割次数 2.删除 -选择一个或多个面,按X键 -选择要删除的是面,线还是点 3.挤出面Extrude -选择一个面 -Extrude工具 -拖拽手柄,向外挤出 -微调&#xff…

Opencv | 边缘提取

目录 一. 边缘检测1. 边缘的定义2. Sobel算子 边缘提取3. Scharr算子 边缘提取4. Laplacian算子 边缘提取5. Canny 边缘检测算法5.1 计算梯度的强度及方向5.2 非极大值抑制5.3 双阈值检测5.4 抑制孤立弱边缘 二. 轮廓信息1. 获取轮廓信息2. 画轮廓 一. 边缘检测 1. 边缘的定义…

自动化爬虫工具:you-get安装与使用

Windows下的安装命令: pip install you-get linux下的安装命令: pip3 install you-get 下载完成后,我们可以看到如下的警告,意思就是这个工具并未被添加到环境变量中,如果我们想在命令行中直接调用,需要…

sql今天学习总结

排序order by(默认升序) order by id desc(降序排序) order by id,number(先按id排再按name排序) in,not in and or 通配符 where name like "Aa%";选取所有以Aa开头的名字 like "%r" 以r结…

Matlab 使用subplot绘制多个子图,一元拟合

实现效果: clc; clear;filename sri.xlsx; % 确认文件路径data readtable(filename); datavalue data{:,2:end}; datavalue datavalue;fig figure(Position, [0, 0, 1500, 900]); indexString ["(a)","(b)","(c)","(d)&qu…