您的位置:首页 > 其它

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

2014-12-16 17:48 323 查看
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]的范围。这个是透视变换的目的之一阿。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: