透视投影矩阵推导Word文档格式.docx
- 文档编号:18813742
- 上传时间:2023-01-01
- 格式:DOCX
- 页数:12
- 大小:228.75KB
透视投影矩阵推导Word文档格式.docx
《透视投影矩阵推导Word文档格式.docx》由会员分享,可在线阅读,更多相关《透视投影矩阵推导Word文档格式.docx(12页珍藏版)》请在冰豆网上搜索。
(3)OPenGL的CVV勺Z范围是[-1,1],D3D的CVV勺Z范围是[0,1]
以上这些差异导致了最终OPenGL和D3D的透视投影矩阵的不同。
D3D的透视投影矩阵推导
我们先来看最最基本的透视关系图(上一篇文章开始的时候使用的图):
这里我们考察的是XZ平面上的关系,yz平面上的关系同理。
这里0是相机位置。
np是近裁剪平面,也是投影平面,N是它到相机的距离。
fp是远裁剪平面,F是它到相机的位置。
P是需要投影的点,p'
是投影之后的点。
根据相似三角形定理,我们有
ΛgpQ=Λqlp,0
则有
匚=JN兰同理F=Ny_
XZZZZ
注意到OPenGL使用右手坐标系,因此应该使用-N(请参考上一篇文章的这一步)而D3D使用左手坐标系,因此使用N,这是二者的不同点之一。
这样,我们得到投影之后的点
第三个信息点是变换之后的Z在投影平面上的位置,也就是N,它已经没用了,我们把p'
写成
从而用第三个没用信息点它来存储Z(如果读者对这一点不太了解,请参考上一篇文章)。
接下来我们求出a和b,从而在Z方向上构建CVV请注意这里是OPenGL和D3D的另一个不同点,OPenGL勺CVV的Z范围是[-1,1],而D3D的CVV的Z范围是[0,1]。
也就是说,D3D中在近裁剪平面上的点投影之后的点会处于CVV的Z=O平面上,而在远裁剪平面上的点投影之后的点会在CVV的z=1平面上。
这样我们的计算方程就是
+⅛
Z
az
LZ
从而我们得到了透视投影矩阵的第一个版本
这个时候第三个分量变换到CVV情形了,CVV勺Z范围是[0,1]。
接下来根据上一篇文章所讲到的,我们要把前两个分量变成CVV青形,CVV勺X和y范围是[-1,1],如下图所示:
使用线性插值,我们有:
top-bottom1—(—1)
这里left和right是投影平面的左右范围,top和bottom是投影平面的上下范围。
XCVV和ycvv是我们需要算出的在CVUf形中的X和y,也就是我们要计算出的结果。
但在算出它们之前,我们先把上面的式子写成:
N%Ieft_⅞v1
=+≡—
right—Ieftright—Ieft22
Ny/t
∕z_botSτn_ycvv1
lop-bottomlop-bottom22
这里有一个需要注意的地方,如果投影平面在X方向上居中,则
_硕=£
right-Ieft2
那么第一个式子就可以销掉等号两边的1/2,写成
rigid-Ieft2
同理,如果投影平面在y方向上居中,则第二个式子可以写成
缚/
∕z_儿仰
top一bottom2
则我们现在分两种情况讨论:
(1)投影平面的中心和x-y平面的中心重合(在X和y方向上都居中)
(2)一般情况
我们分别讨论:
(1)特殊情况方程
top-bottom2
这组是特殊情况,方程比较简单,但也是使用频率最高的方式(这是
D3DXMatrixPerspectiveLH、D3DXMatrixPerspectiveRH、
D3DXMatrixPerspectiveFovLH、D3DXMatrixPerspectiveFovRH四个方法所使用
的情况)。
我们导出它:
INx
(right一Ieft)z2Ny
{top-bottom)z
则我们反推出透视投影矩阵:
(27*3
T
(2J⅛、
y
<
2N
r-l
∩
2N
00
∩∩
(right-Iefi)Z
2Ny
J⅛vPΓ
(rightleft)
2
[top-bottom)z
>
(top-bottom)
其
V
t-b
WW
az+b
□1
1
LZJ
I0
bOJ
其中
a=
F-NNF
F-N
而r-l和t-b可以分别看作是投影平面的宽W和高h。
最后那个矩阵就是D3D的透视投影矩阵之一。
另外呢,如果我们不知道right、left、top以及bottom
这几个参量,也可以根据视野(FoV-FieIdOfVieW)参量来求得。
下面是两个平面的视野关系图:
2鮎W2
TM二尸-Z
2NJOVV
—7=UOt才
r-l2
cot⅛
Ξ
同理
—=cot⅛其中虫—7
h2
2NJfo升
£
-b2
苦2N
Cot-__-
其中,两个fov分别是在X-Z以及y-z平面上的视野。
如果只给了一个视野,可以通过投影平面的宽高比计算出来:
aspect_ratio二—
h
=W=血Xasp&
ct_1rafio或者
aspect_ratio
用一个视野算出W或者h,然后用宽高比算出h或者WO
(2)—般情况的方程
这组方程比较繁琐,但更具一般性(和OPenGL一般矩阵的推导一致,这也是
D3DXMatrixPerspective0ffCenterLH和D3DXMatrixPerspectiveOffCenterRH两个方法所使用的情况)。
我们继续反推出透视投影矩阵:
t_bb+t
b-t
O
JNF
b
最后那个矩阵就是D3D的一般透视投影矩阵好了,目前为止,我们已经导出了D3D的两个透视投影矩阵。
下面我把上一篇导出的OPenGL的透视投影矩阵写出来,大家可以拿它和刚刚导出的D3D的一般性透视投影矩阵做一个对比。
(2N
22√
r+Z
r-lt+&
pr*oj_matrix(OPe∕ιGL)=
t-b
a
b
t0
-1
o丿
a
F=N
*2NF
b——
如果仔细观察,可以发现二者在元素的布局上是一个转置的关系,这个就是由它们使用的左右手坐标系以及使用的行列矩阵的差异造成的。
而另外在一些元素的
细节上也存在着差异,这是由于D3D的CVV勺Z范围不同造成的。
可见在原理相同的情况下,细微的环境差异可以造成非常大的变化,而这就是透视投影矩阵存在诸多不同版本的原因。
一般情况的透视投影矩阵也可以使用视野方式来定义,方法和特殊情况相同。
M3G勺透视投影矩阵
M3G是对OPenG进行的一个封装,它的透视投影变换矩阵被放到了类Camera里面。
因为它封装了OPenGL因此环境和OPenGl相同:
右手坐标系、列向量乘法、CVV范围[-1,1]。
它唯一和OPenGL有些差异的地方就在于它只使用投影平面的中心和x-y平面的中心重合(在X和y方向上都居中)的情况(就是我们上面D3D的第一种特殊情况)。
我们用OPenG透视投影矩阵最终版本来说明(再次提醒,如果读者对此感到迷惑,请参考第一篇文章):
r+?
r-lt+b
PrqJ_matrix(OPenGL)—
θ
F+M
a=—
F7J2NF⅛
上面是OPenGL透视投影矩阵的最终版本,也是一般性版本,我们要把它变成特殊性,版本,非常简单,和上面D3D的特殊情况一样,我们从对X和y进行插值的那一步来看:
r-lr-l22
%b_yI
.t-bt-b2+2
t^_£
1—(_1)
f—b1—(-1)
和D3D的第一种情况一样,销掉两边的1/2,得到:
(
f”7■八
玲7)
-2Ny
z{t-0)
az-^b
—予
i-⅛£
IZ+⅛
I])其中
Iy>
■F+M
112NF
I
(2NCλΛ
——OOO
?
O^Oo
—⅛
OOab
"
OQ-1Qyj
仍然可以通过视野参数来设置透视投
D3D的完全相同。
最右边那个矩阵就是M3G的透视投影矩阵<影矩阵,这里请读者自行推导,方法与上面
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 透视 投影 矩阵 推导