投影矩阵详解「建议收藏」

投影矩阵详解「建议收藏」视锥就是场景中的一个三维空间,它的位置由视口的摄像机来决定。这个空间的形状决定了摄像机空间中的模型将被如何投影到屏幕上。透视投影是最常用的一种投影类型,使用这种投影,会使近处的对象看起来比远处的大一些。对于透视投影,视锥可以被初始化成金字塔形,将摄像机放在顶端。这个金字塔再经过前、后两个剪切面的分割,位于这两个面之间的部分就是视锥。只有位于视锥内的对象才可见。视锥由凹视野(  在

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

视锥就是场景中的一个三维空间,它的位置由视口的摄像机来决定。这个空间的形状决定了摄像机空间中的模型将被如何投影到屏幕上。透视投影是最常用的一种投影类型,使用这种投影,会使近处的对象看起来比远处的大一些。对于透视投影,视锥可以被初始化成金字塔形,将摄像机放在顶端。这个金字塔再经过前、后两个剪切面的分割,位于这两个面之间的部分就是视锥。只有位于视锥内的对象才可见。

视锥由凹视野(

pic47.gif (3047 bytes)

  在上图中,变量

 

 

  投影矩阵是一个典型的缩放和透视矩阵。投影变换将视锥变换成一个直平行六面体的形状。因为视锥的近处比远处小,这样就会对靠近摄像机的对象起到放大的作用,也就将透视应用到了场景当中。

  在视锥中,摄像机与空间原点间的距离被定义为变量

pic48.gif (1187 bytes)        pic49.gif (1138 bytes)

  视矩阵将摄像机放置在场景的原点。又因为投影矩阵需要将摄像机放在

将两个矩阵相乘,得到下面的矩阵:

pic50.gif (1178 bytes)

  下图显示了透视变换如何将一个视锥变换成一个新的坐标空间。注意:锥形体变成了直平行六面体,原点从场景的右上角移到了中心。

pic51.gif (4974 bytes)

  在透视变换中,

  这个矩阵基于一定的距离(这个距离是从摄像机到邻近的剪切面)对对象进行平移和旋转,但是它没有考虑到视野(

pic52.gif (1681 bytes)

  在这个矩阵中,

pic53.gif (2085 bytes)

  在程序中,使用视野角度来定义

xy缩放系数比使用视口的水平和垂直尺寸(在摄像机空间中)并不方便多少。下面两式使用了视口的尺寸,并且与上面的公式相等:

pic54.gif (871 bytes)

  在这些公式中,Zn表示邻近的剪切面的位置,变量VwVh表示视口的高和宽。这两个参数与D3DVIEWPORT2结构中的dwWidthdwHeight成员相关。

  不管你使用那个公式,将

  同世界和视变换一样,可以调用

 

 

  下面的

D3DMATRIX ProjectionMatrix(const float near_plane,// distance to near clipping plane
             const float far_plane,// distance to far clipping plane
             const float fov_horiz,// horizontal field of view angle, in radians
             const float fov_vert)// vertical field of view angle, in radians
{

 float h, w, Q;
 w = (float)cot(fov_horiz*0.5);
 h = (float)cot(fov_vert*0.5);
 Q = far_plane/(far_plane – near_plane);
 D3DMATRIX ret = ZeroMatrix();
 ret(0, 0) = w;
 ret(1, 1) = h;
 ret(2, 2) = Q;
 ret(3, 2) = -Q*near_plane;
 ret(2, 3) = 1;
 return ret;
} // end of ProjectionMatrix()

  一旦创建完了矩阵,你需要调用

 

 

  一个顶点经过世界、观察和投影变换之后,

  下图展示了一个不适合的投影矩阵,和一个经过缩放的适合的矩阵:

pic55.gif (4266 bytes)

  在前面的矩阵中,所有的变量都被假定为非零。有关雾化的内容见“目相关对基于

 

Z的深度”。有关基于W的深度缓冲见“什么是深度缓冲?”  注:Direct3D在基于W的深度运算时使用当前设置的投影矩阵。因此,程序必须设置一个适合的矩阵来的导向要的基于W的特性,即使它们没有使用Direct3D变换管道。4.4 一个W-Friendly投影矩阵Direct3D立即模式可以利用这个顶点的W成分执行雾化效果,并在深度缓冲中执行基于深度的运算。这样的运算需要投影矩阵将W规范化等价于世界空间的Z。简而言之,如果你的投影矩阵的(3,4)系数不是1,那么你就必须用(3,4)系数的倒数对所有的系数进行缩放。如果没有提供一个适当的矩阵,那么雾化效果和深度缓冲就不能得到正确运用。(“什么是投影矩阵?”中提供的矩阵是适合于)基于W的运算的。)IDirect3DDevice3::SetTransform方法来设置它,同时将第一个参数设置为D3DTRANSFORMSTATE_PROJECTION。详细内容见“设置变换”。4.3 设置投影矩阵ProjectionMatrix例程函数又四个输入参数,它们用来设置前后剪切面,和视野的水平与垂直角度。视野角度应该比π弧度(180度)小。Zn值尽量设的大一些是很重要的,因为当z值很接近时,大多数情况下是难以分辨的,由一个取巧的方法,就是在进行深度比较时使用16z-bufferDirect3D中,投影矩阵的第(3,4)元素不能为负数。IDirect3DDevice3::SetTransform方法来设置透视变换,详细内容见“设置变换”。Zn是临近剪切面的z值。变量whQ的意义如下(注意:fovwfovh表示视口的水平和垂直视野,用弧度标示):x-y-方向的限制是-11z-方向的限制是前表面为0,后表面为1field-of-view),也没有考虑到对象的z-值可能会相同,从而使深度比较变得困难。下面的矩阵讨论了这一问题,并且调整顶点来说明视口的高宽比例:(0, 0, -D),那么它就要将向量沿z-轴平移-D的距离,如上面右图所示:
D是从摄像机到空间原点的距离,这个空间是在集合管道的最末端经过视变换得到的空间。要了解变量D如何被用来建立投影矩阵,请看“什么是投影变换?”部分。
4.2 什么是投影矩阵?D。开始定义透视投影的矩阵时,可以象下面左图这样来使用变量D
fov-field of view)和前后剪切面的位置来进行定义:   视锥就是场景中的一个三维空间,它的位置由视口的摄像机来决定。这个空间的形状决定了摄像机空间中的模型将被如何投影到屏幕上。透视投影是最常用的一种投影类型,使用这种投影,会使近处的对象看起来比远处的大一些。对于透视投影,
pic46.gif (8672 bytes)

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/185863.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 博客大巴,自动登录,并发布信息开发小计。

    博客大巴,自动登录,并发布信息开发小计。工具准备:Fiddler相关网页:登录页面:http://passport.blogbus.com/login信息发布信息:http://www.blogbus.com/user/?blogid=49

    2022年6月30日
    25
  • HTTP.sys remote code execution vulnerability「建议收藏」

    HTTP.sys remote code execution vulnerability「建议收藏」IIS系列Http.sys处理Range整数溢出漏洞导致远程代码执行1.漏洞概要2015年04月14日,微软发布严重级别的安全公告MS15-034,编号为CVE-2015-1635,据称在Http.sys中的漏洞可能允许远程执行代码。2.漏洞描述CWE:CWE-119 CVE:CVE-2015-1635   Http.sys是一个位于Windows操作系统核…

    2022年7月18日
    19
  • 激光测距传感器原理与应用介绍

    激光测距传感器原理与应用介绍激光,英文名称为LightAmplificationbyStimulatedEmissionofRadiation(简称LASER),意思为原子受激辐射的光,故称激光,激光的产生原理,是原子中的电子吸收能量后从低能级跃迁到高能级,再从高能级回落到低能级的时候,所释放的能量以光子的形式放出,被引诱(激发)出来的光子束(激光)。激光与普通光源相比,具有单色性、高亮度、方向性等优势,被广泛应用于工业生产和科研实验等各个领域,激光测距便是其中应用较为广泛的一项技术。1.激光测距技术的特点激光

    2022年5月29日
    44
  • golang:[]byte转string

    golang:[]byte转stringgolang中,字符切片[]byte转换成string最简单的方式是packagemainimport(“fmt”_”unsafe”)funcmain(){bytes:=[]byte(“Iambytearray!”)str:=string(bytes)bytes[0]=’i’//注意这一行,bytes在这里修改了数据,但是str打印出来的依然没变化,fmt.Println(str)}打印信息:I

    2022年6月16日
    37
  • java多线程系列(四)—ReentrantLock的使用

    java多线程系列(四)—ReentrantLock的使用

    2021年6月16日
    80
  • C语言中volatile关键字的作用

    C语言中volatile关键字的作用一.前言1.编译器优化介绍:由于内存访问速度远不及CPU处理速度,为提高机器整体性能,在硬件上引入硬件高速缓存Cache,加速对内存的访问。另外在现代CPU中指令的执行并不一定严格按照顺序执行,没有相关性的指令可以乱序执行,以充分利用CPU的指令流水线,提高执行速度。以上是硬件级别的优化。再看软件一级的优化:一种是在编写代码时由程序员优化,另一种是由编译器进行优化。编译器优化常用的方法有:将内存变

    2022年6月1日
    34

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号