CG笔记之一——透视投影
于是,投影事实上成了投影变换。投影变换需要满足两个基本要求[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笔记之一——透视投影相关推荐
- Real-time rendering笔记
Chapter 1 Introduction 1. 实时渲染---图像在计算机上快速的显示 2. 15fps --- 实时渲染的基本fps. 72fps以及更大的fps观察者无法发现其中的差别 60f ...
- Shader编程学习笔记(九)—— Cg语言入门1 - 输入输出和语义
Cg入门一:输入输出和语义 本小节对Cg语言进行一个入门了解. 在以前的课程中,我们了解了渲染管线.顶点和片段程序和颜色计算等,在本小结中来了解一个简单的shader的顶点和片段程序的输入输出以及常用 ...
- Cg语言学习笔记(1)
最近在学习Unity3d Shader编程,Unity3d Shader使用的是Cg语言,网上找了一下Cg的教程,发现<Cg教程-可编程实时图形权威指南>不错,在学习此书的过程中记录一下笔 ...
- CG基础教程-陈惟老师十二讲笔记
转自 麽洋TinyOcean:http://www.douban.com/people/Tinyocean/notes?start=50&type=note 因为看了陈惟十二讲视频没有课件,边 ...
- 透视投影变换矩阵推导学习笔记
最近在研究透视投影,Twinsen大神的神贴有非常详细的推导过程(传送门),这里做一下学习笔记. 首先是两点基础的原理: 1.P经过矩阵M变换后得到P'点,如果知道P(x,y,z)和变换后的P'(x' ...
- 图形学笔记(四)变换——三维变换(三维旋转与欧拉角)、MVP变换、视图变换、投影变换(正交投影与透视投影)
图形学笔记(三)变换--缩放.镜像.切变 图形学笔记(五)光栅化--屏幕.像素.屏幕空间.视口变换.基础图元与三角形.采样.包围盒.锯齿或走样 文章目录 1 三维空间中的变换 1.1 三维空间中的齐次 ...
- Python之OpenGL笔记(33):透视投影画六角星
一.目的 1.摄像机应用,透视投影画六角星: 二.程序运行结果 三.透视投影 吴亚峰<OpenGL ES 3.x游戏开发>(上卷)内容 现实世界中人眼观察物体时会有" ...
- openGL学习笔记十四: 透视投影
透视投影 三维空间物体显示近大远小. 透视投影区域是个棱锥体: 透视投影显示效果: opengl透视投影函数: void APIENTRY gluPerspective (GLdouble fov ...
- GPU编程与CG语言之阳春白雪下里巴人 读书笔记
CHPT2 GPU图形绘制管线 本章作者对GPU图形渲染管线做了深入浅出的总结概括. 所谓渲染管线即图形是如何从三维空间变换到我们二维的屏幕上的.具体的过程可以分为如下几步: 几何阶段 主要工作是 ...
最新文章
- busybox filesystem httpd php-5.5.31 sqlite3 webserver
- Maven--传递性依赖和依赖范围
- 云上主机SSH秘钥对连接linux注意事项
- 【转】第01课:生活中的监听模式——一坑爹的热水器
- 诗与远方:无题(六十二)
- Linux内核网络协议栈2-socket从库函数到内核
- imregionalmax imregionalmin imextendedmax imextendedmin imhmax imhmin 函数的详解 matlab中函数
- ❤️一分钟学会python条件语句❤️
- js typeof instanceof
- 分享三个免费的前端模板网站
- 【观察】揭秘宏杉科技存储自主创新“登顶”之路
- 联想重装系统去掉保护_带有联想保护系统的电脑安装系统具体步骤如下
- wordpress字体_如何在WordPress中使用网络字体
- 新浪短链接 新浪t.cn短链接在线生成生成工具
- netty权威指南目录
- 自考需要免考的计算机和英语,请问自学考试英语2和计算机考试怎样办理免考。...
- 零基础学习PS——#photoshop# 的167个技能!
- Circular Barn Revisited (区间DP)
- SLUB DEBUG原理
- python绘制语谱图(详细注释)
热门文章
- Spring boot 将配置文件属性注入到一个bean中
- oracle独立事务,Oracle中独立事务的处理
- python37降到36原来的包还可以用吗_【lc刷题】36/37 有效的数独/解数独(143-144/300)...
- VS2015编译MuPDF 1.13.0源码(详细)
- RTL8189疯涨还缺货怎么办,可以用ESP8089替代.
- java静态类和非静态类_关于java:静态和非静态内部类的区别?
- qt 连接mysql数据库_QT连接MYSQL数据库教程
- Android 11 修改libcore Cipher AS测试
- 带防夹功能的升降器原理_全系标配行车自动落锁功能,全新凯美瑞表现分析
- unity3d 绘制小地图_Unity中实现小地图的几种方式