zoukankan      html  css  js  c++  java
  • OpenGL中投影矩阵的推导

      本文主要是对红宝书(第八版)第五章中给出的透视投影矩阵和正交投影矩阵做一个简单推导。投影矩阵的目的是:原始点P(x,y,z)对应后投影点P'(x',y',z')满足x',y',z'∈[-1,1]。

      一、透视投影                                                                                                                    

      下图为透视投影的视锥体:

    注:上图中忘了标注了,远裁剪平面距离原点距离为f,近裁剪平面距离原点距离为n。

    设P(x0, y0, z0),我们分别求各个坐标在投影后的值。将P点投影到近平面上,首先看x方向上的投影,沿着过P点,且平行于xoz平面切一刀,有如下图:

    假设投影后的x坐标为:x_n(在近裁剪平面的投影),由相似三角形的性质,有

    ,可以得到:

    同理,有

    这样其实实现了透视投影,近大远小的效果,因为z0越大,则x1,y1就越小。为了将这两个值转换到[-1,1]区间内,设l和r分别为近裁剪平面左、右边框的x坐标,即l=-w/2,r=w/2(如图所示,w为上下边框的长度),为了使任何投影到近裁剪平面的点都在区间内,转换后,[l',r']∈[0,1],其中l',r'分别为l和r转换后的值。因为是线性转换,可领x'=kx+b,则下式成立:

    求得,

    再根据之前的结果,可以得到归一化后的x坐标为:

    同理,设t和p分别为近裁剪平面上下边框的y坐标,则:

    投影后的坐标都有一个共同因子——[-1/z0],正好对应变换后w=-z0。

    接下来,我们看z要满足什么要求。为简化讨论,根据以上结论,我们假设透视变换有下述形式:

    于是:

    最后的变换矩阵如下:

     

  • 相关阅读:
    优秀网站看前端 —— 小米Note介绍页面
    移动端手势库hammerJS 2.0.4官方文档翻译
    io.js入门(二)—— 所支持的ES6(上)
    发布两款JQ小插件(图片查看器 + 分类选择器),开源
    io.js入门(一)—— 初识io.js
    (翻译)《Hands-on Node.js》—— Why?
    前端神器avalonJS入门(三)
    (翻译)《Hands-on Node.js》—— Introduction
    Linux 安装 adb环境
    MyBatisPlus
  • 原文地址:https://www.cnblogs.com/lijihong/p/4756392.html
Copyright © 2011-2022 走看看