zoukankan      html  css  js  c++  java
  • 投影

    什么是投影?

      我们在搭建3D游戏场景的时候,所有的物体都是3D的,然而我们通过屏幕观察的时候,

    屏幕却是2D的平面,想要在2D屏幕表达3D的物体,那么就需要将3D的物体投影到2D的屏幕。

    平截头体

      我们在将3D世界的物体投影到2D屏幕的时候,不可能将所有的东西都投影过去,我们需要定义

    一个范围,只有在这个范围内的物体,我们才将其投影到屏幕上,在这个范围以外的物体,我们就

    将其剔除,而这个范围,叫做平截头体:

      我们在观察空间中,定义平截头体的参数:

      近平面:n  

      远平面:f

      垂直视域角:a

      纵横比:r = w/h

    后台缓冲区:

      GPU处理数据速度有波动,但是显示器却是以固定刷新率来刷新画面,为此,就需要一个缓冲区来存放数据,

    然后再交由显示器显示。一般情况下,由两个缓冲区1和2,GPU将正在绘制的画面放到缓冲区1中,将2中的数据

    用于显示器显示,当2中数据已经显示完成,则交换2个缓冲区。

      需要注意的是,由于图像都存在于缓冲区中,那么需要后台缓冲区的纵横比 与显示窗口的纵横比保持一致,

    否则就会出现图像被拉伸的情况,而图像缓冲区的尺寸,其实也就是投影窗口的纵横比。

    下面推到一些比较重要的公式:

      1.r = w/h,设 h =2,那么r =w/2 =>w=2r;

      2.设近平面n 到起点的长度为d,那么可以得到 d = cot(a/2);

      3.tan(β/2) =r*tan(a/2)

    顶点投影:

      将一个点P(x,y,z) 投影到平面z =d 的点为(x1,y1,d)

      那么,可以得到,当

      -r<x1<r

      -1<y1<1

      n<d<f

      时,点P才在平截头体范围内。

    NDC:

      在观察空间中,投影窗口的高度我们设为2,宽度为2r,r则横纵比 =w/h。那么这里就有一个问题,那么就是必须要为GPU指定了横纵比之后,GPU才能工作,否则就GG。如果我们能去掉这个依赖,对于GPU来讲,运算

    就会变得简单。为了解决这个问题,GPU将后天缓冲区的尺寸指定为[-1,1]这个区间。那么我们就需要将我们计算出来的投影坐标再次进行映射,从[-r,r]区间映射到[-1,1]这个区间。

      -r<=x1<=r

      -1<=x1/r<=1

      将坐标映射后,x,y坐标称为规范化设备坐标,也叫作NDC,那么当以下条件成立时,点才在平截头体内:

      -1<=x1/r<=1

      -1<=y1<=1

      n<=z<=f

      需要注意的是,GPU会默认我们已经完成了这个工作,否则的话,GPU会产生错误。

    将顶点数据投影到NDC变换公式用矩阵描述:

     

     

    最终,完整的投影矩阵如下:

  • 相关阅读:
    python中的矩阵运算
    【python问题系列--4】ValueError: operands could not be broadcast together with shapes (100,3) (3,1)
    【Machine Learning in Action --4】朴素贝叶斯从个人广告中获取区域倾向
    php使用数组语法访问对象
    curl: (60) SSL certificate problem: unable to get local issuer certificate 错误
    php 回调、匿名函数和闭包
    php5.3 延迟静态绑定 static关键字
    利用redis完成自动补全搜索功能(三)
    利用redis完成自动补全搜索功能(二)
    利用redis完成自动补全搜索功能(一)
  • 原文地址:https://www.cnblogs.com/leiGameDesigner/p/8379848.html
Copyright © 2011-2022 走看看