OSG 关于MVPW变换

目录

1、模型 Model

2、观察矩阵 ViewMatrix

4、窗口矩阵变化

5、总结


在osg中观察矩阵接口设置如下: 其中eye相机的世界坐标位置,center是相机观察的位置,up是相机向上向量。 在计算机的三维世界中,相机如同我们的眼睛,捕捉眼前的每一副画面,反过来物体要能够被相机在指定的距离和角度下观看到,并通过屏幕像素绘制出来。

在这个过程中,物体的三维空间坐标需要经过好几层矩阵变换,最终转换到二维平面坐标,并通过像素呈现在屏幕中。我们将这几层矩阵变换过程简称为MVPW矩阵变换。

1、模型 Model

MVPW中的M是模型顶点在三维场景中的位置。

一般情况下,模型在绘制过程中都是使用模型自身坐标(通常称为模型坐标或者小坐标),模型的顶点位置称为pos,通过变换矩阵 matrix改变模型位置、姿态、大小,将模型放置在指定的三维场景中。这时候模型顶点在三维场景中的坐标位置worldPos = pos * matrix。

2、观察矩阵 ViewMatrix

MVPW中的V是观察矩阵,作用是将世界坐标转为为相机坐标。在相机坐标系下,以相机作为参考,其位置为原点,world* viewMatrix可获得模型顶点在相机坐标下的位置。

  • 在osg中观察矩阵接口设置如下:

其中eye是相机的世界坐标位置,center是相机观察的位置,up是相机向上向量。

    我们可以通过建立坐标轴来说明,在相机坐标系下,eye与center的方向构建出的向量为前向量F,即Y轴;F向量与up进行叉乘后得到右向量R,即X轴;R向量与F向量叉乘后的得到up向量U,即Z轴。此时相机坐标系的XYZ轴就建立完成了。

图1:相机坐标轴

  • osg中viewMatrix视口矩阵的计算:

  • 根据viewMatrix的逆矩阵获取相机坐标轴、相机位置:

图2:视口逆矩阵结构

    在FreeXEarth中第一人称操作器、第三人称操作器、地球操作器都是通过对视口矩阵平移、旋转等操作实现的。

  1. 投影矩阵 ProjectMatrix

MVPW中的P是投影矩阵(projectMatrix), 在计算机三维图像中,投影的作用是将三维坐标信息转化到二维坐标中。投影有两种:透视投影和正交投影。

  • 正交投影可以让视口中物体之间的距离在投影变化前后都保持不变,也可以按照实体原始比例绘制到屏幕中。

图3:正交投影视景体(长方体)

    例如,两条平行线投影变换后仍然保持平行,不会出现远处的物体变小近处的较大。

  • 在osg中设置正交投影的接口如下:

    left表示视景体左面的坐标,right表示右面的坐标,bottom表示下面的,top表示上面的。

    透视投影是在相机坐标下裁剪一块四棱锥区域,通过视口变换到一个(-1,1)的正方体中,最终将正方体信息投影到四棱锥的前面上。通过透视投影变换后的实体呈现出近处大远处小效果。透视投影跟人的眼睛或相机镜头观察到的效果是一致的。

图4:透视投影视景体(四棱锥)

  • 在osg中设置透视投影的接口如下:

    fovy——相机的角度大小,视角小就是焦距大(长焦),视角大就是焦距小(广角);

 aspect——实际窗口的纵横比,即width(窗口宽度)/ height(窗口高度);

zNear——近处裁面,如果物体的位置到相机距离小于近裁剪面,该物体会被相机裁剪掉;

zFar——远处的裁面,如果物体的位置到相机距离大于远裁剪面,该物体会被相机裁剪掉。

图5:fovy, aspectRatio, zNear关系图

  • 根据三角函数,通过fovy, aspectRatio,zNear, zFar可以计算出left、right、top、bottom:

  • 最终根据left、right、top、bottom、zNear, zFar计算投影矩阵:

4窗口矩阵变化

其中当三维坐标经过了MVP转换后,还需要经过窗口变换,才能显示在屏幕中。

窗口矩阵变换主要作用是将视口裁剪后的结果映射到屏幕中,通过viewport获取屏幕显示区域的大小,将帧缓冲区域内的数据转变为能显示在屏幕上的像素。

  • 在osg/opengl矩阵变换工作流程一般如下图:

图6:矩阵变换工作流程

    当数据进行MVP矩阵转换后,得到裁剪坐标,在经过坐标除以w之后(称为透视除法),会得到标准化设备坐标(NDC),标准化设备坐标是一个x、y和z值在-1.0到1.0的一小段空间。

    任何落在范围外的坐标都会被丢弃/裁剪,不会显示在你的屏幕上,最终将x、y分别于viewport中显示的宽度、高度相乘,得到最终的屏幕坐标。整个过程也是世界坐标转换为屏幕坐标的过程!

图7:标准化设备坐标

  • osg中将世界坐标的转换为屏幕坐标,具体代码如下:

5、总结

最后,让我们一起回顾MVPW的整个过程:

M用来模型位置变换,调整模型位置,变换后的物体坐标是全局坐标,也成为世界坐标;

V是相机的视口变换,用来构建相机视口坐标系,将物体全局坐标转换为相机坐标中;一般我们将模型变换与视口变换统称为模型视口变换,即modelView; 

P是投影变换,构建一个裁剪的视景体,或长方体或四棱锥,对场景进行裁剪;

W是窗口变换,作用是将帧缓冲区域内的数据转变为能显示在屏幕上的像素。

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

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

相关文章

20231231_小米音箱接入chatgpt

参考资料: GitHub - yihong0618/xiaogpt: Play ChatGPT and other LLM with Xiaomi AI Speaker 小爱音箱ChatGPT的折腾记录:win平台部署并运行成功_哔哩哔哩_bilibili GitHub - chatanywhere/GPT_API_free: Free ChatGPT API Key,免费Chat…

UG装配-接触对齐

UG装配约束命令在如下位置 首选接触:含接触和对齐,自动判断两种类型 接触:约束对象使其曲面法向在相反方向,并共面或共线 对齐:约束对象使其曲面法向在同一方向,并共面或共线 自动判断中心/轴&#xff1…

Mysql实时数据同步工具Alibaba Canal 使用

目录 Mysql实时数据同步工具Alibaba Canal 使用Canal是什么?工作原理重要版本更新说明 环境准备安装Canalwindow Java : Canal Client 集成依赖编码 工作流程开启原生MQRocketMQ 安装部署 canal配置说明1.1 canal.properties常用配置介绍:2.common参数定…

分库分表之Mycat应用学习一

1 为什么要分库分表 1.1 数据库性能瓶颈的出现 对于应用来说,如果数据库性能出现问题,要么是无法获取连接,是因为在高并发的情况下连接数不够了。要么是操作数据变慢,数据库处理数据的效率除了问题。要么是存储出现问题&#xf…

C#中使用is关键字检查对象是否与给定类型兼容

目录 一、定义 二、示例 三、生成 在程序的开发过程中经常会使用类型转换,如果类型转换不成功则会出现异常,从抛出异常到捕获并处理异常,无形中增加了系统的开销,而且太过频繁地处理异常还会严重地影响系统的稳定性。is关键字可…

双指针刷题(三)

所有算法文章链接(最底部) http://t.csdnimg.cn/IbllR 1.有效三角形个数 力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 1.分析题意 给一个非负的数组,判断这个数组能组成多少个三角形。 2.解题思路 补充知识…

前端vue uni-app使用Vue和ECharts构建交互式树形结构图

题目:使用Vue和ECharts构建交互式树形结构图 摘要:本文介绍了如何使用Vue.js和ECharts构建一个交互式的树形结构图。通过整合ECharts的强大可视化功能,我们创建了一个可拖拽移动、点击展开和收缩的树形结构图,并实现了无限添加子…

【ARMv8M Cortex-M33 系列 2.1 -- Cortex-M33 使用 .hex /.srec 文件介绍】

请阅读【嵌入式开发学习必备专栏 之Cortex-M33 专栏】 文章目录 HEX 文件介绍英特尔十六进制文件格式记录类型hex 示例Cortex-M 系列hex 文件的使用 hex 文件和srec 文件生成Motorola S-Record (srec) 格式 HEX 文件介绍 .hex 文件通常用于微控制器编程,包括 ARM C…

蜕变,我的2023

作者:苍何,前大厂高级 Java 工程师,阿里云专家博主,CSDN 2023 年 实力新星,土木转码,现任部门技术 leader,专注于互联网技术分享,职场经验分享。 🔥热门文章推荐&#xf…

react-router-dom5升级到6

前言 升级前版本为5.1.2 下载与运行 下载 npm install react-router-dom6运行 运行发现报错: 将node_modules删除,重新执行npm i即可 运行发现如下报错 这是因为之前有引用react-router-dom.min,v6中取消了该文件,所以未找到文件导致报错。…

抖音详情API:开发环境搭建与工具选择

随着短视频的流行,抖音已经成为了一个备受欢迎的社交媒体平台。对于开发人员而言,利用抖音详情API开发定制化的抖音应用具有巨大的潜力。本文将为你详细介绍开发抖音应用的开发环境搭建与工具选择,帮助你顺利地开始开发工作。 一、开发环境搭…

【网络安全 | Misc】miss_01 太湖杯

解压时提示输入密码: 如果 frFlags 或 deFlags 不为0会导致zip的伪加密 将deFlags的值修改为0 将9改为0,另存为123.zip: 即可绕过加密: 得到一个zip一个docx,但zip需要密码: 因此看docx有无敏感信息&#x…

机器学习、人工智能、深度学习的关系

人工智能(Artificial Intelligence,AI) 人工智能范围很广,它是一门新的科学与工程,是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的技术科学,研究内容涵盖语音识别、图像识别、自然语言处理、智能搜索和…

计算机毕业设计------ssm茶叶溯源系统

项目介绍 茶叶溯源系统,分为前台与后台。普通用户可在前台通过18位的编码查询茶叶的出售历史。 后台分为两种角色,管理员与经销商; 管理员主要功能包括: 主界面; 管理员管理:管理员列表、添加管理员&am…

跨域请求:Go语言下的“通天大道”

开场白:嘿,各位Go语言的爱好者们,你们是否曾经遇到过这样的困扰:当你的Go应用试图与另一个域的API进行交流时,突然跳出一个“未允许的跨域请求”的警告?别担心,今天,我们将一起在这条…

005、数据类型

1. 关于数据类型 Rust中,每个值都有其特定的数据类型,Rust会根据数据的类型来决定如何处理它们。 Rust是一门静态类型语言,它在编译程序的过程中就需要知道所有变量的具体类型。在大部分情况下,编译器可以根据我们如何绑定、使用变…

软件测试/测试开发丨Python 内置装饰器 学习笔记

内置类装饰器 不用实例化、直接调用提升代码的可读性 内置装饰器含义classmethod类方法staticmethod静态方法 普通方法 定义: 第一个参数为self,代表 实例本身 调用: 要有实例化的过程,通过 实例对象.方法名 调用 # 1. 定义 c…

unity控制摄像机几种视角实现方式

目录 1、按下鼠标右键可以实现摄像机上下左右旋转 2、自由视角 3、摄像头跟随视角 4、跟随自由视角 5、第一人称跟随视角 python学习汇总连接: 1、按下鼠标右键可以实现摄像机上下左右旋转 这段代码定义了一个名为CameraRotate的脚本,用于控制摄像…

2023年终总结 —— 我和CSDN相遇的第一年之“技术学习和个人成长的回顾与展望”

​ ​ 🌈个人主页: Aileen_0v0 🔥热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 💫个人格言:"没有罗马,那就自己创造罗马~" 目录 🎊对2023的总结与回顾🎊 🏅获奖记录 📚学…

机器学习库【03】:-NumPy-算术运算

一、说明 与常规数学一样,数组算术本质上是关于加法、减法、乘法和除法。在 中NumPy,此类操作是按元素执行的 [2]: NumPy 是 Numerical Python 的缩写,是 Python 生态系统中一个功能强大的库,它提供对大型多维数组和矩…