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.mfbz.cn/a/581290.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【完整指南】如何在Visual Studio Code中轻松运行Llama 3模型?

Meta 发布了最新的开源语言模型Llama 3。因为它是开源的,你可以下载这个模型,并在自己的电脑上运行。 我清楚,你可能会想,在个人笔记本上运行一个拥有80亿参数的AI模型似乎只有技术高手才能做到。但别担心!这篇文章会…

MATLAB 运算符

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

前端复习资料

前端复习资料 落叶的位置,谱出一首诗,时间在消逝,我们的故事。 这篇文章呢,整理写给需要的前端同学的。 核心知识,必须掌握的,也是最基础的,譬如浏览器模型,渲染原理,JS…

网页模版如何用

现在的网页模版已经得到了许多人的喜爱和使用。随着人们对互联网的需求不断增加,更多的公司和组织需要拥有自己的网站,以推广他们的品牌和服务。而网页模版为他们提供了一个简单而高效的方法来创建自己的网站。 网页模版是预先设计好的网站模板&#xff…

【数据分析】NumPy

文章目录 [toc]ndarray的创建np.array()方法np.arange()方法np.zeros()方法np.ones()方法np.full()方法np.eye()方法np.random模块np.random.random()方法np.random.randint()方法np.random.choice()方法np.random.shuffle()方法 ndarray的属性ndarray.dtypendarray.ndimndarra…

初识BootStrap

目录 前言: 1.Bootstrap的特点包括: 1.1响应式设计: 1.2组件丰富: 1.3易于定制: 1.4兼容性良好: 1.5强大的社区支持: 1.6一致的样式和布局: 1.7 插件和扩展性 2.初识Ajax: 2.1同步请求…

Linux——(关于权限常见的3个问题)

文章目录 1.修改文件或者目录的拥有者和所属组1.1chown指令1.2chgrp指令 2.常见的权限三个问题2.1对应一个目录,如果要进入,需要什么权限?2.2为什么我们创建的文件默认权限不是7772.2.1关于Linux下的权限掩码 2.3文件能否被删除取决于什么2.3…

Paddle OCR v4 微调训练文字识别SVTRNet模型实践

文字识别步骤参考:https://github.com/PaddlePaddle/PaddleOCR/blob/main/doc/doc_ch/recognition.md 微调步骤参考:https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.7.1/doc/doc_ch/finetune.md 训练必要性 原始模型标点符号和括号容易识别不到 数据…

【kettle004】kettle访问本地MySQL数据库并处理数据至execl文件

一直以来想写下基于kettle的系列文章,作为较火的数据ETL工具,也是日常项目开发中常用的一款工具,最近刚好挤时间梳理、总结下这块儿的知识体系。 熟悉、梳理、总结下MySQL关系数据库相关知识体系 3.欢迎批评指正,跪谢一键三连&…

大模型微调:技术迭代与实践指南

在人工智能领域,大模型(LLM)的微调是一个关键过程,它使模型能够适应特定的任务和数据集。微调是深度学习中用于改进预训练模型性能的重要技术。通过在特定任务的数据集上继续训练,模型的权重被更新以更好地适应该任务。…

揭秘工业大模型:从人工智能小白到技术先锋

工业大模型的五个基本问题 信息化时代,数字化转型成为企业提升营运效率、应对经营风险和提升核心竞争力的重要途径。在此过程中,数据作为一种客观存在的资源,所产生的价值日益凸显。党的十九届四中全会从国家治理体系和治理能力现代化的高度将…

详解Qt绘图机制

Qt框架以其强大的图形界面功能著称,其中绘图机制是构建丰富视觉效果的关键。本文将详细介绍Qt中的绘图机制,包括绘图基础、绘图设备、绘图工具及高级特性,并通过实战C代码示例,带你领略Qt绘图的魅力。 绘图基础 Qt的绘图操作主要…

vs2019 - release版中_DEBUG宏生效的问题

文章目录 vs2019 - release版中_DEBUG宏生效的问题概述笔记总结END vs2019 - release版中_DEBUG宏生效的问题 概述 在加固程序,需要去掉PE的字符串表中和逻辑相关的字符串。 编译成release版后,用IDA看,还是发现有debug版才有的字符串。 那…

gitee关联picgo设置自己的typora_图床

一:去gitee官网创建仓库:typora_图床 1.百度搜索关键字:gitee,进入官网 2.进入gitee登录或者注册自己的账号 3.进入主页后,点击右上方 4.点击新建仓库 5.设置仓库名:typora_图床 6.点击5的创建&#xff0…

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

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

echarts实现水滴图

使用echarts实现水滴图 引入依赖&#xff0c;echarts-liquidfill3兼容echarts5; 安装依赖 "echarts": "^5.4.3","echarts-liquidfill": "^3.1.0",npm install echarts-liquidfill3.1.0 -S实现的效果图 构建一个水滴图的页面 <tem…

基于Spring Boot的商务安全邮件收发系统设计与实现

基于Spring Boot的商务安全邮件收发系统设计与实现 开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/idea 系统部分展示 已发送效果图&#xff0c;用户可以对已发送信息…

4.28总结

对部分代码进行了修改&#xff0c;将一些代码封装成方法&#xff0c;实现了头像功能&#xff0c;创建一个本地字节输入流 fileinputSteam 对象&#xff0c;构造方法中绑定读取的数据源&#xff0c;创建一个socket对象&#xff0c;构造方法中绑定服务器的IP地址和端口号使用sock…

Kafka(十二)Streams

目录 Streams1 什么式是流式处理2 流式处理的相关概念2.1 拓扑2.2 时间2.2.1 输入时间2.2.2 输出时间 2.3 状态2.4 流和表2.5 时间窗口2.5.1 测试时间窗口 2.6 处理保证 3 流式处理设计模式3.1 单事件处理3.2 使用本地状态3.3 多阶段处理和重分区3.4 使用外部查找&#xff1a;流…

阿里云操作日记

昨天买了一个超级便宜的阿里云服务器&#xff0c;2核2G&#xff0c;3M固定带宽&#xff0c;40G ESSD Entry云盘&#xff0c;搭载一个简单的系统&#xff0c;就想到了docker轻量级&#xff0c;易于管理 其实docker很好用&#xff0c;第一步就是安装docker 一、docker安装与端口…