以前以为投影也就投影了,并不了解投影也可视作坐标变换,而且也是一个齐次坐标(Homogeneous Coordinate)系的坐标变换。因此书中的介绍一开始也不明白——它说透视投影会把直线映射成曲线,还特地验证一下,发现投影为2D空间(摄像机平面)并不会发生这种情况,在仔细一看才知道,它指的是映射到3D空间,在z方向发生了畸变。而后逐渐了解,原来z方向的位置信息(depth)在渲染级模块处(所谓的Z-Buffer)有特殊用处(直线上每个点的depth均通过直线两端的点线性插值完成,因此可能造成depth位序异常)。当然这个问题在某些场合是不会发生的,例如完全基于光线跟踪算法的渲染并不是这样形成depth的。

于是,投影事实上成了投影变换。投影变换需要满足两个基本要求[1]
  1.保持depth的位序;
  2.将直线变换为直线。
  在x和y方向仍根据投影方法定义(投射在摄像机平面上的坐标),而在z方向上,需要引入伪距离映射(pseudo-distance),数学上,透视投影的伪距离映射具有形式z' = A + B / z。假设z方向截断分别为n和f = 1 / rf,截断分别映射为pn和pf。于是列写方程式1
  pn = A + B / n   (式1)
  pf = A + B * rf (式2)
  解得:
  A = (n * rf - pf) / (n * rf - 1) (式3)
  B = n * (pf - pn) / (n * rf - 1) (式4)
  可以证明,相应的齐次坐标变换矩阵为:
  [ d, 0, 0, 0;
    0, d, 0, 0;
    0, 0, A, B;
    0, 0, 1, 0]    (式5)
  一个很赏心悦目的方案是将n=d(目屏距)映射为0,而将rf=0(无穷远处)映射为1,这种情况下:A=1, B=-d。然而事实上,为了能够提供较好的depth分辨效果,n和f的选择(尤其是f)非常重要,f必须能容纳所有需要关心的物体,需要足够大,但是过大的话会导致depth分辨率的相对降低;而pn和pf则主要取决于为depth分配的位数,通常,现代显卡为depth配置了32位定点数。而透视投影的伪距离映射的一个较好的性质是,它对较近的物体提供了较大的分辨率,较远的物体则即使由于分辨率低而发生错误也是可以接受的。
  然而在OpenGL中,用一个锥形顶点在圆点,截平面与z = 0平面平行的平截头体(frustum)向任意矩形映射的方式定义透视投影。它是一种更一般的透视投影形式。
  列写关系式:
  px = kx * x / z + dx    (式6)
  py = ky * y / z + dy    (式7)
  pz = kz / z + dz   (式8)
  可以导出齐次线性变换矩阵为:
  P = [ kx,  0, dx, 0;
         0, ky, dy, 0;
         0,  0, dz, kz;
         0,  0,  1, 0]    (式9)
  注意到:
    M = [ 1, 0, 0, dx;
          0, 1, 0, dy;
          0, 0, 1, dz;
          0, 0, 0, 1]
    A = [ kx, 0,  0, 0;
           0, ky, 0, 0;
           0, 0,  0, kz;
           0, 0,  1, 0]
  有P = M * A    (式10)
  即P变换矩阵由投影(A矩阵)和屏幕平移(M矩阵)两部分变换组成。
  根据映射关系:
  (x0, ?, z0) -> (px0, ?, pz0), (x1, ?, z0) -> (px1, ?, pz0)    (式11)
  (?, y0, z0) -> (?, py0, pz0), (?, y1, z0) -> (?, py1, pz0)    (式12)
  (?, ?, z0) -> (?, ?, pz0), (?, ?, z1) -> (?, ?, pz1)    (式13)
  可以解得:
  kx = z0 * (px1 - px0) / (x1 - x0), dx = (x1 * px0 - x0 * px1) / (x1 - x0)    (式14)
  ky = z0 * (py1 - py0) / (y1 - y0), dy = (y1 * py0 - y0 * py1) / (y1 - y0)    (式15)
  kz = z0 * (pz0 - pz1) / (1 - z0 / z1 ), dz = (pz1 - pz0 * z0 / z1) / (1 - z0 / z1)    (式16)
  注意到,kz是小于0的,这使得式8给出的伪距离映射是合法的。

注释
1 本笔记采用传统的z轴,即从眼睛指向屏幕,x从左至右,y从上至下(符合光栅扫描顺序),因此它仍是右手系的。

参考文献
[1] 3-D Computer Graphics, A Mathematical Introduction with OpenGL, Samuel R. Buss

转载于:https://www.cnblogs.com/quanben/archive/2007/04/08/3129011.html

CG笔记之一——透视投影相关推荐

  1. Real-time rendering笔记

    Chapter 1 Introduction 1. 实时渲染---图像在计算机上快速的显示 2. 15fps --- 实时渲染的基本fps. 72fps以及更大的fps观察者无法发现其中的差别 60f ...

  2. Shader编程学习笔记(九)—— Cg语言入门1 - 输入输出和语义

    Cg入门一:输入输出和语义 本小节对Cg语言进行一个入门了解. 在以前的课程中,我们了解了渲染管线.顶点和片段程序和颜色计算等,在本小结中来了解一个简单的shader的顶点和片段程序的输入输出以及常用 ...

  3. Cg语言学习笔记(1)

    最近在学习Unity3d Shader编程,Unity3d Shader使用的是Cg语言,网上找了一下Cg的教程,发现<Cg教程-可编程实时图形权威指南>不错,在学习此书的过程中记录一下笔 ...

  4. CG基础教程-陈惟老师十二讲笔记

    转自 麽洋TinyOcean:http://www.douban.com/people/Tinyocean/notes?start=50&type=note 因为看了陈惟十二讲视频没有课件,边 ...

  5. 透视投影变换矩阵推导学习笔记

    最近在研究透视投影,Twinsen大神的神贴有非常详细的推导过程(传送门),这里做一下学习笔记. 首先是两点基础的原理: 1.P经过矩阵M变换后得到P'点,如果知道P(x,y,z)和变换后的P'(x' ...

  6. 图形学笔记(四)变换——三维变换(三维旋转与欧拉角)、MVP变换、视图变换、投影变换(正交投影与透视投影)

    图形学笔记(三)变换--缩放.镜像.切变 图形学笔记(五)光栅化--屏幕.像素.屏幕空间.视口变换.基础图元与三角形.采样.包围盒.锯齿或走样 文章目录 1 三维空间中的变换 1.1 三维空间中的齐次 ...

  7. Python之OpenGL笔记(33):透视投影画六角星

    一.目的 1.摄像机应用,透视投影画六角星: 二.程序运行结果 三.透视投影    吴亚峰<OpenGL ES 3.x游戏开发>(上卷)内容    现实世界中人眼观察物体时会有" ...

  8. openGL学习笔记十四: 透视投影

    透视投影   三维空间物体显示近大远小. 透视投影区域是个棱锥体: 透视投影显示效果: opengl透视投影函数: void APIENTRY gluPerspective (GLdouble fov ...

  9. GPU编程与CG语言之阳春白雪下里巴人 读书笔记

    CHPT2 GPU图形绘制管线 本章作者对GPU图形渲染管线做了深入浅出的总结概括. 所谓渲染管线即图形是如何从三维空间变换到我们二维的屏幕上的.具体的过程可以分为如下几步: 几何阶段   主要工作是 ...

最新文章

  1. busybox filesystem httpd php-5.5.31 sqlite3 webserver
  2. Maven--传递性依赖和依赖范围
  3. 云上主机SSH秘钥对连接linux注意事项
  4. 【转】第01课:生活中的监听模式——一坑爹的热水器
  5. 诗与远方:无题(六十二)
  6. Linux内核网络协议栈2-socket从库函数到内核
  7. imregionalmax imregionalmin imextendedmax imextendedmin imhmax imhmin 函数的详解 matlab中函数
  8. ❤️一分钟学会python条件语句❤️
  9. js typeof instanceof
  10. 分享三个免费的前端模板网站
  11. 【观察】揭秘宏杉科技存储自主创新“登顶”之路
  12. 联想重装系统去掉保护_带有联想保护系统的电脑安装系统具体步骤如下
  13. wordpress字体_如何在WordPress中使用网络字体
  14. 新浪短链接 新浪t.cn短链接在线生成生成工具
  15. netty权威指南目录
  16. 自考需要免考的计算机和英语,请问自学考试英语2和计算机考试怎样办理免考。...
  17. 零基础学习PS——#photoshop# 的167个技能!
  18. Circular Barn Revisited (区间DP)
  19. SLUB DEBUG原理
  20. python绘制语谱图(详细注释)

热门文章

  1. Spring boot 将配置文件属性注入到一个bean中
  2. oracle独立事务,Oracle中独立事务的处理
  3. python37降到36原来的包还可以用吗_【lc刷题】36/37 有效的数独/解数独(143-144/300)...
  4. VS2015编译MuPDF 1.13.0源码(详细)
  5. RTL8189疯涨还缺货怎么办,可以用ESP8089替代.
  6. java静态类和非静态类_关于java:静态和非静态内部类的区别?
  7. qt 连接mysql数据库_QT连接MYSQL数据库教程
  8. Android 11 修改libcore Cipher AS测试
  9. 带防夹功能的升降器原理_全系标配行车自动落锁功能,全新凯美瑞表现分析
  10. unity3d 绘制小地图_Unity中实现小地图的几种方式