你可以认为投影变换就是控制摄像机内部的一种方式。他可以类推为为摄像机选择一个漏字板。它是三种变换中最难懂的。本文只讨论以下的一些内容。

典型的投影变换就是缩放和透视投影。投影就变换把视椎转化为一个立方体。近大远小。这就是把透视应用于场景。

在视椎体中,摄像机与变换空间原点的距离被定义为D,所以投景矩阵看起来像这样:

观察矩阵把摄像机通过把z轴-D 平移到原点。平移矩阵如下 
他们两个矩阵相乘得到以下矩阵
透视转换把视椎体转化为新的一个坐标空间。注意视堆平截变为一个立方体,原点炎右上角移动到场景的中间,如图所示
在透视变换中,x和y方向的范围是-1到1。z方向的范围是0(在平面前面),1(在平面后面)
这人矩阵平移和缩放模型是根据摄像机与截面的距离,但是目前 没有考虑到视角大小 ,并且它为远程物体产生的z值可能几乎相同,这使尝试比较变的困难。以下矩阵解决了问题,并根据 视区的纵横比调整顶点,这使它成为透视投影的一个很好的选择。
 
 
 
在这个矩阵中,Zn是近裁剪平面的z值。变量whQ有以下含义。注意fovwfovh表示视区在水平和垂直方向上的视角,以弧度为单位
 
 

对应用程序而言,使用视角的角度定义x和y的比例系数可能不如使用视区在水平和垂直方向上的大小(在摄像机空间中)方便。可以用数学推导,得出下面两个使用视区大小计算wh的公式,它们与前面的公式是等价的。

在这两个公式中,Zn表示近裁剪平面的位置,VwVh变量表示视区在摄像机空间的宽和高。

对于C++应用程序而言,这两个大小直接对应于D3DVIEWPORT9结构的WidthHeight成员。(译注:虽然直接对应,但是不等价的,因为VwVh位于摄像机空间,而WidthHeight位于屏幕空间)

无论决定使用什么公式,非常重要的一点是要尽可能将Zn设得大,因为接近摄像机的z值变化不大。这使得用16位z缓存的深度比较变得有点复杂。

同世界变换和观察变换一样,应用程序调用IDirect3DDevice9::SetTransform方法设置投影矩阵。

 
 

[翻译]投影变换 Projection Transform (Direct3D 9)的更多相关文章

  1. 基本3D变换之World Transform, View Transform and Projection Transform

    作者:i_dovelemon 来源:CSDN 日期:2014 / 9 / 28 主题:World Transform, View Transform , Projection Transform 引言 ...

  2. [翻译]观察变换View Transform (Direct3D 9)

    这一节介绍在Direct3d中观察变换的基本概念和怎么去设置观察矩阵. 视口变换把观察者放在世界坐标系中,并把顶点转化到摄像机空间.在摄像机空间,摄像机或者说观察者在原点,观察方向为z轴正向.Dire ...

  3. DirectX9:高级着色语言(HLSL)

    一.简介 高级着色语言(High)可以编写顶点着色器和像素着色器,取代固定功能流水线中的部分功能,在图形卡的GPU(Graphics Processing Unit,图形处理单元)中执行 注意:如果图 ...

  4. WebGL简易教程(五):图形变换(模型、视图、投影变换)

    [toc] 1. 概述 通过之前的教程,对WebGL中可编程渲染管线的流程有了一定的认识.但是只有前面的知识还不足以绘制真正的三维场景,可以发现之前我们绘制的点.三角形的坐标都是[-1,1]之间,Z值 ...

  5. DirectX 总结和DirectX 9.0 学习笔记

    转自:http://www.cnblogs.com/graphics/archive/2009/11/25/1583682.html DirectX 总结 DDS DirectXDraw Surfac ...

  6. 【译】Unity3D Shader 新手教程(5/6) —— Bumped Diffuse Shader

    本文为翻译,附上原文链接. 转载请注明出处--polobymulberry-博客园. 动机 如果你满足以下条件,我建议你阅读这篇教程: 你想学习片段着色器(Fragment Shader). 你想实现 ...

  7. OpenCASCADE Coordinate Transforms

    OpenCASCADE Coordinate Transforms eryar@163.com Abstract. The purpose of the OpenGL graphics process ...

  8. iOS 8 Metal Swift教程(一) :开始学习

    在本篇教程中,你将应用到3D图形中的一系列矩阵变换,并会学习到如下内容: 如何使用模型(model),视图(view)以及投影变换(projection transformations). 如何使用矩 ...

  9. webgl自学笔记——矩阵变换

    这章主要探讨矩阵,这些矩阵代表了应用在我们场景上的变换,允许我们移动物体.然而在webGL api中并没有一个专门的camera对象,只有矩阵.好消息是使用矩阵来取代相机对象能让webgl在很多复杂动 ...

随机推荐

  1. 《高质量C++/C编程指南》陷阱 【转】

    作者:幻の上帝 出处:http://hi.baidu.com/frankhb1989/item/185f0a14823dd1f8dceeca2c 此文硬伤不少,且相对谭XX的书而言隐晦许多,不建议新手 ...

  2. Elasticsearch--Date math在索引中的使用

    在Elasticsearch,有时要通过索引日期来筛选某段时间的数据,这时就要用到ES提供的日期数学表达式 描述: 特别在日志数据中,只是查询一段时间内的日志数据,这时就可以使用日期数学表达式,这样可 ...

  3. Elasticsearch多索引

     在Elasticsearch中,一般的查询都支持多索引.只有文档API或者别名API等不支持多索引操作,因此本篇就翻译一下多索引相关的内容. 首先,先插入几条数据: $ curl -XPOST lo ...

  4. 5.24 Declaring Attributes of Functions【转】

    转自:https://gcc.gnu.org/onlinedocs/gcc-4.0.0/gcc/Function-Attributes.html 5.24 Declaring Attributes o ...

  5. JVM 指令集

    指令码 助记符 说明 0x00 nop 什么都不做 0x01 aconst_null 将null推送至栈顶 0x02 iconst_m1 将int型-1推送至栈顶 0x03 iconst_0 将int ...

  6. Docker第三方项目小结

    软件项目的成功常常根据其催生的生态系统来衡量.围绕或基于核心技术构建的项目增添了功能和易用性,它们常常日臻完善.Docker就是一个典例,有众多第三方项目扩展.补充或改进Docker. •Docker ...

  7. array_pop()将数组最后一个单元弹出(出栈)

    // 使用系统函数中的引用传参    $array = [1,2,3,4,5,6,7,8,9];//数组    // 调用一个函数    array_pop($array);    //输出原数组   ...

  8. 完整学习git二 git 暂存区

    1 git log 命令查看提交日志信息 git log --pretty-fuller #详细查看 git log --stat #查看每次提交的文件变更 git log --pretty-onli ...

  9. 三种用于select 的选择器

    <html lang="en"> <head> <meta charset="utf-8"> <title>选项 ...

  10. myeclipse的快捷键和myeclipse快捷键设置

    1.Ctrl+M切换窗口的大小   2.Ctrl+Q跳到最后一次的编辑处   3.F2当鼠标放在一个标记处出现Tooltip时候按F2则把鼠标移开时Tooltip还会显示即Show Tooltip D ...