小白计算机图形学入门之路一(Games101-3)

前言:

        本次的笔记主要是补充说明了欧拉角和观测变换(模型视图变换、投影变换),这次的课程相对复杂,因此可能有没有理解好的地方。其次非常抱歉的是现在才更新,是因为前两天正好有行程安排,后续的games101笔记更新本小白争取三天一更,希望各位大佬一起交流。

1、欧拉角和四元数

1.1、物体实现复杂旋转

        在说明欧拉角之前,我们得明白,在unity内部,怎么去实现一个物体的复杂的旋转转换的。

        通过上图可知,一个物体的复杂旋转实际上是通过一些简单的变换转换过来的,举个例子,以上面的飞机为例,飞机的复杂旋转可以先绕roll轴旋转,再绕pitch旋转,再绕yaw旋转。这里的旋转实际上分成两种情况:1、绕运动以后的轴进行旋转。2、绕固定轴进行旋转。

        无论是哪种情况,都能够得到三个数就可以得到一下一个公式。

        这里使用一下网上大佬的演示图:

1.2、欧拉角

       1.2.1、 概述

                根据上面的公式就可以看出来,欧拉角可以直观且简单的表示出一些复杂的旋转情况。          那么关于上述的两种情况实际上是有相关定义的:1、绕运动轴旋转------内旋。2、绕固定轴          旋转-----外旋。在unity中使用的是内旋。当然,欧拉角的旋转绕轴是有一定顺序的,untiy中

        绕轴顺序是z-x-y。

        1.2.2、万向锁

                万向锁,也有些地方是称为万向死锁,关于这个概念本小白也是翻阅了很多才理解的。

        万向锁的概念是:是在使用动态欧拉角表示三维物体的旋转时出现的问题(这是百度百科的

        概念)。

                那我的理解实际上就是中间绕某轴旋转后,后面的绕轴旋转导致和前面的轴重合从

        而使得后面的旋转并没有起到任何作用(因此可以得出理论上来说万向锁应该是发生在

        外旋上)。

             

               看到上述解释以后是不是还会有一点疑问呢?如果按照的是z-x-y进行的旋转,那旋转以后的轴不还是两两垂直的吗?怎么会出现共线的情况呢?

                !!!恭喜你,你和本小白进入了同样的误区,这里通过本小白翻阅了大量的博客,最后发现,实际上来unity中旋转过程的欧拉角并不是按照时刻本身的坐标系来进行旋转的,而是按照原来的坐标系进行的旋转,这里可以引入一篇大佬的博客看一下!!Unity 中的旋转_unity 的旋转x怎么不是和z轴一样都是按照自身坐标系-CSDN博客

1.3、四元数

        四元数的本质实际上是复数的扩充,其主要目的实际上是用来做旋转插值的,不过从某个角度出发避免了万向锁。具体的同上述博客可以观看。

2、观测变换

        观测变换(ViewingTransformation):三维空间物体转换为二维的照片的变换过程。这么说可能会觉得有点抽象,我们结合unity的渲染管线流程。这里使用百度出来的一张图片:

在顶点处理的过程中,有从模型空间到裁剪空间,这一部分就是观测变换,换个说法实际上就是mvp变换。

        本章说明,在games101的课程中主要说明了mvp矩阵的推导过程,如果本篇笔记没有说明白的地方可以看看哔哩哔哩的games101第四节的课程,当然,作为unity的客户端开发程序员对其更多的是了解,在unity的图形库中是可以直接得到mvp矩阵的。

2.1模型视图变换

        那么mvp怎么理解呢?

        拿我们一般拍照的流程为例子

那这个过程实际上就对应了mvp变换:

        1、组织任务和找好地方就是对应的模型变换

        2、摆好pose,固定相机就是视图变换

        3、拍照就是投影变换。

        本小白看到视图变换的时候就会有个问题闪过,视图变换的意义在哪儿呢?作用又是什么呢?

像这样固定摄像机的角度又有什么意义呢?

2.1.1视图变换的作用

        首先我们都知道,模型是有模型空间的,那么经过m矩阵以后就变成了世界空间,再经过v矩阵以后就变成了观察空间,那么观察空间是什么呢?

        这里可以定义一下,所谓的观察空间实际上是为了方便后面投影空间做计算的,因此对于观察空间而言,最重要的是摄像机坐标为原点,且看向z轴负端。由此可以看出,他并不是一个什么很特殊的空间,用一个很通俗的话来说是一个摄像机是标准化的摄影棚的存在。摄像机的标准化方便后期的成像。

        这里展示一下模型视图变换的大概过程:

       

                                                摄像机和物体一定是相对运动为静止的。   

     具体的推导流程本小白就不摆出来了,因为untiy内部是有进行封装的,并且不同的坐标系实际上的mvp矩阵都是不一样的,只需要知道大概的思路自己就可以在相应的位置进行一次推导即可。

2.1.2、确定摄像机向上轴的作用

        确定向上轴实际上是为了确定观察的方向。为什么呢?

        !!!本小白得出的结论是,根据叉乘来的,上面我们已经确定了观察空间中的摄像机的看向方向是z轴的负方向,那么z轴的得到不就是x和y的叉乘吗?如果不确定y轴的话,那就一定得不到z轴的负方向。因此,摄像机必须确定向上轴。

2.2、投影变换

        投影变换分为正交投影和透视投影

        左边的是透视投影,右边的是正交投影。其实他们有一个很通俗且很容易区分的地方在于,改投影方式是否有近大远小这个概念。透视投影的方式类似我们人类的眼睛,是有近大远小的。但是正交投影是没有这个说法的。因此放在unity中的就是说,一般而言,3D游戏的摄像机是透视的投影方式,2D的游戏是摄像机是正交的投影方式。

        注意:实际上作为unity客户端的开发人员而言,我们需要知道的大概就是整个流程以及在空间转化过程中的原理,并不要求一定要知道下面矩阵是如何推导出来的(对本小白而言),但是得知道他们推导的思路,因此下面更加注重的是思路,在unity中的mvp矩阵并不是下面的矩阵,因为unity中使用的是左手坐标系。

        那么他们是怎么实现的呢?

2.2.1、正交投影

        

        这是一个很简单的关于正交的理解,实际上就是去掉z轴,将图像缩放到平移到归一化矩阵上面。

上述物体经过了什么变换呢?其实可以看出来,这个物体经过了平移和压缩变换,压缩进范围为[-1,1]的矩阵里面(!!!注意下这个矩阵是左乘得到的)。

2.2.2、透视投影

        首先我们来看下面的概览图:

        

其实通过这个图就可以发现,在透视投影中不能使用欧几里得的几何理论,因为在这个视锥范围内两条平行线实际上是相交的,那么就会有个问题了,透视投影出来的也应该是个二维的图,那么他是怎么实现投影的呢?

这里有个很简单的理论思想,先挤压,后正交。为什么呢?

        为什么要做挤压操作,挤压成什么样子呢?我把定义写出来先把远平面挤成(1、近平面永远不变2、远平面z值不变3、远平面中心不变)一个标准长方体(高度相同),由此实际上就可以发现,将这个图形挤压成正交投影的立方体再进行正交投影就可以单独抽离出来挤压也就是压缩这一部分的内容。

        那么,压缩怎么实现呢?以下是透视投影的图

        上述图的公式实际上可以很方便的得到(通过相似三角形),那么已知了缩放比例很容易的就可以得到对应的x,y坐标,通过与原来的x,y可以得到以下的缩放矩阵:

n代表的就是比例。

但是z方向的怎么得到呢?

首先我们知道的是小平面是不变的并且z是不变的,因此由这个性质得到

第三行的前两个是0,0后两个实际上任然未知。

不知道大家是否记得齐次坐标的以下性质

对的,乘以任意的值仍然代表对应的点。那么我们对上面得到的第三行的矩阵进行计算就可以得到

因此就可以对应分别计算出来A和B

因此可以得到完整的压缩矩阵!!!!当然,还得乘以一个正交投影矩阵才是完整的透视投影矩阵。

那么课程最后有一个小问题,中间的点经过挤压后z是投射到前面的平面还是后面的平面?

        本小白的解决方法实际上就是将(x,y,z,1)带入进去,其中z等于(f-n)/2,通过本值和原来的值相比,看看是大还是小就可以得出是近平面还是远平面。当然这也不一定是准确的,欢迎各位大佬指正本小白的错误的地方,感谢。

总结:

        本次笔记的主要内容是观测变换的原理和对应矩阵由来的思路,值得注意的是,计算方法不一定适合unity,因为unity是左手坐标系,而games101是右手坐标系,但是思路是一样的,如果有兴趣可以尝试一下自己进行计算,当然,unity的图形库里面是由封装好的接口可以直接调用的。

  • 48
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值