为什么不在投影除法后裁剪
2017-04-13 22:06
141 查看
在齐次空间对顶点和线裁剪是如今图形学管线进行裁剪的标准做法。一个世界坐标系下点经过观察变换后会映射到屏幕空间,在这其中会经过如下的矩阵变换:世界坐标系到相机坐标系的变化,相机坐标系下的透视投影变换到规范化空间,然后从规范化空间变换到屏幕空间。其中,裁剪就发生在透视投影变化之后,但在透视除法之前。先简单解释透视投影和透视除法:
透视投影指经过透视变化矩阵之后的得到齐次坐标;
透视除法指将透视投影得到的齐次坐标转化为三维坐标,即除以齐次分量,经过透视除法的点才是在规范化裁剪立方体中的点。
为什么不在投影除法后裁剪呢?为了简单起见,取投影参考点是观察坐标原点,近裁剪平面是观察平面的透视变化矩阵:
M=⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢cot(θ2)aspect0000cot(θ2)0000znear+zfarznear−zfar−100−2znearzfarznear−zfar0⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥
其中θ 是相机的视角,aspect是近裁剪平面的纵横比,znear和zfar分别是近裁剪平面和远裁剪平面。
对于相机坐标系下的任意一点 P(x0,y0,z0,1),经过该矩阵变化后得到P1=MP0,P1的坐标为(x1,y1,z1,w)。从该矩阵中可以看到z1=s∗z0+t,其中s=znear+zfarznear−zfar,t=−2znearzfarznear−zfar,可以看到s和t都是常数,所以z1和z0之间是线性关系,同理x1与x0,y1与y0都是线性关系。w=−z0。如果此时对P1进行透视除法,得到P′1=(x′1,y′1,z′1,w′)=(x1/w,y1/w,z1/w,1),此时x′1与原x0之间不再是线性关系,x′1是以x0和z0为变量的函数。如果在透视除法后进行裁剪,那么将不能运用线性插值,否则很多在原来坐标系中的存储信息将会变形,比如:纹理、颜色等。所以,一般直接在齐次空间中做裁剪,在该空间中进行裁剪可以直接用线性插值。
透视投影指经过透视变化矩阵之后的得到齐次坐标;
透视除法指将透视投影得到的齐次坐标转化为三维坐标,即除以齐次分量,经过透视除法的点才是在规范化裁剪立方体中的点。
为什么不在投影除法后裁剪呢?为了简单起见,取投影参考点是观察坐标原点,近裁剪平面是观察平面的透视变化矩阵:
M=⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢cot(θ2)aspect0000cot(θ2)0000znear+zfarznear−zfar−100−2znearzfarznear−zfar0⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥
其中θ 是相机的视角,aspect是近裁剪平面的纵横比,znear和zfar分别是近裁剪平面和远裁剪平面。
对于相机坐标系下的任意一点 P(x0,y0,z0,1),经过该矩阵变化后得到P1=MP0,P1的坐标为(x1,y1,z1,w)。从该矩阵中可以看到z1=s∗z0+t,其中s=znear+zfarznear−zfar,t=−2znearzfarznear−zfar,可以看到s和t都是常数,所以z1和z0之间是线性关系,同理x1与x0,y1与y0都是线性关系。w=−z0。如果此时对P1进行透视除法,得到P′1=(x′1,y′1,z′1,w′)=(x1/w,y1/w,z1/w,1),此时x′1与原x0之间不再是线性关系,x′1是以x0和z0为变量的函数。如果在透视除法后进行裁剪,那么将不能运用线性插值,否则很多在原来坐标系中的存储信息将会变形,比如:纹理、颜色等。所以,一般直接在齐次空间中做裁剪,在该空间中进行裁剪可以直接用线性插值。
相关文章推荐
- 齐次空间的裁剪-为什么不在投影除法后裁剪重要
- 为什么图片裁剪后尺寸会变大
- ARCGIS 批量添加投影信息 ERDAS 批量裁剪影像
- 为什么我不在微信公众号上写文章
- 面试回忆之一:为什么我从不在简历当中写“精通”二字?
- 为什么是远程桌面而不在手机上做UI
- 为什么不在spring容器管理controller
- 5.6.3 投影和均匀裁剪空间
- 移位运算为什么比乘法除法快
- JAVA为什么有时候除法计算结果本来应该是小数。但是得到整数int类型
- 【数学】十万个为什么(一) —— 为什么乘法会分为左乘和右乘,除法会分为左除和右除?
- 为什么在Unix下编程,而不在Linux下编程
- 为什么不在spring容器管理controller
- 为什么不在服务器上装Linux发行版本
- rac 为什么不在一个节点上建立所有节点的监听?
- 白板与编程面试:为什么不在电脑上编程更有帮助
- GDAL 2.1.0工具开发之gdal_translate(图像裁剪、缩放、拉伸、赋坐标投影、格式转换等)
- 为什么不在ssh的action层做事务处理
- 为什么不在spring容器管理controller
- 【Unity问题】Int类型除法运算为什么归零