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.hqwc.cn/news/310913.html

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

相关文章

Nx市工业数据洞察:Flask、MySQL、Echarts的可视化之旅

Nx市工业数据洞察:Flask、MySQL、Echarts的可视化之旅 背景数据集来源技术选型功能介绍创新点总结 背景 随着工业化的不断发展,Nx市工业数据的收集和分析变得愈发重要。本博客将介绍如何利用Flask、MySQL和Echarts等技术,从统计局获取的数据…

ElasticSearch历史版本/老版本下载

下载地址 https://www.elastic.co/cn/downloads/past-releases#elasticsearch 搜索所需版本并下载

中医电子处方系统,西医个体诊所门诊卫生室病历记录查询软件教程

中医电子处方系统,西医个体诊所门诊卫生室病历记录查询软件教程 一、软件程序问答 1、电子处方软件如何快速开单? 如下图,软件以 佳易王诊所电子处方管理系统V17.1版本为例说明 在开电子处方的时候可以按单个药品开,也可以直…

linux基于用户身份对资源访问进行控制的解析及过程

linux中用户分为三类 1.超级用户(root) 拥有至高无上的权限 2.普通用户 人为创建、权限小,权限受到控制 3.程序用户 运行程序的用户,不是给人使用的,给程序使用的,一般不给登录! 组账…

SetWindowsHookEx: 全局钩子实现键盘记录器

简介 SetWindowsHookEx 钩子(Hook),是Windows消息处理机制的一个平台,应用程序可以在上面设置子程以监视指定窗口的某种消息,而且所监视的窗口可以是其他进程所创建的。当消息到达后,在目标窗口处理函数之前处理它。钩子机制允许应…

病理HE学习贴(自备)

目录 正常结构 癌症HE 在线学习 以胃癌的学习为例 正常结构 1:胃粘膜正常结构和细胞分化 ●表面覆盖小凹上皮细胞(主要标志物:MUC5AC)以保护黏膜。 ●胃底腺固有腺体由黏液颈细胞(MUC6)、主细胞(Pepsinogen l)和壁细胞(Proton pump α-subunit)组…

项目实战--Message Queue

一. 概念篇 我们在学习多线程的时候,学习过生产者-消费者模型,为了实现解耦合和削峰填谷,引入了阻塞队列. 在实际的后端开发中,跨主机之间使用生产者消费者模型,也是非常普遍的需求,因此,阻塞队列会被封装成一个独立的服务器程序,实现更丰富的功能.这样的程序称为"消息队列…

Java EE Servlet之Servlet API详解

文章目录 1. HttpServlet1.1 核心方法 2. HttpServletRequest3. HttpServletResponse 接下来我们来学习 Servlet API 里面的详细情况 1. HttpServlet 写一个 Servlet 代码,都是要继承这个类,重写里面的方法 Servlet 这里的代码,只需要继承…

MySQL基础学习: 由delete和insert操作导致的死锁问题

一、问题复现:表结构 CREATE TABLE user_props (user_id bigint NOT NULL ,prop_key varchar(100) NOT NULL ,prop_value varchar(100) NOT NULL,PRIMARY KEY (user_id,prop_key) )二、死锁测试 (1)开启两个事务 (2)…

2024年汉字小达人学校选拔备考——区级样题做一做:看拼音写汉字

昨天,六分成长结合过去几年的汉字小达人比赛的情况,介绍了区级比赛的题型,给出了备考建议。根据部分家长朋友的需求,接下来我来分享一些区级样题的过去真题,让孩子直观感受下题目,并分析这些题目的出题特点…

【数据结构】第2章线性表(头歌习题)【合集】

文章目录 第1关:实现顺序表各种基本运算的算法任务描述编程要求完整代码 第2关:实现单链表各种基本运算的算法任务描述编程要求完整代码 第3关:移除顺序表中所有值等于x的元素任务描述编程要求完整代码 第4关:逆置顺序表任务描述编…

模型 KANO卡诺模型

本系列文章 主要是 分享 思维模型,涉及各个领域,重在提升认知。需求分析。 1 卡诺模型的应用 1.1 餐厅需求分析故事 假设你经营一家餐厅,你想了解客户对你的服务质量的满意度。你可以使用卡诺模型来收集客户的反馈,并分析客户的…