位置: 编程技术 - 正文

透视投影详解(透视投影的作用)

编辑:rootadmin

推荐整理分享透视投影详解(透视投影的作用),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:透视投影的基本原理,透视投影的作用,透视投影详解图片,透视投影的基本做法,透视投影详解视频,透视投影详解视频,透视投影详解视频,透视投影详解视频,内容如对您有帮助,希望把文章链接给更多的朋友!

来源:cnblogs

作者:zdd

概述

投影变换完成的是如何将三维模型显示到二维视口上,这是一个三维到二维的过程。你可以将投影变换看作是调整照相机的焦距,它模拟了为照相机选择镜头的过程。投影变换是所有变换中最复杂的一个。

视锥体

视锥体是一个三维体,他的位置和摄像机相关,视锥体的形状决定了模型如何从camera space投影到屏幕上。最常见的投影类型-透视投影,使得离摄像机近的物体投影后较大,而离摄像机较远的物体投影后较小。透视投影使用棱锥作为视锥体,摄像机位于棱锥的椎顶。该棱锥被前后两个平面截断,形成一个棱台,叫做View Frustum,只有位于Frustum内部的模型才是可见的。

透视投影的目的

透视投影的目的就是将上面的棱台转换为一个立方体(cuboid),转换后,棱台的前剪裁平面的右上角点变为立方体的前平面的中心(下图中弧线所示)。由图可知,这个变换的过程是将棱台较小的部分放大,较大的部分缩小,以形成最终的立方体。这就是投影变换会产生近大远小的效果的原因。变换后的x坐标范围是[-1, 1],y坐标范围是[-1, 1],z坐标范围是[0, 1](OpenGL略有不同,z&#;范围是[-1, 1])。

透视投影矩阵推导

下面来推导一下透视投影矩阵,这样我们就可以自己设置投影矩阵了,就可以模拟神奇的D3DXMatrixPerspectiveLH函数的功能了。那么透视投影到底做了什么工作呢?这一部分算是个难点,无论是DX SDK的帮助文档,还是大多数图形学书籍,对此都是一带而过,很少有详细讨论的,早期的DX SDK文档还讨论的稍微多一些,而新近的文档则完全取消了投影矩阵的推导过程。

我们可以将整个投影过程分为两个部分,第一部分是从Frustum内一点投影到近剪裁平面的过程,第二部分是由近剪裁平面缩放的过程。假设Frustum内一点P(x,y,z)在近剪裁平面上的投影是P'(x',y',z'),而P'经过缩放后的最终坐标设为P''(x",y",z")。假设所求的投影矩阵为M,那么根据矩阵乘法可知,如下等式成立。

PM=P'',即

先看第一部分,为了简化问题,我们考虑YOZ平面上的投影情况,见下图。设P(x, y, z)是Frustum内一点,它在近剪裁平面上的投影是P'(x', y', z')。(注意:D3D以近剪裁平面作为投影平面),设视锥体在Y方向的夹角为Θ。

由上图可知,三角形OP'Q'与三角形OPQ相&#;,于是有如下等式成立。

在看第二部分,将P'缩放的过程,假设投影平面的高度为H,由于转换后cuboid的高度为2。所以有

又因为投影平面的纵横比为Aspect,所以

透视投影详解(透视投影的作用)

最后看z'',当Frustum内的点投影到近剪裁平面的时候,实际上这个z'&#;已经没有意义了,因为所有位于近剪裁平面上的点,其z'&#;都是n,看起来我们甚至可以抛弃这个z'&#;,可以么?当然不行!别忘了后面还有深度测试呢。由第一幅图可知,所有位于线段p'p上的点,最终都会投影到p'点,那么如果这条线段上真的有多个点,如何确定最终保留哪一个呢?当然是离观察这最近的这个了,也就是深度&#;(z&#;)最小的。所以z'坐标可以直接保存p点的z&#;。因为在光栅化之前,我们需要对z坐标的倒数进行插&#;(原因请参见Mathematics for 3D Game Programming and Computer Grahpics 3rd section 5.4),所以可以将z''写成z的一次表达式形式,如下

在映射前,z的范围是[n,f],这里n和f分别是近远两个剪裁平面到原点的距离,在映射后,z''的范围是[0,1],将数据代入上面的一次式,可得下面的方程组

解这个方程组得到

所以

整理一下得

将X'',y'',z''代入最开始的矩阵乘法等式中得

由上式可见,x'',y'',z''都除以了Pz,于是我们将他们再乘以Pz(这并不该变齐次坐标的大小),得到如下等式。

注意这里,x即Px,y即Py,z即Pz,解矩阵的每一列得到

于是所求矩阵为

代码

一般来说,在程序中我们通常给定四个参数来求透视投影矩阵,分别是y方向的视角,纵横比,近剪裁平面到原点的距离及远剪裁平面到原点的距离,通过这四个参数即可求出上面的矩阵,代码如下。

矩阵求解完毕,现在可以用如下代码试试效果,这和使用D3D函数D3DXMatrixPerspectiveFovLH所得效果是一致的。

Happy Coding!!!

openGL ES 文章主要是对opengl的一些重要的知识点进行总结:1、opengl的工作原理通常采用图形卡驱动程序的形式:管线(pipeline)是一个过程,可能涉及两个或多个独

OpenGL es2.0 加载纹理图片和CubMap publicstaticintinitTexture(intdrawableId,Resourcesresources){int[]textures=newint[1];GLES.glGenTextures(1,textures,0);inttextureId=textures[0];GLES.glBindTexture(GLES.GL_TEXTURE_2D,textureId);GL

体验OpenGL新版本 在TheOpenGLExtensionWranglerLibrary下载新版本OpenGL(就是glew-1..0-win)解压,找到glewinfo,检测本机显卡对OpenGL的支持能力,发现自己的本机显卡支持到opengl3

标签: 透视投影的作用

本文链接地址:https://www.jiuchutong.com/biancheng/369527.html 转载请保留说明!

上一篇:【Cocos2d-x】截屏实现的两种方法RenderTexture和glReadPixel,实现和原理详细分析(cocos2dx视频教程)

下一篇:openGL ES(opengles和vulkan哪个好)

  • 车辆购置税的纳税义务发生时间为
  • 增值税留抵税额计入什么科目
  • 其他应付款转实收资本有风险吗
  • 快递费专票可以报销吗
  • 大票可以直接更名吗
  • 研发支出期末需要结转吗
  • 不动产出租需要缴纳哪些税
  • 定期定额纳税申报表是个人所得税吗
  • 企业生产过程中执行标准要把握好以下原则
  • 预算外收入计入什么科目
  • 代扣和代垫
  • 海关废品回收
  • 免抵调增值税是否缴纳附加税
  • 增值税发票过期了税金怎么办
  • 2020深圳增值税税率是多少
  • 2017年7月1日通用机打发票能不能作为税收凭证?
  • 哪些进项税不能加计抵减
  • 高新技术企业软著数量
  • 拿到省级奖有什么用
  • 2020年916减免退库什么意思
  • 隔月的发票能作废吗
  • 增值税小规模纳税人优惠政策
  • 辅助核算的内容
  • win11安装失败0xc1900201
  • 长期停工的影响
  • launcher process
  • php curl_multi_init
  • 股东投资款验资后可以转出吗
  • 埃热泽尔斯湖面上的波纹,拉脱维亚拉特加尔地区 (© Eaglewood Films/Nimia)
  • 漏记收入 罚款
  • 固定资产减值准备可以税前扣除吗
  • 会计核算形式的定义
  • 前端埋点sdk
  • 加油费属于什么费用类别的
  • 车间使用的辅助材料
  • thinkphp调用控制器中的方法
  • 对于异步电动机国家标准规定3kw
  • 软件和信息技术服务业发展趋势
  • 14个Python处理Excel的常用操作,非常好用
  • 阿里pv
  • phpgd库怎么开
  • 定额发票和增值税发票
  • 季度是指
  • 开收据可以列收入吗
  • mongodb主备配置
  • dedecms怎么改图片
  • 蔬菜和肉类是不是免税
  • 货物运输服务可以加计扣除吗
  • 现代服务包括哪些内容是什么
  • 增值税普票税额可以抵扣税吗
  • 一般劳务报酬个人所得税退税吗
  • 定额备用金与非备用金
  • 固定资产税前一次性扣除会计处理与税务处理
  • 收到车辆购置税发票怎么做账
  • 投资子公司亏损母公司报表怎么做
  • 印花税退还
  • 个人向公司借款流程
  • 合并报表的内部投资抵消
  • 报销差旅费属于付款凭证还是收款凭证
  • 建筑公司可以收工程款发票吗
  • 融资租入固定资产计提折旧吗
  • 会计从业资格证取消了吗
  • mysql中mysqldump
  • 虚拟机linux端mysql数据库无法远程访问的解决办法
  • 大白菜一键装机教程
  • 清华同方bios通用密码(thtfpc)
  • 安全组件异常,请重新下载并安装
  • win10无internet怎么办
  • kazaalite.exe是什么进程 kazaalite进程有什么用
  • 创建一个批处理文件,其功能是在当前
  • android drawable 圆角锯齿
  • js动态生成的id怎样获取
  • jquery的实现原理
  • 用shell脚本创建用户
  • android多指触控
  • 一个绿色
  • 归并代码
  • 风险研判能力不足的原因
  • 四川灵活就业医保每月返多少钱
  • 香水与香精有啥不一样
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设