zoukankan      html  css  js  c++  java
  • 透视矩阵的推导(最直观、最深入、最还原,看完请点赞。)

    由參数l,r,b,t,n,f定义的透视投影矩阵的推导困惑了我差点儿相同一个多礼拜。这几天差点儿是天天都在思考这个问题。昨天晚上3点多钟我突然醒了,然后我又開始想这个问题,结果最终让我给想通了,于是我赶紧起床把这个思路记在了草稿纸上,还专门照了张照片作证。
    这里写图片描写叙述
    为了解决问题,前几天我专门发了两篇帖子求答案,结果知网上的居然沉掉了。而在csdn上也没有得到答案(质疑有关透视投影矩阵的推导)。

    幸亏我自己还是攻克了这个问题。
    以下推导的是OpenGL中的透视投影矩阵。
    已经知道由參数fovy,aspect,n,f定义的透视投影矩阵为:(有关这块的推导可见《3d graphics for game programming》 2.4.3 derivation of projection matrix,讲得很具体)
    POpenGL=cot(fovy2)aspect0000cot(fovy2)0000f+nfn1002nffn0
    那么再看还有一种投影參数l,r,b,t,n,f,上面矩阵中:
    cot(fovy2)aspect=cot(fovx2)=2nrl,
    cot(fovy2)=2ntb.
    由于參数l,r是相应视见空间中x轴的坐标,b,t相应视见空间中y轴的坐标,假设l=-r而且b=-t。那么由这样的參数定义的透视投影矩阵就是:
    POpenGL=2nrl00002ntb0000f+nfn1002nffn0
    而官方的透视投影矩阵是:
    POpenGL=2nrl00002ntb00r+lrlt+btbf+nfn1002nffn0
    实际上这个矩阵是由两步转换完毕的,第一步是进行矩阵POpenGL变换,然后进行了平移操作。例如以下:

    POpenGL=T×POpenGL=100001000010r+lrlt+btb01×2nrl00002ntb0000f+nfn1002nffn0=2nrl00002ntb00r+lrlt+btbf+nfn1002nffn0

    那些说这个透视投影没有做平移这一步操作,我能够100%跟你说你是错的!


    以下我来解释为什么进行了平移操作。
    来张示意图:
    这里写图片描写叙述
    这个是视见空间中的示意图。由于存在l≠-r或b≠-t的情况。所以这里我有益没把近裁剪平面中心画在z轴上。

    示意图上由红线绘制的立方体才是由l,r,b,t,n,f參数定义的视锥体,当中远裁剪平面上的四个点分别相应原点eye经过近裁剪平面上四个点的延长线与z=-f平面的交点,注意这个视锥体是不规则的!

    然后图中的标注l’, r’是近裁剪平面点(l,b,-n)和点(r,b,-n)x轴上的分量在z=cot(fovx2)上的投影,l=2lrlr=2rrl。l’和r’的中心值是r+lrl。同理近裁剪平面上点(r,b,-n)和点(r,t,-n)y轴上的分量在z=cot(fovy2)上的投影。b=2btbt=2ttb,b’和t’的中心值是t+btb图中的视锥体通过POpenGL透视变换之后得到的是规则的正方体(左下角顶点(2lrl,2btb,1),右上角顶点(2rrl,2ttb,1)。最终要把它转换成cvv(canonical view volume,正规可视化空间)。则须要进行T平移转换,也就是平移(r+lrl,t+btb,0)。得证。

  • 相关阅读:
    shell 脚本学习笔记1
    手把手教你uiautomator_android自动化测试第一个示范
    ubuntu设置环境变量
    albert1017 Linux下压缩某个文件夹(文件夹打包)
    /proc/sysrq-trigger详解
    Android攻城狮学习笔记—入门篇二
    Android攻城狮学习笔记—入门篇一
    《移动App测试实战》读书笔记
    Linux-Ubuntu
    Android-应用性能测试
  • 原文地址:https://www.cnblogs.com/gccbuaa/p/7402623.html
Copyright © 2011-2022 走看看