zoukankan      html  css  js  c++  java
  • [翻译]投影变换 Projection Transform (Direct3D 9)

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

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

    在视椎体中,摄像机与变换空间原点的距离被定义为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方法设置投影矩阵。

     
     
  • 相关阅读:
    浅谈求卡特兰数的几种方法
    WPF基础知识、界面布局及控件Binding
    .net平台下C#socket通信(上)
    .net泛型理解
    面向过程和面向对象及面向对象的三大特征
    C#配置文件管理
    MOGRE学习笔记(3)--MOGRE小项目练习
    委托、事件学习笔记
    MOGRE学习笔记(2)
    MOGRE学习笔记(1)
  • 原文地址:https://www.cnblogs.com/zhangdongsheng/p/5174280.html
Copyright © 2011-2022 走看看