ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

透视投影变换之CVV

2021-05-31 15:02:06  阅读:603  来源: 互联网

标签:right bottom CVV 透视 裁剪 投影 投影变换 锥体


透视投影变换之CVV

规则观察体CVV(Canonical View Volume)

为什么

渲染,目的是将三维世界中的场景转换到二维屏幕中,也就是连续物体离散化的过程,从三维坐标至二维坐标的降维过程。看到降维我们首先想到可以通过投影舍弃某一个坐标轴来实现。在现实生活中,我们用照相机拍照时,自然而然的舍弃了从照相机往前看的那个Z轴。
在这里插入图片描述
所以在unity我们也是这么做的,将三维物体从自己的坐标系转到世界坐标,再从世界坐标转到视坐标(即相机空间),现在从相机的视角往z轴方向看就能得到一副画面。
但是现在出现一个问题,我们真实可见的范围是有限的,而往z轴方向看得到的画面是无限的,所以还需引入其他规则来裁剪空间使得有限物体是可见的,这就是所谓的视锥体。视锥体是由六个面组成,限定了相机的可见范围,在视锥体中的物体才能被渲染到屏幕上。
在这里插入图片描述
简单来说把视锥体中的点投影到与z轴垂直的平面上就得到了一幅画面。我之前一直想不明白,明明可以对投影得到的二维画面进行操作,为什么还需要对三维的视锥体进行变换、为什么需要引入规则观察体CVV(Canonical View Volume)这些复杂的概念呢?
原来,投影的确是得出结果的步骤,但在投影之前有一个重要的步骤被忽略了,也就是判断一个物体是否在相机的视锥体之中,即裁剪。我们能够判断任意物体是否在视锥体之中,但是这是复杂的。相机的视锥体是一个六面体,由相机的近平面、远平面和FOV决定形状,所以具有不确定性,我们无法为不同相机构建一个通用的投影矩阵。为了降低复杂性,为了能够找到统一的解决方案,我们选择了CVV,而CVV作为一个齐次裁剪空间,是对视锥体裁剪空间的标准化。

是什么

(下面的讨论采用OpenGl的标准,左手坐标系,z的范围在[-1,1])
规则观察体CVV(Canonical View Volume),也叫做齐次裁剪空间,是一个 ∀ x 、 y 、 z ∈ [ − 1 , 1 ] \forall x、y、z\in\mathbb [-1,1] ∀x、y、z∈[−1,1] 的正方体。
在这里插入图片描述
在视空间中对物体进行裁剪比较复杂,所以我们希望把视锥体转为CVV。这又分为三步:第一步是将近平面与远平面之间的物体投影到近平面上(即z’=-n),再沿着Z轴平移到z’=z;第二步是将   x ∈ [ l e f t , r i g h t ] \ x\in\mathbb [left,right]  x∈[left,right] 变换到   [ − 1 , 1 ] \ [-1,1]  [−1,1],将   y ∈ [ b o t t o m , t o p ] \ y\in\mathbb [bottom,top]  y∈[bottom,top] 变换到   [ − 1 , 1 ] \ [-1,1]  [−1,1];第三步是将z值从   [ − n , − f ] \ [-n,-f]  [−n,−f]变换到   [ − 1 , 1 ] \ [-1,1]  [−1,1]。(n,f,left,right,bottom,top如下图)
在这里插入图片描述

怎么做

第一步:投影+平移(实现近大远小)

根据三角形相似的原理将P点投影到近平面上。
在这里插入图片描述
会发现投影点P’ 的z’分量是固定值,我们任意改变它只相当于将近平面任意平移,不会改变投影结果,但原始P点的z分量却丢失了。为了充分利用每一个数值,我们把z’=-n又还原回z,相当于把投影点P’又沿着z轴平移回去,这样就实现了近大远小的效果。如图A、B、C点在x、y方向上值相同,投影+平移以后x、y方向上值与z值的大小关系保持一致,近处(z大)的点变换后得到较大的x、y值。
在这里插入图片描述

第二步:裁剪x、y轴,把范围限定到   [ − 1 , 1 ] \ [-1,1]  [−1,1]

为了将投影变换写成矩阵的形式,我们借助齐次坐标的概念,增加w分量把三维扩充到四维,这样点与点之间的变换可以用矩阵来表示。
在第一步以后,原始的P点(x,y,z,1)变为了投影点P’(-nx/z,-ny/z,z,1)。
如图根据线性插值将-nx/z和-ny/z的范围限定到[1,-1],
在这里插入图片描述
求得新的x’=(2nx/-z)/(right-left)-(right+left)/(right-left)、y’=(2ny/-z)/(top-bottom)-(top+bottom)/(top-bottom),这个变化可以写成矩阵形式:
在这里插入图片描述

第三步:裁剪z轴,把z’限定到   [ − 1 , 1 ] \ [-1,1]  [−1,1]

同时根据视锥体知道z在[-n,-f]区间的点P是可见的,而根据CVV知道z’在[1,-1]区间的点P’是可见的,根据第一步已经得到z=z’,要裁剪z轴可以根据第二步的推导原理让z’=(az+b)/(-z),如图所示:
在这里插入图片描述
未知数a、b由条件-(az+b)/z属于[1,-1]的边界求得在这里插入图片描述
(DX下a、b结果不同,但计算原理相同)

最终结果

点p(x,y,z,1)到规则观察体CVV的投影点P’((2nx/-z)/(right-left)-(right+left)/(right-left),(2ny/-z)/(top-bottom)-(top+bottom)/(top-bottom),(az+b)/(-z),1)的变换可以由矩阵M来表示。
P’=MP
M如图:
在这里插入图片描述

标签:right,bottom,CVV,透视,裁剪,投影,投影变换,锥体
来源: https://blog.csdn.net/diaokeji2017/article/details/116333222

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有