3D图形数学速成课(NOTE)2

13楼  Twinsen 2010-02-11 09:46发表  [回复]
CxxlMan,z会被放入w,但是进行透视除法之前会进行裁剪,会把z=0的部分剔除掉从而保证透视除法的时候不会存在z=0的顶点。
12楼  CxxlMan 2010-02-11 02:25发表  [回复]

那個 z 不是會被放入 w (應說是放入 -z) 嗎,若 z 是 0 ,進行透視除法時沒問題嗎



7楼  Twinsen 2010-02-24 09:52发表  [回复]
最原始的 透视投影的目的不是为了裁剪,而是为了把3D物体投影到2D平面上在屏幕上显示出来。
CVV不是必需的,而是为了方便裁剪而生成的产物,
如果没有CVV,也可以直接用视锥体进行裁剪,但复杂度很大 ,但透视变换矩阵会简单一些。
16楼  CxxlMan 2010-02-22 18:08发表  [回复]
透視除法前做裁剪我覺得有矛盾,整個透視投影變換不就是為了能用 CVV 做裁剪嗎,未做透視除法前的頂點應不足以做裁剪吧,一個三角面或線段的各頂點在這階段還未處於 CVV 的座標間中,若能做裁剪還要透視除法做什麼。
另外那個透視投影變換矩陣通常還會和 Z Buffer 或 W Buffer 結合,讓我覺得更頭痛,是不是能補充這部份呢

18楼  Twinsen 2010-02-24 09:52发表  [回复]
未作透视除法的顶点具有最大的信息量,因为它包含了w,具有原始的z信息在里面,裁剪的时候是使用齐次形式(x, y, z, w),而透视除法(投影)之后得到的是普通形式(x/w, y/w, z/w)这个就是NDC中的坐标,它是一个损失了信息量的结果,用来进行光栅化操作,其中z/w得到的就是NDC中的深度值,用来做z缓冲深度测试。请先理解透视投影的这个思路和z-buffer的使用情况,再考虑w buffer以及其他一些技术。

20楼  Twinsen 2010-02-25 18:03发表  [回复]
在固定流水线中,低级的观察体裁剪可以在(1)世界坐标系中通过 视锥体裁剪; (2)相机坐标系中通过 视锥体裁剪
(3)裁剪坐标系中通过CVV裁剪;我们在这篇文章中所说的裁剪就是(3)。这个可以通过图形API(比如opengl以及d3d)在硬件中完成。
21楼  Twinsen 2010-02-25 18:03发表  [回复]
你所说的应该是(2),这个裁剪是在相机空间中进行的,是没有经过透视变换的。是通过在原点的相机系统的视锥体进行裁剪的,这个裁剪就是用视锥体的6个平面(近、远、左、右、上、下)对进入相机空间的多边形进行的。请注意,无论在什么地方进行裁剪,裁剪和投影都是没有直接关系的,如果没有裁剪,投影仍然可以进行。

透视投影(和 透视除法 相关)的目的是为了把3D物体投影到2D平面上在屏幕上显示出来。(然后是透视除法——也就是投影!(x''/w'', y''/w'', z''/w'')=(x''', y''', z''', 1),最后这个坐标就是在归一化的设备(ps:NDC:归一化的设备)坐标中的点。
CVV和裁剪有关:CVV不是必需的,而是为了方便裁剪而生成的产物,如果没有CVV,也可以直接用视锥体进行裁剪
裁剪和投影都是没有直接关系的

22楼  Twinsen 2010-02-25 18:11发表  [回复]
另外,这么说你可能就容易理解了。
透视投影可以分成透视变换+投影两个步骤。
透视变换就是用透视矩阵去乘顶点(x, y, z, 1),乘完之后呢,我们得到了顶点的齐次形式(x', y', z', w'),用这个齐次形式来做裁剪,得到新的点(x'', y'', z'', w''),
然后是透视除法——也就是投影!(x''/w'', y''/w'', z''/w'')=(x''', y''', z''', 1),最后这个坐标就是在归一化的设备坐标中的点。
23楼  Twinsen 2010-02-25 18:15发表  [回复]
如果把 透视变换+投影 应用到视锥体上,得到的就是CVV。实际上透视变换 + 投影 的目的就是把视锥体变成CVV,而把它应用于顶点的则可以看作是一种“统一的形变”或者“空间的变换”——经过这个变换,视锥体变成了CVV,而其他的顶点也按照这个模子进行变换。





关于Z = 0 的情况分析

27楼  Twinsen 2010-02-26 13:16发表  [回复]
:)对于裁剪来说,就是CVV阿,xyz都在[-1, 1]的范围。这个是透视变换的目的之一阿。
11楼  Twinsen 2010-02-10 09:46发表  [回复]
CxxlMan,我们推导矩阵的时候需要除以z,但实际上矩阵推导完成之后,会在透视除法之前进行裁剪。所以z=0的部分都会被剔除掉,不会出现除零的情况。这也看出裁剪的必要性。
10楼  CxxlMan 2010-02-09 20:16发表  [回复]
我有一個疑問
那個 z 的值若正好為 0 不會有問題嗎?
24楼  CxxlMan 2010-02-25 19:59发表  [回复]
本來透視投影和裁剪是沒直接關西,我是對 w = 0 的情況有疑問,可是你說在透視除法前會先裁剪掉造成 w = 0 的頂點,若真是如此就有依存關西了,若 D3D 和 OpenGL 真的在透視除法前會先裁剪掉就太好了,不用擔心 w 會等於 0 的問題,可是真的有這麼做嗎?而且現在流行 Shader 的方式,把各個轉換矩陣都先乘好,直接用來處理頂點,也沒事先做裁剪,完全信任 D3D 和 OpenGL 會在 CVV 做好裁剪,這對 w = 0 的情況要怎麼解決
13楼  Twinsen 2010-02-11 09:46发表  [回复]
CxxlMan,z会被放入w,但是进行透视除法之前会进行裁剪,会把z=0的部分剔除掉从而保证透视除法的时候不会存在z=0的顶点。









29楼  Twinsen 2010-02-26 16:52发表  [回复]
CxxlMan,我大概知道你在哪个地方的理解和我不一样了。你可能觉得,在透视除法之前,还没有得到CVV,怎么可能进行CVV裁剪呢?对吧?其实,顶点经过了透视变换之后,变成了齐次形式(x, y, z, w),虽然还没有进行透视除法,但是已经具备了透视除法的条件了,已经可以做透视除法了。而且一旦进行了透视除法(x/w, y/w, z/w, w/w),得到的(x', y', z')就在CVV所在空间中了,可以针对CVV对图元进行裁剪了,这个是比较合理的思路。

我的理解:
裁剪需要透视除法,透视除法也有另一个作用就是 投影【PS: 然后是透视除法——也就是投影!(x''/w'', y''/w'', z''/w'')=(x''', y''', z''', 1),最后这个坐标就是在归一化的设备坐标中的点。】
裁剪的步骤是:
你可能觉得,在透视除法之前,还没有得到CVV,怎么可能进行CVV裁剪呢?对吧?其实,顶点经过了透视变换之后,变成了齐次形式(x, y, z, w),虽然还没有进行透视除法,但是已经具备了透视除法的条件了,已经可以做透视除法了。而且一旦进行了透视除法(x/w, y/w, z/w, w/w),得到的(x', y', z')就在CVV所在空间中了,可以针对CVV对图元进行裁剪了



25楼  CxxlMan 2010-02-26 02:18发表  [回复]
你提到:「透視變換就是用透視矩陣去乘頂點(x, y, z, 1),乘完之后呢,我們得到了頂點的齊次形式(x', y', z', w'),用這個齊次形式來做裁剪,得到新的點(x'', y'', z'', w'')」這一點我覺得行不通,就以能避免 w = 0 近裁剪來說。(1) D3D 和 OpenGL 是否真的有在這階段做裁剪。(2) 若不做透視除法,D3D 和 OpenGL 要怎麼決定近裁剪平面在哪。

26楼  CxxlMan 2010-02-26 09:06发表  [回复]
哈哈! 我懂了, 只要將 -(az+b)/z 指定等於 -1,就可以倒推出近裁剪平面的 z 位置 ,腦筋一時沒轉過來 = =" 很感謝你的指導 ^^

27楼  Twinsen 2010-02-26 13:16发表  [回复]
:)对于裁剪来说,就是CVV阿,xyz都在[-1, 1]的范围。这个是透视变换的目的之一阿。

透视投影的目的不是为了裁剪,而是为了把3D物体投影到2D平面上在屏幕上显示出来。 CVV不是必需的,而是为了方便裁剪而生成的产物, 如果没有CVV,也可以直接用视锥体进行裁剪,但复杂度很大,但透视变换矩阵会简单一些。

归一化的设备坐标 (Normalized Device Coordinates)  NDC
未作透视除法的顶点具有最大的信息量,因为它包含了w,具有原始的z信息在里面,裁剪的时候是使用齐次形式(x, y, z, w),而透视除法(投影)之后得到的是普通形式(x/w, y/w, z/w)这个就是NDC中的坐标,它是一个损失了信息量的结果,用来进行光栅化操作,其中z/w得到的就是NDC中的深度值,用来做z缓冲深度测试。请先理解透视投影的这个思路和z-buffer的使用情况,再考虑w buffer以及其他一些技术。

透视投影可以分成透视变换+投影两个步骤。
透视变换就是用透视矩阵去乘顶点(x, y, z, 1),乘完之后呢,我们得到了顶点的齐次形式(x', y', z', w'),用这个齐次形式来做裁剪,得到新的点(x'', y'', z'', w''),
然后是透视除法——也就是投影!(x''/w'', y''/w'', z''/w'')=(x''', y''', z''', 1),最后这个坐标就是在归一化的设备坐标中的点。

如果把 透视变换+投影 应用到视锥体上,得到的就是CVV。实际上透视变换 + 投影 的目的就是把视锥体变成CVV,而把它应用于顶点的则可以看作是一种“统一的形变”或者“空间的变换”——经过这个变换,视锥体变成了CVV,而其他的顶点也按照这个模子进行变换。


我的理解:
裁剪需要透视除法,透视除法也有另一个作用就是 投影【PS: 然后是透视除法——也就是投影!(x''/w'', y''/w'', z''/w'')=(x''', y''', z''', 1),最后这个坐标就是在归一化的设备坐标中的点。】
裁剪的步骤是:
你可能觉得,在透视除法之前,还没有得到CVV,怎么可能进行CVV裁剪呢?对吧?其实,顶点经过了透视变换之后,变成了齐次形式(x, y, z, w),虽然还没有进行透视除法,但是已经具备了透视除法的条件了,已经可以做透视除法了。而且一旦进行了透视除法(x/w, y/w, z/w, w/w),得到的(x', y', z')就在CVV所在空间中了,可以针对CVV对图元进行裁剪了

27楼  Twinsen 2010-02-26 13:16发表  [回复]
:)对于裁剪来说,就是CVV阿,xyz都在[-1, 1]的范围。这个是透视变换的目的之一阿。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值