做社群的网站有哪些,基于mvc4商务网站开发,网络服务器的分类,广西网络推广怎么做文章目录 前言正文为什么需要屏幕空间变换#xff1f;什么是屏幕空间变换#xff1f;屏幕空间变换矩阵如何推导#xff1f;问题描述步骤描述 结尾#xff1a;喜欢的小伙伴点点关注赞哦! 前言
前面章节主要讲解了视图变换和投影变换#xff0c;此时距离在屏幕空间显示也就… 文章目录 前言正文为什么需要屏幕空间变换什么是屏幕空间变换屏幕空间变换矩阵如何推导问题描述步骤描述 结尾喜欢的小伙伴点点关注赞哦! 前言
前面章节主要讲解了视图变换和投影变换此时距离在屏幕空间显示也就只差一步之遥了只需要将NDC坐标转换为屏幕空间坐标即可有了前面一些章节的学习相信大家对于本章节的学习还是很容易的
正文
为什么需要屏幕空间变换
因为经过了视图变换和投影变换后咱们已经将所有的顶点坐标转换成了NDC坐标也就是x/y/z的范围都在 [ − 1 , 1 ] [-1,1] [−1,1] 的坐标但是正常咱们得电脑屏幕的XY坐标范围一般都是 [ 0 , w i d t h − 1 ] × [ 0 , h e i g h t − 1 ] [0,width-1] \times [0, height-1] [0,width−1]×[0,height−1] 所以咱们需要屏幕空间变换
什么是屏幕空间变换
本质上和之前的视图变换、投影变换并无不同就是一个矩阵罢了
屏幕空间变换矩阵如何推导
问题描述
将x坐标由 [ − 1 , 1 ] [-1,1] [−1,1] 变换为 $ [0,screen_width - 1]$ 将y坐标由 [ − 1 , 1 ] [-1,1] [−1,1] 变换为 $ [0,screen_height - 1]$ 将z坐标由 [ − 1 , 1 ] [-1,1] [−1,1] 变换为 $ [0,1]$.
如下图所示 步骤描述
步骤1将xyz坐标变换到 [ 0 , 1 ] [0,1] [0,1] 的范围
步骤2将xy坐标缩放至 [ 0 , s c r e e n w i d t h − 1 ] × [ 0 , s c r e e n h e i g h t − 1 ] [0, screen_width - 1] \times [0, screen_height - 1] [0,screenwidth−1]×[0,screenheight−1]
咱们先思考下步骤1如何实现呢当前的xyz坐标范围为 [ − 1 , 1 ] [-1,1] [−1,1] 目标的坐标范围为 [ 0 , 1 ] [0,1] [0,1] 如何做呢
这时候其实咱们分两步
第一步将 [ − 1 , 1 ] [-1,1] [−1,1] 缩放至 [ − 0.5 , 0.5 ] [-0.5,0.5] [−0.5,0.5] 的范围。
第二步将 [ − 0.5 , 0.5 ] [-0.5,0.5] [−0.5,0.5] 沿着对应轴轴方向移动0.5单位即可。
于是咱们分别得到缩放矩阵和平移矩阵如下 S [ 0.5 0 0 0 0 0.5 0 0 0 0 0.5 0 0 0 0 1 ] S \begin{bmatrix} 0.5000\\ 00.500\\ 000.50\\ 0001\\ \end{bmatrix} S 0.500000.500000.500001 T [ 0 0 0 0.5 0 0 0 0.5 0 0 0 0.5 0 0 0 1 ] T \begin{bmatrix} 0000.5\\ 0000.5\\ 0000.5\\ 0001\\ \end{bmatrix} T 0000000000000.50.50.51
于是咱们只需要将两者相乘即可获得相应的结果 M 1 T ∗ S [ 0.5 0 0 0.5 0 0.5 0 0.5 0 0 0.5 0.5 0 0 0 1 ] M_1 T * S \begin{bmatrix} 0.5000.5\\ 00.500.5\\ 000.50.5\\ 0001\\ \end{bmatrix} M1T∗S 0.500000.500000.500.50.50.51
然后咱们思考下步骤二当前的xy坐标范围为: [ 0 , 1 ] [0,1] [0,1] 目标范围为 $[0,screen_width-1] 和 [0,screen_height-1] $
这个问题也就只是个xy轴的缩放问题而已很容易得到以下缩放矩阵 M 2 [ s c r e e n _ w i d t h 0 0 0 0 s c r e e n _ h e i g h t 0 0 0 0 1 0 0 0 0 1 ] M_2 \begin{bmatrix} screen\_width000\\ 0screen\_height00\\ 0010\\ 0001\\ \end{bmatrix} M2 screen_width0000screen_height0000100001
然后咱们将步骤一的结果和步骤二的结果结合起来即可得到最终的屏幕空间变换矩阵如下 M s c r e e n M 2 ∗ M 1 M 2 [ 0.5 ∗ s c r e e n _ w i d t h 0 0 0.5 ∗ s c r e e n _ w i d t h 0 0.5 ∗ s c r e e n _ h e i g h t 0 0.5 ∗ s c r e e n _ h e i g h t 0 0 0.5 0.5 0 0 0 1 ] M_{screen} M_2 * M_1 M_2 \begin{bmatrix} 0.5*screen\_width000.5*screen\_width\\ 00.5*screen\_height00.5*screen\_height\\ 000.50.5\\ 0001\\ \end{bmatrix} MscreenM2∗M1M2 0.5∗screen_width00000.5∗screen_height00000.500.5∗screen_width0.5∗screen_height0.51
于是大功告成啦咱们成功的将NDC坐标转换成了屏幕空间坐标
结尾喜欢的小伙伴点点关注赞哦!
你们的点赞就是我创作的最大动力希望对各位小伙伴能够有所帮助哦永远在学习的道路上伴你而行 我是航火火火一般的男人