GAMES101-现代计算机图形学入门-闫令琪 - P21:Lecture 21 Animation - GAMES-Webinar - BV1X7411F744
各位同学大家好啊,咱们今天给大家说本课程的第21讲,我们开始进入到第四个话题,也就是嗯,这叫什么来着啊,动画啊,动画与模拟这一块儿好,然后嗯咱们还是一样,在课程之前有几个事情,然后给大家说一说啊。
什么呢,关于作业啊,作业七目前有95份起叫挺好的,然后呢啊我没想到哈,所以大家更愿意去在我们给定这些范围内去选大作业的参考题目不错,也没有什么问题,就是目前来说有18个同学提交了。
说这个我有不同的想法啊,很不错,如果你真的愿意再继续提交的话,没问题啊,就是说嗯你也可以随时联系我,说我这个突然想做某个什么项目行不行行,其实应该是可以的啊,啊另外有同学反映大作业有没有框架呀。
有呃不是有啊,是是是说这个框架我们不再提供,就是说你自己随便去找,是这个意思啊,你可以用任意的这个已有的框架,然后或者说就用咱们之前作业的一些框架都没有问题,好吧啊,这是一个关于大作业啊。
然后另外一个事情是我自己发现的啊,我自己发现我自己有一个坏习惯,坏习惯之你分享给大家啊,这个有错,我这肯定要承认什么呢,就是说我用这个,你看我又用了,我用这连词用的用的非常频繁啊。
然后特别是刚才大家听英文的时候说了很多ok和so对不对,然后这边也是嗯嗯怎么说呢,老外平常他们也会这么说,会是会用很多各种各样的连词,很奇怪的这种用so当作发语词之类的。
然后我自己听了一下我之前的中文的讲座,我会发现我经常会使用这个和,然后对不对,然后呃好吧,所以说呢嗯这块儿我自己的感觉是这样的,我自己在高速思考的时候,然后我实在是注意不到这个事情,然后你看我又用了。
然后所以不管怎么样吧,我想办法来避免他们好吧,但是从另外一个角度上说,如果我再这么用,就说明这块的逻辑应该不会有问题,因为我在思考啊,怎么样把这个事情说清楚啊,好吧,那就这样嗯,咱们看一看啊。
回到课程内容上来啊,我们的课程呢之前说有四个不同的方向啊,四个不同方向我们提到光栅化是最早的,我们说我们不叫open gl,我们来说这个光栅化是怎么样实现的,然后自己也可以去做,然后学完这块之后。
自己肯定可以掌握open gl的基本用法,没有问题吧对吧,然后呢我们提到几何怎么样表示曲线曲面,然后之后我们又回到说渲染这个方向,然后我们提到更准确的渲染,所谓呃这个渲染方程,然后以及呃光线传播。
对不对,然后复杂的一些呃光线传播方法也给大家提到材质对吧,那咱们今天这个在讲完了两个额外的一个话题之后,对吧嗯一个是颜色,一个是所谓啊相机啊,广场啊这块儿的事情对吧。
嗯然后今天呢我们开始进入第四个话题啊,叫做呃叫做动画,或者说模拟,或者有人说仿真其实是一回事啊,然后就是说我们在计算机图形学中,我们目前所说的所有东西都是基本是静态的对吧,你已经有了一个场景。
你怎么样把它给表现出来,包括这个呃几何,我怎么样拿各种各样不同的这种几何形状来描述它对吧,然后包括给定了几何之后,给定了光照之后,怎么样把它渲染出来,让他看着真实,那么现在就有一个问题说这些场景啊。
这有很多这些而运动的这些东西啊,我们应该如何表示啊,然后他们是怎么算出来的,怎么做出来的对吧,这就是我们要关心的这第四个话题,然后呃那我们今天就开始说这个事情,好吧好啊,来我来看看在今天的课前哈。
有些同学问问题,然后嗯有没有问些这些问题,有同学说反映我这么说没什么问题啊,这也还行,感谢大家,我自己发现在b站上面看,如果用1。5倍速或者二倍速来看的话,好像是中间这些连词并不是什么大问题啊。
有同学反映右下角这张图的sp p有多少,这张图是用photo map来做的哈,然后这块其实我也不知道有多少,但是最后得到一个相对干净的一些图,至少肯定如果你用ptracing得用嗯。
应该是1k sp里以上啊,嗯有同学问嗯,大作业的截止是哦,大作业的截止时间没问题啊,大作业是这么回事,就是有很多同学反应要要延期啊,我现在非常倾向于延期,如果说没有什么意外的话。
我可能下节课我就会给大家通知,说会这个延期一周或者更多的时间好吧,那那这块儿大家暂时不用太担心这个事情,好啊,没问题,那就先这样啊,那咱们进入今天的正式话题哈,今天其实内容还是挺多的。
然后我希望留出来更多的时间给这个下一节课啊,那么今天我们会讲啊,计算机动画入门,然后我们讲些什么呢,大家可以看到我们会讲到计算机动画的历史,我们会讲他的一些啊基本的制作动画的方法,比如说观点之争对吧。
然后我们也会说一些关于物理模拟的最基本的思想,然后关于运动学和这个所谓reading到底是做什么的呢,然后今天我们一个给大家介绍,然后这两节课的主要安排是今天的课我们会主要说呃一些基本的概念。
然后下一节课咱们主要说解法是这个意思啊,下节课和嗯目前来说学术界的研究可能更接近一些,今天的课呢相对有趣一些啊,这个这个意思首先呢我们既然提到动画,那么动画是什么对吧。
那么动画最初它的定义是reanimation,它定义就是说把一些物体变成活的对吧,然后什么让他活的呢,就让他们能够动起来对吧,那么动画是作为一种这个交流的一种工具。
然后呢给别人展示各种各样的这个动起来的东西,然后呢本身动画更关注的是所谓美学,它看起来好看不好看对吧,同时呢大家想早期作动画肯定是手画出来的,然后大家并不太关心说我这画的到底对不对啊,是不是符合物理啊。
这让它看起来差不多对,那就差不多对吧,所以从一开始来说啊,动画是做这么一个事情的,然后呢我们在图形学里也可以把动画理解成什么呢,理解成对于建模,或者说这个啊几何啊它的一种拓展呃,什么意思呢。
就是说我的动画无非就是说我在不同的时间或者不同的帧,它有不同的几何形状,对不对,我动画就是说我为了得到这些这些不同的几何形状,我应该怎样去做,怎么样去计算,但是算出来之后,我无非就是每一帧有不同的图。
也就相当于我们把3d的模型给延伸到了一个,嗯时间的一个维度上面去对吧,这么理解也没有问题,那么动画是怎么样形成的,很简单,我就只需要把很多的图按顺序按一定的速度去播放它就可以了。
因为人眼呢咱们之前说颜色有一个视觉暂留的效应,就是人们看到一个图,它会记忆一点点时间,然后呢这就说明我们不需要在整个一个时间范围内去呃,非常非常非常集中的去采样对吧,我只需要嗯比如说对于电影来说。
只需要每一帧我放24张图,也就是24fps对吧,就是呃每秒钟我播24张图,然后我就可以让人觉得他是一个很连贯的一种呃动画了,然后呢对于正常一些的视频,就是平常大家一提视频啊,经常会提到说呃。
我需要这个30fps,就是每秒钟要有30帧,这样看起来更流畅,然后又有又有的这个比如说我们要打游戏,我们打游戏呢,我们要求这个体验要比较好,我们要求得这60fps,如果打的游戏是这种射击类。
要求要求非常高,要求连贯性非常高,现在甚至会到这个144Hz,也就是144呃,这张图每秒好吧,是这么个意思,然后呢有一点我特别提一下,就是关于虚拟现实的事情,那么虚拟现实这点啊。
嗯为了让人们嗯戴上头戴式设备看这些呃,其实是离自己很近的这些东西嘛对吧,然后为了让人们看头戴式设备觉得不晕,有很多不同的要求对吧,咱们一开始其实应该提过这个事情,就是说有很多要求,但其中我们提一点。
我们听其中提一点呢,是就是说啊他对帧率的要求非常高,就是你要是觉得不晕的话,它必须非常流畅,两个眼睛都必须达到90fps啊,这就说明啊不同的应用对吧,它对这种动画它的要求是不一样的啊,那么对于动画啊。
咱们这个入门说到这里哈,那咱们现在可以看看动画到底是怎么样呃,这个逐步发展过来的对吧,那么早期的时候啊,人们发现了这个早期的人类在洞穴里面这些壁画,然后大家可以看到呃,语言古的人类啊。
在这个墙壁上画了很多各种各样不同的图,然后如果我们把这些图都给截下来,然后我们把它在一块播放,我们会发现啊,这里画的是一个动态的狩猎的图对吧,好像是在打猎一只鹿对吧,然后所以可想而知啊。
早在公元前多少多少年,我们就已经可以做出这样的动画了,然后那时候人们也明白,这个动画其实无非就是在不同的时间,然后有不同的图,然后把它播放出来,没错吧,只不过那个时候没有播放设备而已。
对吧好,那么那是那个年代,后来那人们就发现这个事情啊,就是说这个随着科学的各种各样的进步,人们想办法去人为地制造一些真正能够看到的一些动画,怎么做呢,很简单,最早期啊有一些圆盘类似的这种呃物体啊。
然后这个圆盘固定在某个中心,它可以旋转旋转的,然后我们可以理解成在六点钟方向就是这么个位置啊,有一个小的窗口,也就是说你只能通过这个窗口看到的那么一小块儿看到什么呢,就是这边的图,然后呢我转动这个圆盘。
那也就是说不同的时间我肯定会看到不同的图对吧,那如果说我调整这个速度,调整正好我就会看到诶,正好在某一个时间它会显示某一张图,我就可以看到一个动画,这就是早期的一些这个动画的一些做法,对不对。
然后这个其实大家小时候应该也玩过对吧,经常经常会在输液呢这个书书的脚上画上一些图,然后大家就用手这么一划,然后人家可以放出很多种很多张图,然后做这个动画,我小时候就玩过啊啊原理是一样的对吧。
就是呃显示一些图按一定的速度,那么嗯到了一定的这个科学技术发展的阶段了,人们就开始真正发明了电影的技术,只不过呢最早期这个电影技术并不是用来娱乐的,而是用来当做一种科学的研究的设备。
比如说这里呢大家可以用电影去拍一个呃这个奔跑的这个马对吧,我们就可以研究在任何一个动态下,这个马的这个四肢它应该是一个什么样的摆放,我就可以把这个生物学的这些事情给研究明白对吧,只不过渐渐的发展呢。
人们发现人们非常喜欢看这些动态的东西,所以渐渐的这个电影业就变成了娱乐业,就是这么回事好吧,那么这里呢就是第一个所谓科学的这个研究造成的第一个电影啊。
好啊,那么还有一些里程碑式的作品啊,简单给大家介绍一下,我们嗯提到动画,提到电影其实本质上是一回事,只不过是内容上多少有区别对吧,那么我们放在一起考虑,那么我们考虑第一步什么点什么样的动画呢。
第一步这个啊所谓feature lance的动画,feature length是什么意思啊,就是说完整长度是相当于是跟电影长度一样的动画,大家可以理解成剧场版啊,这样理解就没有问题。
那么这是第一部手绘的这个剧场版动画,这么理解吧,嗯什么呢,就是白雪公主和七个小矮人,然后这是手绘的手绘的,什么意思,大家可想而知对吧,每秒钟我要放24帧,那我就得每秒钟把这24帧的这些图都给画出来。
放在一块儿,然后播放对吧,那么画这些图要花多长时间呢对吧,那咱们待会儿会给大家介绍,那么这确实至于第一步啊,手绘的嗯,对咱们理解成呃feature length的动画好,那么计算机本身呢也可以生成动画。
只不过这个其实发展的比大家想象的还要早,大家可以看到这么一个视频啊,这个视频他其实用了一个这个早期的非常非常呃古老的一些显示器啊,然后也可以上1963年,这是什么概念对吧。
然后这时候就已经有这种呃类似这种触控笔之类的,只不过不是触控对吧,应该是这种遥控,然后它可以做各种各样的旋转缩放啊,然后可以很精准的定位,大家可以看到这个呃圆锥的这么尖儿对吧,对上这个不同的这个点。
所以做得非常好。
也就是说那个年代就已经可以做出所谓的数字的动画了对吧。
所以想想当时科技是发展的是非常厉害的,那么呃后来呢有一些大神的啊。
他们还做了一些这个各种各样的其他工作,比如说这里呢大家看到的其实是在一个呃这呃在显示一个什么呢。
在显示一个人脸的这三个我们格的模型,这是后来的,大家可以看到这个作者是谁对吧,ed cal是不是很熟悉诶,正好被挡住了啊。
没少啊,就是说这里算是这个非常非常早期的一个这种计算机动画了,用当时的计算能力。
当时数量的多边形大家可以想象,但是已经可以做到各种各样人物的这种面无表情的级别了对吧,然后我刚才说了,让大家看这个人物是谁,如果大家还记得的话。
哈哈哈,这位就是就是这个图灵奖今年投影奖的获得者之一哈,at cat o,咱们之前还学过他的co呃,clark的subdivision算法对吧。
对表面的对多边形细分算法好,那么在这个科学技术啊渐渐渐的进一步提高的过程中,然后人们就又做出了更多更多更酷炫的东西,比如说另外一个里程碑式的作品是侏罗纪公园,那侏罗纪公园,但这个电影虽然相对古老哈。
但是嗯不管怎么样,当时是30非常非常轰动一时的一个作品啊,他们真正的把这个用电脑生成的恐龙直接给放到了这电影里面对吧,还是算是一个非常非常非常大胆的一个尝试,并且效果非常的真实,当然了。
那个年代你们看上去分辨率啊,各种各样的都不怎么样,然后画面整个比较暗,然后我们看到这个恐龙会觉得说诶挺真实的,现在我们但是这么看过去其实有点不太能看对吧。
那就说明大家审美观其实也在随着科技的发展而也在进步着对吧好,那么这是也算是一个里程碑的作品哦,我们把这个声音关起来了啊,然后呢我们这里要给大家提到另外一个里程碑,那什么呢,就是皮克斯做的玩具总动员。
那么玩具总动员他到底是反映了什么呢,他就是说整个一个电影完全都是用计算机生成的,所谓cg这里应该是指computer generated的啊,用电脑生成的呃。
feature lap也是就是完整长度是一个电影长度的这个动画电影,那么他是第一个,所以它是里程碑式的作品,那么这里多给大家说一句啊,这里呢生成阴影,然后这各种各样的这个呃效果吧。
就是说他用的还是黄山画啊,就是那个年代还没有光线追踪啊,然后用的是光栅化的方法,然后已经可以生成这么一种效果了,所以说我觉得如果大家做做大作业,是不是也应该瞄准这种效果来做,对不对,哈哈哈哈呃好吧。
不管怎么样啊,另外一个里程碑,那咱们可以看一下,到了10年前。
动画发展到了一个什么阶段呢,就发展到一个已经看上去非常非常不错的一个阶段,但是这个电影没什么太大名气哈,就是说呃大家可以看到是天上在下这个观正啊,然后主人公非常开心,大家可以看到bug掉到水里面。
这个模拟还是现在做的并不是特别好对吧,这10年10年之前啊,水面上起的这种思维涟漪,然后效果这个看起来仍然不是特别的真实对吧好。
然后呢,那咱们到了这个现在也不是现在去年去年呢,这是冰雪奇缘二,大家可以看到这里呢就充满了大量的细节,比如说这个植物上面的各种各样的花瓣啊,然后草地啊,然后各种各样的特效啊,比如说这个火焰,像这里呃。
这风暴啊这些东西对不对,然后就是说现在的动画电影里面包含的技术是越来越发达。
然后现在做出来的东西嗯。
考虑到是这么回事,首先呢它是动画,它有很多东西啊,需要做一些这个呃就是看起来像动画的一些操作,所以说他并不要求说严格意义上要基于物理。
要看上去非常非常真实,他要求要看上去非常非常像动画,是这么一对吧。
但是不管怎么样,现在的技术已经这个远远不是之前可以比较的了。
那没问题,那简单给大家介绍了一下啊,动画的一些基本历史哈,那么啊我们下面来看什么呢,我们来看动画是怎么制作出来的对吧,那首先我们要提到的一个事情就叫做关键帧动画,那什么叫关键帧呢,关键帧其实很好理解。
什么意思呢,我们可以看这么一个对比图,比如上面这一行的其实是一个人物,他在不同的时间它有三个不同的动作,然后呢我们下面这个图其实在干什么呢,相当于在两个动作之间呢,我补出它这个过渡的动作。
大家可以看到对吧,就是中间这个对应的这些位置,啊我们可以理解成哦这些位置是重要的位置,然后这些对应的真就叫做关键帧,keep frame,然后在中间的过程呢,然后就会呃我们希望得到一些过度的一些结果。
比如说这里大家看到这个人举了一个钩子,对不对,然后他渐渐的举越举越高,正好举到这里,所以这个钩子运动按说是应该有一个这个呃一种一种渐渐的一种变化,可以变到这一帧来对吧,那所以中间的这些过程都不是关键帧。
就是关键帧能够定义整个这个动画的走向,差不多是这么个意思,那么关键帧动画是怎么做的呢,大家,可想而知啊,它是一个它是一个费时费力的过程啊,就当年最早期的时候。
那肯定是由最厉害的这些艺术家们来画出这些所谓关键帧,然后他们会有一些手下,有些助手,对不对,这些助手们然后会帮忙把这些中间的这些真给做出来对吧,直到现在也是一样的对吧。
现在这些漫画家们他们画画出来的各种各样的啊,那就是一格一格的漫画嘛对吧,然后如果要做成动画的话,那势必有大量的人力投入,要做出来各种各样中间的这些过程,对不对,然后这些风格也需要统一,然后就是说每一。
个这个艺术家他们工作量都非常大,然后呢我想起了什么一个事情,就是我小时候啊有一款软件叫做flash,这个flash呢红极一时啊,就是它可以做什么呢。
它可以做的事情就是自动生成这个关键帧和关键帧之间的过渡,也就是说如果你想做一个动画,你给他说干关键帧啊,中间只要它中间过程不是特别复杂,它就可以自动的算出这个呃中间的一些过渡应该怎么做。
所以当时很多人喜欢玩这个自己做自己的各种各样动画啊,当时我也学过一点点,然后只不过我自己的艺术细胞相对少一,些,然后暂时这个不是特别擅长这一方面啊,但是不管怎么样吧。
就是说反映了人们对这个自动化生成这个中间的这些过度的一些追求,对不对,然后就是如果中间的过程当真可以都通过自动化的方式实现,那是非常好,如果不能的话,至少也可以帮助这些助手们减轻很大的压力。
然后在这个呃自动生成的基础上改一些东西就可以了对吧,那所以这自然是一个方向啊,那么我们现在回到关键帧的技术上来,那么关键帧我们刚才说了,它无非就是说给定了一系列不同的帧,中间我们要,插值出来。
这就好像什么呢,这就好像我认为啊每一个真里面啊有若干重要的点,然后这些重要的点在其他的针都应该是长什么样的,对不对,然后我把这些重要的点呢,他们一对应之间的关系找出来之后。
我们就可以把这些这些点在不同的帧中间通过差值的方法算出来,但差值的这这个肯定很容易想到对吧,我比如说我有这个第一针和第十针,那么它对应的这些点都应该在哪里,假设我们知道,那么它中间第五针它肯定在正中间。
它它不一定是在正中间啊,就是说他肯定在中间的,某个位置就是差值是一个和也是一门学问哈,就是说我们之前交过所谓线性差值,那当然是最最最最简单的,大家看到这里面的过渡就已经不是线性了对吧。
他不是说从这儿连一条线到这,它已经有一个某一种什么样的过度了,当然这里的过渡怎么样,看着自然怎么样才是真实对吧,这就很有讲究,那就是这么回事,所以呢嗯关键帧动画本质上就是一种差值的技术,就是这么回事。
我们刚才说啊差值很多方法对吧,那线性的差值是什么呢,给你任意的啊连续的这些点对吧,然后你可以,把它连起来连成线段,那自然而然就是一个差值了,你形成了一条光滑的曲线,没有问题对吧。
但是呢有时候人们会希望要求更好的连续性,比如说要求c一对吧,大家还记得这个概念吧对吧,就是说我要求在这个地方不要突然拐弯对吧,要求他们的速度到达这一点的时候也是要一致的,然后比如说到这里。
由于动画的需要,我需要他这么变化,可以没问题,就是说啊就是说希望有一种东西能够控制这种差值的效果,那么这个时候这种曲线或者样条就是非常非常重要的,这也就是说这。
个动画和嗯我们之前所说的几何这块是非常非常有关联的,是这么一个意思,好吧好,那么呃我们刚才说到了这个关键帧动画是最最最最最简单的做法,没错吧,中间就是差值,只不过那是人为的方式还是自动的方式。
那么更多的情况下,人们是怎么怎么做的呢,人们用的是一种所谓叫物理模拟或者叫物理仿真的一个方式,就simulation模拟或者仿真一回事,那么物理模拟是是怎么样一个运作方式,那么理简单给大家介绍一下。
那么最简单的物理对吧,是牛顿的运动定律,大家都知道怎么呢,就,是说我应用在一个物体,它有一个质量对吧,可以认为这个质点啊,它这个物体呢这个有一个质量,我应用在这个物体上一个力叫做f。
然后呢它就会获得一个加速度,然后他们的关系就是f等于ma,然后大家知道有呃有加速度我就能算速度,然后有速度我就可以算位置,也就是说我基本上只要知道了这个物体上面有什么样的利益,以及它的一些初始条件。
比如说他一开始的位置在哪儿,一开始速度如何,然后我就应该可以动态的能够更新他们的这个下一个时刻它的位置,对不对,我,可以算得出来,这怎么算呢,就是用这个物理公式,那所谓模拟或者仿真啊。
其实就是在这个嗯推导,或者说我实现各种各样不同的这种物理公式,然后用作这个模拟来运来计算出一个物体,它应该有一个什么样的一种形状上的变化,就这么一个意思好吧,或者位置上啊,那么f等于ma大家都知道对吧。
然后f等于ma呢,然后这里比如说我扔个小球,我从这个位置往某个方向扔个小球,大家会知道它会形成一个抛物线对吧,最简单的道理是,因为他始终受到一个呃重力的作用,然后它的受,重力的作用呢。
它自然而然就会有一个加速度,然后有有加速度的,然后就影响速度,有速度就影响位置,那么这是一个简单的情况,那么对于这个衣服来说,因为大家看到这个衣服,衣服呢它这个是用各种各样的网格来形成的。
那么我自然也知道什么呢,我自然也知道这个任何一个位置上,比如说我认为这个顶点上它有一定的质量,他肯定要受到重力,他肯定也是因为和其他的这些顶点相连,他肯定也会受到来自于其他的点的各种各样的作用力。
那没关系,道理是一样的,虽然它复杂,我,们把所有的力都给考虑在一块儿,我们自然而然就可以算的加速度,算出来之后,我自然而然可以更新速度和位置,这都没有关系,只要我们能够正确地把它的受力的模型给建立出来。
没错吧,那这就是呃就是我们的物理仿真它背后的这些呃数学啊,物理啊这些模拟的思想好吧,那咱们可以看一个实际的例子啊,这个例子就是一个呃衣服的一个模拟,或者说布料的一个模拟。
然后大家可以看到这个角色他是穿着某个衣服,他可以做各种各样的动作,然后呢这些呃大大家知道哈,比如说,嗯他在做各种动作的时候,然后这个衣服为什么会跟着他的这个手和脚会动呢,那自然是因为这中间会有摩擦力啊。
然后中间会有各种的压力啊,然后把各种各样的力都算出来之后呢,自然而然就可以得到正确的结果,对不对,那这里呢简单给大家补充另外一个这个说法啊,是这么回事,就是说如果你模拟的好的话啊。
就是说正常情况下你绝对不会出现这些反物理的现象,比如说什么呢,比如这个衣服,然后进到人身体里面去,然后像这个裤子,然后他跑到这个就一条跑到另外一条腿,上去这种正常是不会发生的啊。
这种情况下我们在这个就比如说打游戏里面,我们会经常会管这东西叫做穿模模型,穿到另外一个里面去啊,就是说你模拟的对的话,不会出现问题,这里呢肯定涉及到大量的所谓碰撞检测之类的这一类这一系列的问题。
但不管怎么样啊,我们回到这个呃模拟预防针这个话题上来,只要你能够正确建立它的物理模型,自然而然可以通过解一定的方程。
大概可以算出来没有问题啊,好那么这里是另外一个例子,这个例子呢就不再是啊跟物体表面相关的,这种布料而是一种流体啊,流体是一个在仿真领域研究的非常非常多的一个话题,特别是对于这种水。
然后这种水呢大家怎么看待它分成了两部开,第一呢我先模拟这些水它是怎么运动的,它是水滴各种各样不同的地方,它是怎么形成的啊,这是一第二当我模拟了它的位置,然后呃形状各种各样的东西之后,然后我拿去渲染。
告诉我他长什么样,这两步是割裂开的啊,这正常是这么一个运作方式,所以大家看到这里呢,我正常不会去关心它的渲染会怎么做,而是会关心他这里,比如说这,个水花四溅,这到底是怎么样做出来的,没错吧。
这么一个感觉啊,好那么啊这里是流体模拟,那么在这里呢我们既然已经提到了,说我们只要正确的建立物体之间的相互作用力对吧,我们把这个作用给解释明白,也写清楚,那自然而然就可以模拟正确的效果,没错就是这样。
那么我们这里呢就给大家说一个最最最最简单,而且也非常实用的一套系统,叫什么呢,叫质点弹簧系统好吧,然后这个记得哈这个max这质量spring呢,这里不是春天啊,然后也不是喷泉啊,这里是弹簧。
这点弹簧系统啊。
这么,回事,那么这个质点弹簧系统能干什么,比如说啊大家可以看到这么一个例子,这个例子就是大家的第八次作业啊,第八次作业绳子模拟器,大家可以把一个绳子模拟成很多小的弹簧,连接在一块的。
看到分成好几段小弹簧,然后连接在一块,然后我可以把它这个这个呃让它在重力的作用下来回摆,然后我还可以拖动它,当然这是属于高级操作啊,就是说嗯大家还可以看到他在尖端上面。
有时候有时候有时候会有一些鬼畜的一些效果,然后这个这怎么回事啊,咱们之后都会说啊,ok好,那,么这里是大家的这个这个作业的内容哈。
那么这里是另外一个事情,还是一样啊,咱们把呃所谓物理仿真和渲染两个事情分开看,就这里呢我关心的不是说头发怎么样渲染的真实,而是关心的头发在各种各样不同的作用力下啊,它是会有一个什么样的变化。
比如说这里大家可以看得很清楚,有有一个这个风力对吧,可以把这个头发吹起来,那么大家就想啊,这头发本身要受重力吧,那头发跟头发之间肯定有摩擦力吧,然后就是说这个这些各种各样的力他们综合在一块。
哎我们就可以,模拟出来非常非常准确的头发的效果,而且这个是应该是nvd啊,他们做的一个效果,它可以达到实时啊,非常好,然后呃当然中间有各种各样的模拟,然后这个月是呃对时间要求高,质量上肯定会损失的越多。
但目前这个作用已经是非常非常不错的,没问题啊,头发的模拟,那么我们说啊这个弹簧呃,这质点弹簧系统呢还能干什么,这点弹簧系统呢还可以做这个呃。
比如说一块布,我们刚才说是布料啊,本身它这个既然是这种网格描述的对吧,很自然而然我们就可以用各种各样不同的呃,这,种所谓智点弹簧系统来描述它,那这里大家可以看到一块布,然后我可以拖着一个点来拽对吧。
形成这么一个效果,然后呢我们之前给大家看过这么一个例子,对不对,然后这个例子是说什么呀,是说我呃如果对一块布,我只要建模的足够好,然后我的模拟和仿真是完全可以达到以假乱真的效果的,大家可以看到这对吧。
我左边这一列是啊。
照片右边这一列是渲染,是模拟仿真出来的,并且渲染出来的结果大家可以看到几乎是一致的对吧,然后呃除了一些像这些细节,像这里像这里就是,有区别有区别是肯定的,因为在真实的这个世界中啊。
很多东西它是不是这么容易能够这个表示出来的,对吧好,那这里给大家看到这,那所以说啊这个物理是非常非常重要的对吧。
在这个过程中,我们把作用力建立出来,那现在咱们回到我们说的质点弹簧系统上来,那我们既然说质点弹簧系统,那么先介绍一下质点弹簧系统是什么,是一系列相互连接的质点和弹簧,那么它的最基础的单元是什么。
就是一个弹簧左右连接着两个质点啊,一个弹簧左右大家可以看到a和b两个质点,那,么我们知道哈,首先我们假设一个理想化的弹簧,一个理想化的弹簧是什么呢,没有长度啊,呃先绅士没有长度,然后呢他被拉开了多长。
它就会产生相应的多大的力,是这么个意思啊,那么看比如说这个作用力从呃从a到b,然后是什么意思,就是a应用在b上的作用力啊,就是就是唉反了反了,就是说这个弹簧弹簧应用在a上。
使得a往b方向去这么一个作用力啊,就是从a到b这么个意思,然后从a到b的作用力是是多大对吧,是多大呢,那取决于a跟b之间有多远,所以那肯定是跟,这个b减a有关,那同时这个作用力是往哪呢,大家想象一下。
比如说我把它给拉长了对吧,原本是他俩挨一块的,没有长度啊,先这么假设,然后拉长了之后,那么b减a大家可以看到这是向量哈,b减a它们两个位置一减是一个向量。
从a指向b那这个向量这本身呢是和它的长度是有关系的,对不对,然后也就是说b减a它越长,那这个力越大,那这样来说我就可以可以精确地写出诶,这a点受到的往b方向去的力,没错啊,这样想。
那么这里呢还有一个系数叫做进度系数啊,这大家之前,学过高中物理,这个非常简单,然后这个定律叫做胡克定律,然后由于力的作用相对相对性啊,那么呃a受到了相对右的力,那b受到的肯定是向左的力,没问题。
它两个互为相反,那么这里大家可以看到我们所有的表示都是向量表示非常方便啊,b减a本身又表示方向是对的,是从a指向b然后又表示长度对吧,然后k s是一个系数,是这么回事好那么这里呢是一个简单的弹簧。
它有什么问题啊,很显然哪有a啊,很显然哪有弹簧是呃零长度的对吧对吧,所以说弹簧正常情况都应该有,一个正常长度,这个长度呢叫做restless,我们可以这么定义啊,它叫做l也就是说你一开始什么也不做。
它正常情况下就是l这么长度,然后呢你可以把它拉伸,你也可以把它挤扁啊,没什么问题,那么我们分析的时候,我们就考虑拉伸就行了,那几点的时候正常情况下就是直接也是可用的,没有问题,那么怎么做呢。
假如说啊我们还考虑应用在a上的力,那它肯定是向右的对吧,然后我把这个这个a跟b拉开啊,这这样的话应用在a上的可能是向右的,然后b跟a拉开之后,b跟a之间的距离,可能是b减a的距离对吧。
这个距离减去它的原始的长度,那就是被拉开了多长,那拉开了多长,一定会决定它受到多少例,没错吧,那么它受到多少力,那就是拉开了多长,这么一个距离得乘以它的受力的方向,受力的方向是什么,b减a这么一个方向。
从a指向b并且规划也就是说b减a规划,这只表示受力的方向,然后右边表示这个受力的大小,前面该进度系数还是进度系数,简单嘛对吧,这是这是最简单的一个弹簧,然后呢,那他有什么问题,他有什么问题。
它会永远的震动下去,为什么,呢因为能量守恒,这里呢动能跟势能它始终一直在经过一个转换的过程,对不对,你只要把b拉开松手,他一定一直会左右弹,永远不会停用,我们这个模型啊永远不会停对吧,那怎么办呢。
那我们就加入一个相所谓摩擦力,让它能挺对吧,在这之前我们先引入一个在在这个物理仿真或者模拟啊,这块经常用的记号,就平常呢大家会用比如说x来表示位置,那么大家知道x打一个撇对吧,x prime。
这应该是表示速度,是表示它一阶导数,但是在模拟仿真中,正常情况他就大家会用点来表示,就是,在他头上点一个点表示一阶导数,然后点两个点是二阶导数呢,只要位置二阶导数自然就是加速度啊,这是一个常用技法。
那咱们知道就好好,那么呃那么我们刚才说啊,这个弹簧永远会震动对吧,那么不希望它震动怎么办呢,我不希望它震动的话,那我就给它加一个所谓摩擦力,让它能够停,那就是所谓单ing force,就是这么意思。
那么我要给它加一个单品,这个单品是什么意思呢,这个单品就想了,让这个物体停,那大家想一想是不是这个意思,对于任何一个运动的质点啊,如果我想让它停,那,么我这个力的方向肯定得跟它的速度方向相反,没错吧。
这样想,那么那我们看对于任何一个物体,比如说这个b这个物体,它的速度必打一个点啊,记得打一个点之速度哈,这个它是速度,那么它速度往哪儿,我这个力我就让它相反,就跟他跟跟跟他反作用。
那这样的话最后他肯定要停下来,没错吧,那么它有多强加一个系数就可以了,没问题,那负k d就是这么解释,那么他有什么问题呢,诶他有什么问题呢,因为他这样呢会引起所有的运动都会停下来,这个怎么理解呢。
很简单,大家想一想,啊这么回事,假如说我有个弹簧a跟b,然后我a跟b同步的向右走好吧,同步的向右一直在一直在移动,那这样的话会出现一个什么问题会出现,其实a跟b之间啊,它并没有这个相对的运动。
也就是说对于这个弹簧来说,它一直没有拉伸,然后呢它整个它不会震动,然后最后呢还会被你停下来,也就是说你描述的这个摩擦力啊,只能描述外部的力,你描述不了弹簧之间的这种内部的这样一种力,没问题哈。
然后或者另外一个想法啊,就是这里说的,那咱们拿一个弹簧正对这个弹簧质点,弹簧系统a和b啊,竖着放,放进来,一松手,它往下往地下掉了,往地下掉了,大家都知道他作为一个整体来说。
它这个下落的速度应该定的对吧,那那如果说我对这个a和b它都应用赢了这么一种所谓摩擦力来说,它就会整个让这个啊弹簧往地上掉的越来越慢,当然空气阻力是这样的哈,但是这个空气阻力相对非常的少啊,没什么问题。
就是说他表示不了弹簧内部出现的损耗,是这么个意思,咱们把这点理解清楚就好了,那怎么办呢,那咱们就想办法把它给加进去,大家会看到这么一个,过程啊我们在逐渐完善这么一个质量弹簧系统啊,那么大家想象一下啊。
我们刚才既然提到a和b同步运动,那也就是说啊,其实来说,我这个内部的摩擦力应该是得跟他们相对之间的关系得有关系,对对对,相对之间的运动都有关系,没错吧,那也就是说我们要考虑的是什么呢,首先啊不管怎么样。
我呢我要考虑的这个所谓的摩擦力,他要做什么事儿,他最终是希望弹簧恢复到正常程度对吧,他希望能够做这个事儿,那也就是说只要a跟b被拉开了,那么a肯定会想办法往b方向去靠,那么这个力肯定是想办法让它往哪去。
就这个意思对吧,那所以说我们考虑这个比如说应用在这个b上面的这么一个例子,那大家知道他是应该是呃什么方向呢,它应该是向左的,对不对,如果把它拉开啊,然后就是说呃那它是向左的。
那你看b减a除以b减a的长度,这就是归一化的方向,b点那个长度是向右的,然后呢本人加了一个负号,那就是向左的,没问题,方向对了,方向对了,那么现在我就问他应该有多大,就这么一个意思,它应该有多大。
那我们现在我们可以想象一下,你一下啊,就是说呃肯定和a跟b之间的所谓相对速度有关系,没错吧,那就不不是说取决于一个的速度,我们考虑它们内部的损耗嘛,那么相对速度是什么,b减a是b b点到a点啊。
大家看这里啊,b的速度减a的速度,那肯定跟相对速度有关系,那么这么想,那么这里又是什么呢,b减a除以b减a h,这是这是什么呢,这其实是从a到b的方向诶,那么我我会发现啊。
这个归一化的b减a向量和这个相对速度向量两者之间点乘,而这里其实应该多打个点哈,其实点乘,那么这点成什么意思,大家,还记得吗,一个向量点乘一个单位向量,其实就是往这个方向上做投影,没错吧。
然后我就可以得到投影的长度是多少,这就应该是所谓相对速度,投影在ab方向,它的速度是多少,还是这么个意思,那么为什么要做这个投影啊,因为相对速度本身还解决不了问题。
因为我们刚才说相对速度肯定比绝对速度要有效,因为我们要考虑他俩的这个整体,他们俩一块移动等于没移动对吧,这是对的,但是还有一点,有一些速度并不能让你的弹簧引起它的长度改变什么样的速度,比如说我把a摁在。
这然后我把b让它做圆周运动,哎大家就会发现这里不对,为什么呢,因为b组在对a做圆周运动的时候,它的速度它是垂直于这个弹簧呃,这个方向a到b对吧,那这个时候他这个速度来说是绝对不应该。
引起这个弹簧本身内部的所谓摩擦力,让它损耗,让它停在它的自然长度上,对吧啊,就这个意思,它本身b让a做圆周运动不应该受影响,那怎么办,那就是说我们考虑这个点乘。
也就是说我把相对速度给分解到沿着ab方向诶,这个相对速度才会对整个的这个塌方镇子这么一套系统,造成一个所谓的衰减也是这么一个意思,那这样讲的话,那咱们就可以明白了,没问题啊,那咱们整理一下。
就是说啊我们考虑应用在b上的这个所谓所谓摩擦力啊,就让它能够恢复到原始长度,那如果b拉开了之后,那我知道这b减a方向出这个规划,那就是从a到b,从a到b加个负号,就是从b到a。
然后加上它的进度系数乘以进度系数,没问题啊,就是方向一定是从b到a的对吧,那是没问题的,那么下面它的它的大小是多少,那当然是相对运动越快,大小越大,没错吧,那就是说我们,求出来它们的相对速度。
b减a的相对速度,那么这样的话呃是不是解决问题呢,并不是我们其实要考虑的是投影到沿ab方向,它的相对速度是多少,然后这里整个红框算出来是一个数啊,是一个标量scale,好吧。
那这样想就明白了好那没问题啊,那这样的话整个我们对于这个弹簧在这个系统,那现在就建立了比较好了啊,这里一定记得这里打个点啊,这里是速度的意思啊,好那么当然了,这只是一种一种系列的这种摩擦力啊。
还有各种各样别的各种方面,我们只要能够把它给分析的明白,对吧,写成物理公式,那就没问题,剩下一步就是怎么做,怎么模拟出来对吧,内部相对简单啊,好那咱们回到现在哦,不现在不是零长度啊。
就是说这里长度跟这个我想一想哈,长度并没有关系,因为这里摩擦力呢,其实只跟它们相对之间的这个相对运动的速度有关系,这个就是说我们这里应用的摩擦力哈,就是说这这是这是另外一个力。
我们之前说弹簧和弹簧之间相对拽的那个力跟长度有关系,这摩擦力呢跟长度没关系啊,啊感谢这位同学提问啊,没问题啊,就是说这是两种不同的分析,那我要考虑最后他们的运动怎么办呢。
那么就把这两种力就是弹簧自己相对这种专业的这么利啊,跟这个呃摩擦力本身就内部损耗摩擦力,这两个力都给考虑进去,然后再模拟是这么个意思啊,这样想好,那么我们既然已经说了一一截弹簧对吧。
一截弹簧连着两个这个不同的质量,他们应该是111个什么样的这种物理模型,那么我们现在自然而然要问说我这些弹簧经过各种各样不同的组合,可以组成组合成各种各样不同形状对吧。
那我是不是说我可以把它安排成各种不同形,状比如说这里呢我想表示一张纸,我是不是可以用这个方块哎,这么连接对吧,把它一根一根连起来没问题啊,就是每两根它共用其中一个质量,这是没有问题的。
然后呢我也可以在三维空间中用各种各样的这些呃连接,然后把它连接起来,大家会想到这个很像什么这个所谓分子模型啊,对不对,就是这么个意思,就是说啊。
我们这些物理原理其实都是对这个真实物理中存在的现象的一种抽象,或者说简化啊,然后这是没有问题的,当然我们可以这么描述,那么我现在啊我们来分析一个,非常有趣的一个话题哈,就是我们现在不考虑弹簧内部了哈。
弹簧假设我做得非常好吧,那我现在用各种不同弹簧,我想模拟一块布,模拟一块布怎么办对吧,我想让它模拟的非常像一块布,那怎么怎么办呢,我可以诶,就是把它当成一张纸呗,这么一连哈,这么一连就可以了。
然后当然它无限大啊,各种各样其他地方都有连接,但是我发现啊它有个问题,什么问题呢啊其实很多问题啊,第一个问题什么,第一个问题切变它会受影响,什么叫切片啊,很简单啊,很简单啊,就是说我如果拉着这个步。
子这两个角哈,大家看到这这这两个角,我我这么一转,往这个这两个方向一转,大家会发现这个自然而然这个形状会被我们给拽成一个两边,往中间收对吧,这两边被拉长,拽成这么一个形状,那也就是说明我应用这么一种力。
它就会发生这么一种形变,但是我发现在真实的布里面可不会有这种情况对吧,也就是说啊我们对呃,对于这么一种简单的结构来说,如果让他去模拟一块布是不合理的,因为布呢他平常可以抵抗这种切片的力。
然后不会影响形状,但是这里的结构会影响形状,在,这里说明它不合理,这一第二是什么呢,第二是在就是说如果有一种力,能够让这个整个一个形状变得不是一个平面。
哎我们就管它叫做out of plane bending,就让它在这个不是一个平面内发生弯曲,我们知道一块布,他平常来说啊,他这个叫什么来着,我很难像一个纸一样的。
我把它对折成这个严格意义上把它对成一个所谓的所谓的嗯,怎么说呢,就还是一样哈,沿着这个对角线,我一折折成俩三角形,对一块儿啊,这个意思折成一张纸这么个感觉,那不很难这么折对吧,那也就是说不本身呢它会有。
一个对抗这种这种折法的这种力,但是很不幸的是,现在这个结构是肯定是可以把它折成类似一张纸,把它折成俩三角形的啊,就是沿着它的这个斜着对角线吧,然后咱们这么这么一折,它可就可不就变平了。
然后你会发现这些其他的弹簧完全没有受到各种各样的力,也就是说这种情况是显然可以发生的对吧,那就不对,怎么办呢,咱们想办法把它给改进一点,先改进什么,先改进啊,这个呃所谓的切片,那么切片什么意思呢。
咱们刚才说了,拉了一下对吧,然后它会它会变成窄长的形状,现,在我在这个形状里面加入这种斜的对角线哈,然后加到这个对角线之后,我发现我再拉他就不能变成这个形状,为什么,大家想象一下啊,我如果这么拉的话。
那我这些新加进去的这些蓝色的这些线,这些呃质点弹簧系统啊,它会被压缩,对不对,它会往里挤,没问题吧,整个形状会变瘦,他会被往里挤,然后弹簧你知道他会想办法往外抵抗它,那自然而然它可以抵抗这么一个力。
没有问题啊,挺好的对吧,那么这就是这么一个问题啊,就是说呃他算是解决了,但是但是什么呢,但是你会看到这个,结构不对称啊,对于一块布来说,我不管怎么样旋转的话,从各个方向拉它对吧。
他应该的这种行为都应该是一致的,对不对啊,是这么个意思,没错吧,就是行为是一致的,也就是说我这个呃加了这么一条线之后,它变得不对称了,这个非常不对啊,有点像各项异性的意思啊,就是说这个不合理。
那另外一点呢就是说呃我能不能通过加这么一根连线,然后让它能够抵抗这个,让它把它给单程不是一个平面的这种力对吧,然后发现还不能,那虽然在这个方向上好像是能了啊,就是说沿着这个我,们看看这两个角是可以的。
但是另外一个方向是不行的,你可以看另外一个方向,我们看到这个主对角线上,这边如果我这么一折还是一样,所有弹簧的形状都没有发生变化,所以说这种情况是完全可以发生的,所以说仍然不行,怎么办呢。
哎那咱们想办法改进改进怎么带,我们把它再加上一个这个斜的这个线啊,就是另外一个方向的对角线啊,然后这样的话呢,首先但一边他就已经可以抵抗这个呃所谓切变的力了啊,然后那加上另外一边肯定也会没问题。
但是这个形状仍然不能抵抗,这个所谓非平面的这种弯曲,那这个怎么理解呢,但是他发现这里其实我沿着两个对角线去去这么弯折的话,一定会引起其他弹簧发生形变,所以一定会让他结果这个回到这个状态呀。
那就大家说的这个意思,但是是哈就是说还有一种情况可以让它变得不在一个平面内,很简单竖着,大家可以看到这么一条线啊,比如说咱们沿着这条线竖着,这么这么这就是这个意思啊,怎么这么折过来不就行了吗,对吧。
就沿着这么一条线,然后把它给折过来,同样道理,它不会引起其他的任何一种变,化,所以说呢他没办法解决这个非平面的这种弯曲这么一个问题啊,怎么办呢,那咱们再进一步改进,怎么改进。
加一个所谓我管它叫做steep connection,我从这个深度学习借了一个词来,然后这个这个怎么说呢,就是说大家也可以看到我加了什么,加了红线,这个红线怎么加的呢,很简单啊。
就是说任何一个点它都跟它隔一个的点,连那么一根线啊,看见没,就这个点,因为它在左上,所以它不跟上面和左边脸哈,就是你看比如说这个点啊,跟上面跟他左边,如果右边还有的话,应该还跟右边,如果下面还有。
应该跟下面隔一个都是隔一个嗯,所以说我管它叫叫做这种steep connection,加了之后呢,大家就会发现诶,这回那是真的,你不管怎么样去玩这个呃,平面它都会引起一些弹簧的这个长度发生变化了。
比如说刚才咱们说这个数值的这个如果你这么搬的话,那势必会影响这一条,咱们说清楚这一条从这个点到这个点,势必会引起它的长度的变化了对吧,那也就是说他会这些弹簧会想办法抵抗诶。
这样一来我是不是就把结构给做的更好了,对不对,那也就是说啊我们就想办法通过我们这些不断的,这些设计改进哎咱们这分析的这些都有道理,然后咱们呢就可以把这些呃这些问题都给解决。
那么这里呢其实我我再多说一个事情,就是说关于这个红线啊,红线的这种连接,它它是其实是非常弱的,就是说它本身呢就是说正常地方布其实也可以弯过来吧,比如一个桌布对吧,在这个桌边上的肯定自然垂下来。
也就是说它并不是多强,强是强在哪强,是在布置这个这个本身啊,它自己的连接,也就是说这个蓝线其实非常强,红线只起辅助作用啊,有同学反映说用红线是不是就不用对角,线了啊,这里就可以解释啊,就这么个意思。
红线其实仅仅是加那么一点点让他抵抗,是啊非平面的弯折这么一个事情啊,那不管怎么样呢,呃这个这样做我们就可以得到一个质点弹簧系统来描述的一个裙子啊,这非常好,当然这里肯定还涉及到各种各样摩擦力。
和这个本身的这个呃模型到底应该怎么样作用,那咱不管啊,就是说正常情况下,就是说这么描述的话,基本上来说对于一块布料,比如说你拿一块布,然后放在空中,一松手来落在了地上,哎这块模拟是已经绝对是够用了的。
是这,么个意思,当然大家说这个是不是已经足够精确的,肯定不是对吧,真实的这个我们之前学过布布料的渲染,对不对,我们分析过布料是怎么形成的,三三个层级结构的,这个嗯怎么怎么说缠绕对吧,还记得吗。
这个所谓纤维缠绕形成鼓,就是就是fib缠绕形成play啊,然后鼓呢就缠绕形成线,所谓ly缠绕形成thread,然后然后thread呢再通过这个这个不同的针织方法对吧,编织吧或者针织。
然后可以形成各种各样不同的这个真实的不良,那他们实际上是这么连的,还是会旋转的这种螺旋的东西,你知道,是不是描述出来了呢,并没有对吧,那所以说我再次强调这个事情啊,就是说物理模拟来说。
这肯定是对真实物理世界的一种表示方法,但通常都是一个简化的表示方法,就看你的最后的要求会怎么样对吧,这么个意思,那么质点弹簧系统肯定是非常好的,那当然这里呢简单给大家提一下。
就是说有没有除了质点弹簧系统以外的其他的系统有啊,比如说这个东西就叫做有限元方法,叫finite element那等,有些人方法被广泛应用于什么,应用于这个车子碰撞,大家知道,就比如说有一些汽车厂商啊。
他们为了在发布一个新车之前,他们先去做一些模拟,把这个车子撞向一个墙,对撞向了一个墙,那么就是说大家会发现这个接触墙的地方受力对不对,那为什么车一直到车尾巴都会被撞坏掉对吧。
因为力之间它肯定会有一个传导的作用,这就好像是热之间也会有一个传导作用,比如说我要去考一个什么这个这个金属勺子,然后让你拿着,然后你肯定这个我就考那个勺子的尖端,然后你肯定一会儿就觉得烫对吧。
道理就在这,就是说热和这些力啊,这些东西都会有传导,这些传导的这,些过程啊,就所谓扩散过程叫diffusion,这个过程很适合拿有限元方法来做啊,有些原方法非常不好不好做哈,就是说写起来也很头疼。
但是就是说他肯定是另外一种对这个世界的建模方式,对他表示了说我力从一个地方扩散到另外一个地方,应该长什么样,这里呢我就不再用呃,所谓指点弹簧了对吧,也就是说不同的方法都是有的,这么个意思好吧。
那咱们可以继续进行下面的话题啊,就是说后面的话题呢是简单给大家说一说,关于这个动画目前都有哪些东西哈,就是我们刚才说质点弹簧,系统它可以描述一些部位啊,这些东西挺好的,没问题对吧,那么有一些东西啊。
它其实不太适合拿质点弹簧系统来说,怎么说呢,我们这里来说一个另外一个系统叫粒子系统,叫particle system,那么粒子系统是什么呀,非常好理解啊,就是一堆很小很小很小很小的东西。
比如说这里大家看到一些很小很小的球啊,这一动啊,然后是这么回事,然后呢呃建模的方法也很简单,它不是一堆很微小的东西嘛,大家放过烟花,对不对,大家看到那个烟花打上去之后。
一下分散成好多好多好多小的这些东西诶,就,是这么回事,我把一个一个都给建模出来,好建模出来之后呢,然后我怎么办呢,我来定义每一个粒子它会受到的力,他受到了力肯定有来自于内部的,来不不不是内部的。
就是说来自于粒子之间的,就粒子和粒子之间可能会碰撞吧,就像台球一样对吧,一个碰一个,然后呢向外部的力也会有像重力,对不对,然后粒子这可往往地上会掉,然后还有粒子本身可能会非常轻。
它可能会受到这个风力对吧,然后它会改变各种各样的这些位置,这都有可能我们把它描述出来对吧,然后呢那我把人描,述出来,剩下的就可不就是模拟了嘛对吧。
那么这个粒子系统呢很容易呃呃这个去营造这样一种各种各样的,所以这个什么魔法的效果呀,然后想各种各样的啊雾啊,什么这些东西,灰尘啊,这些东西就非常合理,你用这些东西来模拟我们在游戏中呢。
它得到了一个广泛的应用是怎么回事,那么大家可以想象这个例子越多,那我其实模拟的可以越精细对吧,然后但是肯定越慢,那用勺那肯定越快,但是效果肯定也就是说呃跑起来肯定就就就就越快,效果肯定差一些对吧。
就这么一个意思,然后呢嗯这里就是说用粒子系统肯定会引起各种各样不同的问题,比如说粒子系统甚至可以来模拟什么呢,模拟这个流体,那么流体我当然可以拿各种各样的这个呃神奇的一些数学去描述它们,没什么问题。
把它当成一个整体来看,我也可以认为一个流体它就有很多很多小水滴相互组成,刚才给大家看的那个流体模拟啊,就是一个在一个小块中间中间有个灯塔,那一个用的就是把把这个小水。
就把这个整个一个流体当成很多的小水滴,然后他们之间的相互作用我们考虑进去就,好了就是这么个意思好吧,然后呢嗯粒子系统还会涉及到各种各样的问题,咱们刚才说啊,比如说来自于内部的作用力。
粒子和粒子之间的作用怎么作用呢,粒子和粒子之间可不一定只有碰撞,有可能还有引力,想当日万有引力嘛对吧,粒子跟粒子之间肯定得有啊对吧,这个错不了,那么我要想想考虑引力,我肯定得找,比如说我当天有个例子。
它周围的最近的多少个例子,大家听起来是不是很熟悉,对不对,是不是很像光子,那么我要找这周围的一些例子怎么样做呢,那我自然而然需要一,些加速结构或者干什么来做,然后呢粒子的位置还会经常移动,我还得更新它。
所以说整个一个这个粒子系统的视线啊,还是有很多问题的,呃不是叫问题啊,就很多这些啊,就是说呃挑战性的是这么个意思好吧,那么实际上来说怎么做呢,其实这块有一个最最简单的算法,这个这个算法其实听上去很像。
怎么把大象关在冰箱里分三步那个意思,然后这里说的实在是非常简略,怎么做呢,首先如果有粒子,它会这个动态的会生成啊,有一些粒子它会突然出现生成这么一个意思,然后呢粒子,的作用力考虑进去内部的外部的。
然后呢根据作用力来这嗯更新任何一个粒子的位置和速度没问题,然后如果粒子呢它有一定的存活时间,有一些粒子会死亡,有些新的离子补进去嘛,刚才说了对吧,然后最后我算出来每一帧物这个粒子的位置之后。
我就把它渲染出来,那当然听起来是非常非常简单的一个过程哈,但是其实它确实来说就是这么简单,就是说它的困难的地方在于怎么样去办,粒子之间的作用力模拟的清楚,如果你说把粒子之间的作用力描述成。
就好像水水滴和水滴,之间的作用力一样,把它模拟出来的结果就会像是水,然后你要是模拟说像是这个灰尘,那就是灰尘,那就是这个作用力就会决定他们看上去最后的结果,就是像是灰尘的影分布没有问题的运动哈。
然后就是说嗯真正困难的应该是在于这一步,当然还有另外一步,就是说你得到了这些作用力之后,你如何去计算他们的这个更新,他们的位置啊,或者干什么,这是关于怎么去解它,所以在整个一个这个模拟的过程中。
模拟仿真的过程中就是关于定义这些相互作用力,这是一关于怎么解这,是另外一个事情,就是学术界呢更关注怎么样去解这个事情啊,就是说定义这块是属于model这么一块的过程,其实另外一方面相对难一些啊。
这么讲好,那么呃粒子系统之间它肯定有各种各样的作用力,咱们刚才说了哈,就是粒子和粒子之间可能有吸引力,可能有电磁力没问题啊,然后呃如果说他之前有这个所谓斥力对吧,这个当例子离得足够近才会有斥力。
然后可能有一些这个弹簧什么东西在里面,或者没有连接都行,然后呢肯定有摩擦力,然后有这种什么粘滞力对吧,空气阻力,这里,摩擦力,然后碰撞粒子和粒子自己肯定要碰撞,然后呢跟墙啊,跟那些容器啊。
这些东西还是一样,不能穿模对吧,还记得这些事情,就是说这个啊碰撞肯定是要做的对吧,然后早期呢我们之前打游戏有一个系统,人称叫布娃娃系统,就是你把人家打倒了之后啊,人家这个呃这尸体,然后他会倒在一个墙上。
然后他应该一个怎么样的一个一个方式啊,虽然不是例子哈,但是道理是一样的,碰撞检测肯定是都要做的对吧,否则那就真的穿过去了,就是这么意思啊,这么理解,那么呃比如说咱们举一,个例子就是关于这里的呃万有引力。
万有引力当然大家都清楚啊,再简单不过了,g m e m2 除以距离平方对吧,然后既是一个常数,那么呃再大再小的物体都会满足这么一个规律,然后呢自然而然对于这些呃,就是这些灰尘啊。
这些例子啊,这些时间肯定会有这么一个作用力,我们把它考虑进去就可以了对吧,那么对于星系来说。
同样也是这么一个道理,大家可以看到这里是一个这是nasa提供的一个呃。
你这叫什么来着,这个这个渲染图啊,就是说对于一个星系的一个模拟。
然后大家可以,看到这些各种各样的看起来像是一些烟什么东西啊,其实不是。
其实是成千上万个不同的例子啊,至于最后每一个粒子它应该如何被画出来对吧。
我们肯定不能把它当成一个点,当成个点就看不见,那肯定会这以一种形式把它给渲染出来。
那这还是我之前说的,就是说诶大家可以看到这个不同的星云绕着其他星云去旋转啊。
这个意思还是不错的对吧,就是说呃我刚才提到这个事情,就是先模拟后渲染。
这两个过程一定是分开的,好吧好刚才咱们这个说流体模拟,咱们是不是可以把它,描描述成一个整体对吧,之间的相互作用力也可以把它当成粒子,然后它这个粒子呢大家可以看到就是一对小球,这些小球呢。
然后他们之间模拟这些碰撞啊,这些过程都给模拟出来,剩下的就是渲染对吧,你至于把它渲染的像个玻璃,还是加上这些白沫,这是另外一回事,就是说我们现呃我们模拟呢就是模拟的是这么一个过程。
那大家看到这个浪打到这个呃兔子的时候,还看看看这里对吧,它会形成各种各样飞溅的所谓水花对吧,就是这么个情况,然后诶没没有问题哈,就是说我们只,要正确的描述这个作用力就可以了,好的。
那么呃这里呢我们就在把这个所谓粒子系统啊往前延伸一步,什么意思呢,就是说啊粒子系统可不一定只是用来描述这些,最简单的是一些点哈粒子系统这个例子要看你怎么样去理解,对不对,在一个很大规模的范围内。
有很多小的重复的东西,这些东西就可以理解成粒子,就是说一个群体中的个体,比如说这里呢大家看到这个模拟其实就在模拟一个什么呢,模拟很多的鸟,一个鸟群哈,然后这个呃用一些简单的规则说个体的鸟应该如何听。
从于集体是这么个意思啊,然后这些鸟显然要复杂一些对吧,但是仍然而然仍然我们可以定义出来他们之间的相互关系什么呢,就是说啊这个呃首先这个肯定任何一只鸟他都不愿意落单,对不对。
然后所以说呢任何一只鸟一定会找到它周围的一些的鸟,并且试图融入到中间去对吧,就是这么意思,所谓attraction很好理解,很合动物的风格对吧,那么repulsion也是另外一个风格。
就是说任何一个鸟呢,他都不希望和别人太近,所以这些鸟和鸟之间呢,它肯定会有一个相互之间所谓的类似斥力的东西,但这个东西呢是存在于这个感知上的对吧,就是鸟和鸟之间他都不愿意离得太近好,这也没问题。
那么朝向也是一个很重要的事情,如果说啊大家都往某一个方向去飞的话,那么我肯定会有一有一只鸟,他因为不愿意这个离群嘛,他肯定会沿着他能看到大家飞的主要方向,也就是说仍然要考虑周围的一些鸟对吧。
然后呢考虑大家飞的平均方向是不是非常有道理,那这样我就定义了所谓个体的一些运动的属性,那有了这些属性之后呢,然后我自然而然我就可以通过粒子系统的方法,把它解出来,对不对,那咱们这节课仍然是这样哈。
这节课给大家说一些概念,不说怎么解,咱们下节课说啊,这个意思好,那么就是说啊呃那肯定在实际过程中还会有一些各种各样复杂的情况,对不对,那如果我们都能考虑进去,那自然而然就可以描述这个非常非常复杂的情况。
对吧,这鱼啊这个密封啊都是这么一个道理。
大家可以看到这里是在模拟一个所谓分子分子的结构,就是说哈同样道理,粒子系统刚才说了,本质上就是在定义个体与群体之间的关系,那么这里呢就是定义各种分,子要如何运动,然后它们如何形成这么一种群体。
只要有一定的规则,他们就可以形成,没有问题啊,所以说大家要把粒子系统给理解的更透彻一些。
还有什么呢,这个例子我是最喜欢的一个。
嘿嘿嘿呃模拟仿真的例子呃,这里是这个大家可以看到这每一个人呢,其实它都有自己的一个呃运动的方式,然后呢是下面有一个这个无情的这种横杠啊,不知道是在干什么,把这些人都给扫倒啊,然后我非常喜欢嗯。
这个大家可以看到这些呢当然是粒子系统的范畴啊,只不过每一个个体的行为更,加复杂了,它可以跑对吧,每一个粒子它和这个呃各种各样的地面啊,和这个横杠啊,它们之间的相互作用它都是这个那非常复杂的。
但是仍然有个体群体这么一个这种定义方式啊,没有什么问题,好嘿嘿嘿嘿好,最后那所有人肯定都倒了,对吧好,那没问题好,那么咱们现在讲完了这块粒子系统啊,我们现在可以进入下一个话题,我们来说什么呢。
我们来说运动学,那么运动学呢其实这个相对简单啊,就是说我们通常在图形学里会把运动学区分成正向的和反向的,来来应用所谓的正义运,动学和逆运动学,那么更难的是逆运动学,那么我们现在先从简单的来说啊。
运动学运动学说什么呀,是说啊我就是说我如何做出一种动画来啊,还是刚才咱们最早的一个思路,怎么做动画,怎么做动画呢,我要描述一个骨骼系统,这个骨骼系统呢能够表示跟人类似的一种呃。
这个骨骼连接的所谓拓扑结构就是什么和什么相连哈,然后就是说我可以定义各种各样所谓不同的关节,就是这个意思,大家可以看到右边是类似一个机器人,对不对,然后呢它有各种各样不同的关节,什么呢,有三。
种不同的关节,第一这种关节啊是钉子,就是钉上的关节,这个关节是什么意思,我只要钉上之后,它就往一个方向旋转,是什么意思啊,就是大家看这么一个这个例子,它可以在这个所谓定住的这个平面内旋转。
那么另外一个关节更复杂一点,这个关节叫做b这个bd好理解啊,就是说大家至今应该这个建各种各样模型也都见过,有一个东西它能够包住一个球,是这么个意思,而这个球呢它可以任意的在在这里面旋转。
也就是说相当于你这个旋转可以不发生在这个平面内啊,它比这个king,多的自由度是这么个意思,另外一个叫prismatic joint,这个非常好理解,它就可以拉长,就是说大家看看这里。
比如说一个一个胳膊大腿连着小腿,然后它中间可以拉长一点,这么个意思,就是说它可以有一些移动在里面,也就是说它可以定义一些简单的关节模型,可以形成这个整个一个复杂模型是如何相连的,这意思啊。
然后本身呢它又可以把整个一个结构形成一个所谓加速结构,一个树形的结构,咱们这里不多说啊,是这么个意思,就是说啊一个简单的情况就是这样的,然后大家可以看到一个,简单的关节,我们刚才说这是定上的关节啊。
只能在平面内发生旋转,那么这样的话呢我就会看到哦,我这里有一个点啊,然后呃这里呢呃有第一个类似手臂这个这个相当于大臂这一块啊,然后这里相当于小臂这一块,然后那当然是可以。
这两个不同是类似于尖这类类类似于轴啊,这个意思他可以这么旋转,那么旋转之后我就问这么一个事情啊,来比如说我第一段诶,我旋转,比如说c大一度,我假设向上是不旋转啊,旋转c大一度。
那第二段旋转c大2度就是他他的这个时候的自然方,向朝这儿的继续旋转,c大2度,我问这些尖端在哪儿啊,这个简单吗,这就所谓运动学对吧,我告诉你是每一个关节都怎么运动,然后你告诉我最后才停在哪儿。
就是这么个意思对吧,怎么算再简单不过了对吧,我先算出这个点的位置对吧,用这个cos和sin c塔一来算,然后呢,我知道这个c大二是在c大一的基础上旋转的,所以到这个点之后,我要再算p点的位置。
我就用cos和sin的c带1+3+2来算啊,这个太简单了,没什么问题啊,也就是说关于这个正向的运动鞋,只要我能够定义好各,种连接方式定义他们之间的各种位置,我自然而然可以找到各种各样不同的点。
它的位置没有问题对吧,然后呢我甚至还可以画出一些曲线,随着不同的时间,就是说我这个c大应该怎么样去变化这个意思啊,然后呃我我只要知道任何一个时间c带一。
c带二是多少,我就知道他这个尖端它会停在哪位置,没有问题,那么这个呢呃正向的运动鞋其实早就得到很广泛的应用,对于人的走路来说对吧,像这些骨骼什么东西呢,人是非常容易把它给做成这么一个形状的。
我只要定义各种各。
样不同的关节,我让它旋转就是了对吧,这个意思,然后呢运动学有一些问题啊,就是什么问题,就是它的定义什么东西都非常的物理,大家有没有发现,比如说我定义什么东西旋转多少角度,什么东西旋转多少角度对吧。
但是呢就是说嗯这个艺术家们可不喜欢这种东西,艺术家们喜欢,比如说拽着一个什么东西把它给拽到一个什么地方去,对不对,是这个意思,这样的话才能够这个更好的帮助大家去创作一些动画,没有问题吧。
就大家可不喜欢调什么角度,什么东西对吧,直观直接拿着这,个到到处转,这样非常好,那么这是它的问题,那么运动鞋其实有好处,什么好处呢,就是说它实现很容易,咱们刚才说了,告诉你任何一个位置。
我当然可以算出任何一个这个不讲任何一个地方,他会停在哪儿,对吧,没问题哈,那么我所以说呢,为了让这个艺术家们能够更好地使用这套运动学系统去调这个呃,所谓这些骨骼啊,这些不同位置,这时候就引入了一个概念。
叫做逆运动学,那这个概念就非常重要,那逆运动学是在干什么,大家可以看到这是几个例子哈,那你运动学是在做这个事情,假如说你可以手里捏着它这个尖端尖端,看这有个球,对不对,你捏着这个尖端,你可以到处移动。
然后呢它会自动的去调整它的这些关节,它们的位置,使得它这个阶段就是在你要的这个位置上啊,这这就是逆的吧,我要的是最后这所谓尖端的位置,我要的是不是中间我怎么调,中间怎么调,你自己决定诶。
这个就是逆运动学啊,这么个意思,那么逆运动学就是说我固定这个p点,你告诉我c带一四带二哈,这么想就很简单了,那么其实结起来就非常难了哈,告诉你p点的位置,然后你怎么解,c单一个最大二。
你就会发现这里这个式子就变得非常非常复杂了,这还是最简单的一个关节,连一个关节的再多连几个怎么办,对不对,也就是说啊就是说对于逆运动鞋来说,这块就非常不好做,那那而且呢它还有一些独特的问题。
逆运动学有时候啊他的解并不唯一,什么什么什么意思呢,比如说尖端,我希望这个这个整个一个机器人的手尖端停在这,然后呢我可以有两个不同的这个排放方式,大家会发现这两个方式啊都会让尖端停在这儿。
那我取哪一个吧对吧,就会有这么一个问,题啊,然后同样道理啊,间断我放在这儿,而同样这这两种方式都可以的,大家会发现这三个连在一块,可能会出现更多的这种出现这种重合的这种情况,这可怎么办,对不对。
会出现这样的情况,然后呢还有一些情况其实挺惨的,比如像这里啊,大家看这是什么意思啊,这一个呃一段哈,连了这段骨骼啊,然后这段骨骼呢可以这么旋转,那么底下的这个骨骼呢可以这么旋转,那么可以看什么呢。
可以看到这一个点,它可能在哪儿,它可能在这条虚线上都可能出现,没错吧,那么在这个点虚线上的,任何一个点我又可以通过旋转这一段的方式,使得这些点呃,我的尖端它停在这么一个圆上,那么我最后得到的结果是什么。
我得到的结果就是说我所有可能的这些这些尖端啊,所有可能的位置就只会在这个外层的这个圈和这个圈之间,那如果你告诉我后,我要把这个尖端放在这儿,那对不起,不可能他根本到不了这儿对吧。
如果我要把这个尖端放在这个内部,那也不可能他根本也到不了这儿,他有时候还没解,那多解和无解情况都会有,那出现这种情况,那就是自然而然它是这个逆,运动学的一些问题对吧,那么怎么办呢。
正常情况下人们都会采用一些所谓优化方法啊,然后去直接去通过优化,然后来找到他们对应的这些位置,就是说我不是要最后的结果,不是已经有了吗对吧,然后我现在如果我调整,我比如说还是刚才那两个啊。
c带一根c的二,我去调呢,可以让端点形成在某个地方,现在我要让他的目标到达某个地方,那我应该如何去反过来去优化我的c大一跟c大二,这是一个点呃,典型的优化问题啊,优化问题这个优化问题,正常情况下。
如果大家学习机器,学习的话应该会非常熟悉,用什么方法来解,用这个呃梯度下降法来记啊,就是说我知道我离的这个目标有多远,然后我应该如果我调整c大一跟c带二,我可以让我的新的这些点往哪个方向去。
是这么个意思啊,然后我就根据这个这些信息来调整啊,就是如果我调整下来一条c带二,它会影响最后的结果位置在哪儿,这就是一个梯度,就是最后的位置啊,根据c单一和c加二这两个东西在他们的梯度啊。
好这样讲就没问题了,那所以说正常情况下,用一些所谓牛顿法啊,或者别的一些,啊这些优化方法来做,那咱们这个课上就不再多说了,就是说呃这是人们正常解的方法。
而不是通过数学的方法真正去写那个什么呃这个archical sign这些东西啊。
是这个意思好,那么就是呃这个所谓所谓逆运动学呢。
他这个得到了很大的这个广泛的应用啊,大家可以看到就是这是一个典型的利用运动鞋,我可以拖各种各样不同的位置,然后可以让这个小人儿形成各种各样不同的形状啊,然后就是说呃这个当然是一个不错的做法对吧。
然后就是说啊当然这篇这是这是一篇论文了,它本身,在做什么。
这是另外的事情了,就本身来说,这就是我们要应用的学的效果啊,好那么时间所限啊,我们还是多说一点这个这个其他这块内容,咱们把内容解决掉啊,今天可能还得要稍微晚点啊,好那么下一个环节我们来说reading。
reading这个事情实在是没有办法翻译哈,就是说这个嗯就在这边整个一个这个动画的行业,就基本上来说一直在说rigging这个事情,那我们来看看reading是什么,reading是什么。
reading其实就是说对于一个形状它的控制,说白了是什么,reading其实就是这个木偶这么一个操作哈,什么意思呢,就,好像说你用这个各种各样不同的线对吧,你去提这个木偶,它的各种部件。
它的不同的位置啊,然后它自然而然就会形成各种各样不同的一个呃,这个这个这个某一种造型对吧,通过这种方法来控制它,在一定程度上来说,这就是这个逆运动学的一个定一个应用啊,对不对。
所以这个过程就叫rigging,那么对于这个动画或者电影界啊,大家就会呃应用这个reading,然后呢给各种各样的这个角色做出各种各样不同的动作,是这么个意思啊,就是给东西添加动作。
或者是呃做各种各样的动图能造型,这,就叫reading好,那么这个reading本身呢它这个不容易做啊,然后就是说呃如果你是艺术家的话,你要你你可能会这个用过什么这个建模软件对吧,像3d s max呀。
像玛雅啊这一系列建模软件,你得先怎么办呢,给这个物体加上骨骼,然后所谓你要知道你要操作哪些点,会影响其他的哪些点对吧,就是各种各样不同的这些这些效果就是所谓软选取蒙平提。
这些操作都是属于说在这个呃工业界用的一些一些术语哈,然后这些呢我们就暂时不是这么理解,而且也很简单啊,就是说我们给一个呃一个,物体或者说一个角色各种不同的地方给它不同的所谓控制点,让他能够拉着啊。
这个概念就是和什么非常像呢,和那个我们之前说贝塞尔曲线非常像对吧,贝尔曲线我调到控制点,我就可以调这个曲线,那对于3d的情况,比如说人脸上我给分布各种不同点,然后艺术家去拉各种各样不同的点对吧。
就可以调出各种各样不同的表情,道理就在这就是reading啊,那咱们给大家看个例子哈,这个例子是一个非常非常明确的一个例子,就是说他的也可以通过各种各样不同的这个方式来控制这。
些呃呃这个这个人物大家可以看到是熟对吧,非常自然的运动啊,然后这里稍微有点不自然哈,翻转180度,好吧啊。
大家可以看到对吧,就是说它的控制点可能不在这个物体上,然后刚才看到脚踝背后有一个这个控制点对吧。
然后这里呢有各种各样的这种这种这那大家可以看到面部表情,唉,也是通过各种各样控制点我来控制它,那那大家可能要问,那这些点我应该怎么样定义,那这些不是大家要关心的事情啊。
这些只作为一个合格或者优秀的艺术家应该掌握的技能,就是这个意思应该定义在哪,使得控制会比较好,这个意思,那眼珠头啊都可以运动,没有问题好。
那么这里就看到这儿啊,然后另外一种方式我可以怎么做呢,就是说就是说我如果说考虑人物有两个不同的动作哈,有两个不同的动作,然后呢我这两个不同的动作之间,我可以可以通过插值的方式来做啊。
然后就是咱们之前不是说关键帧动画嘛对吧,那么关键帧来说,大家可想而知啊,这样想就刚才我们已经有很多控制点了,那么现在如果我有一个艺术家,我建立了一个同一个角色,他的两个不同的呃所谓造型。
然后呢我中间有差值怎么做呢,那我控制点和控制点之间的位置做差值就好了,是不是这个意思对吧,那也就是说说白了就是你之前有一个形状,后来有一个形状,你可以把它给混合到一块,这就叫black shape。
其实本质上不是在做blend shape,而是在black所谓控制点以及他周围能够影响的一些区域,是这个意思好吧,那么就是说这个中间怎么样一个过程。
那自然是用各种各样曲线来定义好吧,就这么个意思,那当然这里呢也有一个例子。
而这个例子和之前这个例子是几乎是呃相重合的哈,就是说我可以定义若干不同的位置,大家这里要关注的就是它的中间的状态啊,中间的状态就是可以生成的,比如说这个舌头它这个足足短了,他是如何过度,眼珠是怎么样。
这个流畅的转动是这么个意思对吧。
我定义两个关键帧自然而然就可以做一个所谓blind啊,这么一个意思好,那咱们可以再继续呃,下面的这个话题啊,快结束了啊啊是这么回事,就是说我们既然提到了,说好。
我可以通过给加这些控制点做reading这种方式来生成动画,对不对,那我我说我为什么不可以真正的给真人各个不同的地方,加上一些所谓的控制点,让这些控制点的位置直接反映到虚拟的造型上面去呢。
哎这个过程就有人想到,那这个过程就叫做动作捕捉呃,这个叫motion capture啊,是这么一个意思,怎么说呢,就是说你希望真人的动作真实的反映到虚拟的人物上面去。
要建立一个所谓虚拟的人物和真实的人物之间的关系对吧。
那大家可想而知怎么做,就要用一系列的控制点,而控制点呢大家质疑对于真人的控制点来说,其实有时候就显得非常奇怪,比如说看大家看这个角色对吧,哎这个这个角色呢上面有各种各样不同的这些求。
这些球呢就可以当做各种各样不同的控制点,哎只要说我这个人在做做动作的时候,诶,我把它拍下,我可以知道各个都不同的位置,我就可以把这些球的不同位置反映到对应的这个虚拟的人物上面去,没有问题吧。
那所以说我们就可以找各种各样的动作演员,然后演各种各样的这些实际的动作。
然后就不需要艺术家们来调,这就非常好对吧,那这是这是基本办法啊,就是说动作捕捉有没有什么好处啊,对好处,那当然了,能够更贴近真实对吧,真实感非常强,然后呢就是说我可以迅速的做出来,我找一个这个演员。
然后贴上这些呃所谓的控制点之后,我可以让他演一上午就可以得到大量的数据,没问题,如果我要让艺术家们去调,我们可能花好长时间才能调一个动作,对不对意思,那么它的问题在哪儿呢。
首先大家看那刚才那个衣服肯定不容易穿对吧,穿上之后是不是很痛苦,然后放上各种各样的点,是不是会不自然对吧,然后呢这这是一个就设置这些场场景啊,就本身呃这个呃要开始做动作捕捉,有很多事情要准备,这是一个。
然后呢嗯就是另外一点,就是说你你找到的这些呃,你你你其实啊捕捉出来的这些动作到底合理不合理,你比如说找一个真人,你让他去演一个动画人物,那动画人物大家都知道这个表情都非常夸张的,对不对,像真人平常来说。
我们嘴动的不多,但动画人物经常会嘴一下脸都大,对不对,是这个意思,那么这种情况就是说有时候啊他和对预习预期的目标是不一样的,那怎么办呢,这时候肯定还需要一会咱们去跳,就是有时候会这样。
当然更重要的问题在于,有时候你根本捕捉不到一些好的数据,就是说你的捕捉条件有限制,然后或者说呃还是刚才那个人啊,他在正面的情况下诶,他有这些不同的这些呃,呃能够被我们看到的这些所谓的这些控制点对吧。
那如果它背面也有,那刚才那个角度就看不到怎么办呢,背后加一个摄像机,那那这是不是要成本对吧,那我背后一个正面一个够不够正常不够正常,有好多得好几十,然后呢我在这个呃不同的方向都放了摄像机。
是不是就够了呢,也不一定,因为什么呢,有可能人物各种动作的时候会遮挡一个,他胳膊会挡住他身上哪一块,这可怎么办,对不对,也就是说有各种各样的问题存在,那就是说你拿到的这个捕捉信息到底可用不可用。
以及说这个准确度怎么样对吧,这是一个,那么其实呢不止有这么一种定义,所谓控制点的方法有各种各样别的东西,比如说这里呢它其实就是一些点人,人们呢穿上绿的衣服,那么直接白球就非常显眼。
那我自然而然直接用摄像机拍出来的照片,我用计算机视觉的方法去分析到底哪些是我们控制点就可以了对吧,那有一些呢稍微厉害一些,比如说像这种这个这些东西啊,我这个呃比如它可以发出某种磁场或电波啊之类这些东西。
然后我自然而然知道他在哪里不受遮挡影响,可以没问题,还有一些各种各样其他的方法,什么机械的东西,就是说我真正在这个在人人上面贴上一些这个所谓的机械的这些东西,知道这机械怎么样运动,就是机械会跟着人运动。
立刻就会反馈出来,就是这个意思就不需要经过一些视觉过程啊,这个意思好,那么就是说啊关于这些呃不同的方法来说,应用最广泛的是什么呢,应用的还是光学的方法,也就是说真正要贴一些所谓的mark贴在人身上啊。
要么是贴片啊,要么是这种小球都是有的,然后呢他会用特别特别复杂的一些呃,这些摄像机肯定不止一个,到处都会放对吧,然后然后我希望能够非常准确地把它给诶测出来,这些不同的这些点在哪儿,大家看。
比如说这样一个情况,他需要用呃超过八个相机,每一个相机得240Hz去捕捉这个动作,大家可以想象是多么一个高频率的捕捉对吧,然后真的还是出现了遮挡之后。
那确实就很难了对吧,就是这么个意思,然后呢实际的情况大家就是这样的,比如说大家可以看到这个真正的动作演员,然后它身上会穿各种各样的东西,大家看到这些小球。
它其实也是各种各样的这些所谓呃也是用来感知的一些东西对吧,然后包括这里呢,这里其实是相当于用各种各样不同的摄像机去拍一个这个角色,大家可以看到为了360度无死角。
这个嗯大家可以看到得用多少多少不同的相机。
对不对,是什么意思,好吧嗯,ok但是这个事情那当你测出来了之后,你其实测出来东西很有趣的,自然什么呢,这些一堆杂乱的曲线是什么意思,就是一个所谓的控制点或者marker啊。
这些marker它在不同的时间,它会出现在三维空间中的哪儿啊,你把它显示出来,显示出来之后,你会发现人真是非常神奇,这些曲线测出来的这些呃这个感觉哈,所以说这就是你得到一系列的数据嘛。
那也可以可以可以想象嘛,你肯定是对某一个呃任何一个呃控制点,然后进行不同时间上的追踪,告诉他在三维空间中的坐标在哪里对吧,每一个都这么追踪,就是精神很多这种不同的曲线就是这么个意思对。
然后呢人们现在在这个研究过程中啊,嗯会发现这么一个事情,就是说人们会发现通过这种动作捕捉方式,然后通过各种各样真实的这个动画生成的方式啊,人们会得到更非常非常非常真实的一些这个呃动画。
比如大家看到这里其实还不是多么真实啊,这基本上来说就是说呃一些呃已经很真实了,但是还没到非常非常以假乱真的这么一种地步哈,然后但是现在已经有人开始在思考这么一个问题啊,呃很有深度的问题。
但是很难现在来说能够下定论什么呢,就叫做恐怖谷效应,叫uncanny valley,说白了意思就是人类怕这个被人工智能统治世界哈,就是这个意思,道理是一样的。
人类也会怕说这个如果我生成的这些东西过于真实了怎么办,如果有人用它来做一些这个这个坏事情会怎么办呢,就会有这么一个事情啊,这很正常,就是说呃总会有人来关心这么一个问题啊。
然后呃不过呢我们回到技术问题上来,这是我更愿意探讨的话题啊,就是技术问题上来就是这么回事,就是这里呢呃我们在第一节课就给大家说了这个事情,就是阿凡达这个电影呢它是里程碑式的效应,到底是为什么。
就是因为他用了面部的动作捕捉,然后他的面部动作捕捉是这样的,大家可以看到人脸上有各种各样不同的颜色记号对吧,然后就是说这些记号分布的非常这个呃密集,然后如果人们面部有各种各样不同动作。
立刻他就可以反映在这个人物的角色上。
虚拟的人物角色上,对不对,然后就是这么个意思啊,大家可以看到这里更多是指导演在说话。
我们稍微这个过一点哈,这里大家可以看到是哦,我只要这么一点就没有动画了,好吧,我这么拖过来吧。
大家可以看到人物在实时的做一些动作,立刻可以反映在电脑上啊,这就是想给大家展示的这块内容,那这里又是一个情况,眼珠也是一样,都可以运动,包括这些大幅度的运动,自然而然这些更简单。
因为面部表情它通常都是非常微小的,对不对,看这里对吧,人物的面部表情立刻会直接反应到这呃虚拟的角色上。
对吧,哈哈哈哈行,那没问题啊,这也是这么一个意思,然后呢啊讲到这里,差不多咱们就已经可以给整个一个啊动画或者电影,它的生成过程定义下来了,怎么做呢,大家可以看到这是非常非常全面的一幅图哈,大家可以看到。
比如说有一天哎谁起床了,想到一个办法呃,想到一个,比如说我要做一个电影,比如说我想做一个冰雪奇缘啊,然后呢呃召集大家开会,告诉大家啊,我要写这么一个故事,非常不错,然后呢大家觉得一拍即合,非常好。
那咱们画一些这些简单的最简单的一些场景,直接手绘啊,画出了一些最简单的一些草稿,然后也就是所谓的原话啊,然后来表示说哦,我大概有这么一些场景几十个,然后每个场景大概都要说一些什么内容,没问题啊。
然后这个播放给大家看,当然这个播放呢就是放幻灯片这种方式啊,播放给大家看,对对对,但是觉得好就是设计师呢在中间在设计各种各样不同的场景,应该长什么样啊,别的什么应该怎么样,就说到这里来说。
基本上来说就已经在脑海中,已经有一个说我对整个一个动画的一个基本把握了,包括任何一个场景应该长什么样,包括我需要哪些场景,然后故事怎么样说,那当然了,图形学之外的内容到这里进入到产品线以后。
立刻就要开始做各种各样的实际操作,什么呢,就是说啊人们会呃做一些这些工作,比如说嗯咱们可以看这里当然是实际的这些场景,比如说他们不是用这个三维动画来做的哈,咱们假设是说真正的我要做一些这个动画。
比如木偶戏这些东西啊,然后我要把物体放在不同的位置上去,得有人研究对吧,光线应该这个呃应该放在哪儿,这是后面的事情啊,就是说整个一个场景应该如何布置,然后我关于我要的这个呃主人公他长什么样。
都要把建模出来,这个建模是真的见过哈,比如说这打印成一个纸板啊,然后我在上面这个涂上各种各样不同的这些呃这些颜色什么,这可不就是给它一个不同的呃叫什么呢,纹理嘛对吧。
然后呢下一步就是rigging和这个model,基本上是这个非常非常吻合的一个事情,就相当于是这个这块之后,然后让它能够动起来,然后这个各种各样的这个不同部件我可以操作它,那反应在三维动画上。
就是我刚才说的,通过各种控制点,我可以让它也有各种各样不同的造型,那么下面呢我就可以做成一个把它做成一个动画,比如在一定的时间内应该是一种什么样的方式,比如一个奔跑的兔子啊,就这么一个情况。
然后呢这里就会涉及到说好,我要差不多可以准备渲染了,我场景搭好了,然后物体在这儿了,然后这个他应该怎么样运动,我都设计好了,然后现在我给他各种各样不同的光照,我希望他能够这个看上去像我要的最后的效果。
这叫lighting,然后呢比如说这里大家看到了一个很形生动形象的东西叫visual effects啊,就是说在在这个工业界啊,fx正常就是effects的这个缩写啊,就是效果的缩写。
所以其实我一向不赞成把它翻译成这些特效,special effects才是才是这个特效啊,各种各样不同的效果,比如说这里着火啊,各种各样的效果,也就算是这里面中间的一部分啊。
而光线把动作把这个场景所以都布置好之后怎么办渲染,然后也就是说什么呢,也就是说到前面这一步,所有模型什么都得到了,然后所以模拟仿真啊,什么东西都在之前就在这个reading啊。
这块animation这一块啊,然后渲染渲染完了之后得到一个三维的图对吧,这就是等于是我渲染出来已经结束了,结束了之后,然后我就可以把各种各样拍出来的东西呢。
大家看这个还是这个兔子和各种各样的场景结合在一块,比如说一些背景啊,什么东西怎么弄,就好像说我拍一个真人,我拍绿布对吧,把人人像给拿出来给它放在哪儿,这属于后期合成结合成合成了之后呢,在二维的情况下。
也会有一些各种各样的这些这些各种各样不同的效果,比如说我要给它变成什么老照片的这种效果啊,以前的坏掉的胶片的这种效果呀,然后或者是像下雨呀,或者别的什么东西啊,如果如果说我可以在2d的情况下做。
我就在这儿做啊,这个意思,然后后面就是说我要发布产品了,我要调一调做一次,做一做微调,我要保证各个场景看上去都比较好,然后各种各样的问题我都修复好,然后以及包括说如果有这个嗯呃怎么说呢。
就是说啊深度的这些东西啊,3d的电影,然后之前渲染出来应该是有两个不同的这个方向的对吧,然后两个不同方向还要结合在一块儿做的对,然后还要字幕各种各样的东西,最后形成产品,大家可以看到这么一个过程啊。
非常非常合理的一个现代化的,一个整个一个动画的公司在做的一个事情,所以大家可以想象这是一个多么大的人力物力的消耗,然后别的我不知道啊,首先美工的这个工资开销,这是一个非常大的一块。
然后渲染本身它需要计算能力的开销,咱们之前说过对吧,像迪斯尼什么他们都需要所谓render farm,就是很多很多的这个计算机形成了集群cpu的集群,然后拿过去做渲染,然后是是非常非常贵的事情。
每时每分每秒都在烧钱啊,这么个意思,这就是为什么说呃做动画电影做出来的这个成本要请演员还要高,大家想象一下这个演员这个工资就已经非常高了对吧,但是做动画电影就是全3d的,是更加更加费事的。
呃费这个这个这个怎么说呢,呃预算的哈,这个事情好,那么这里呢我差不多就说到这儿,那这就是今天的这个主要内容,那么最后一个话题啊,最后一个话题就是我们下节课会主要给大家说。
我们到底怎么样去把这些事情解出来,就是说我给了各种的这个力啊,物理啊,理论呢我怎么把实际的运动给解出来,我用什么样的方法来做,那么这里呢给大家一个提示,然后大家看过jojo的话。
会知道这个空调承太郎对吧,然后他在打架的时候会说什么呢,哈哈哈哈哈哈呃好吧,我来看看弹幕有没有同学来告诉大家啊,嗯看看啊看看啊,稍等这边啊直播一向有延迟哈,好哎不对不对,还啊啊哈哈哈哈哈。
可以可以可以有同学已经这个知道这梗了哈,好没问题啊,然后那个呃下节课啊给大家说欧拉方法啊,就是欧拉啊,然后当然还有其他的方法,拉格朗日方法,各种各样别的什么方法,然后以及说咱们结课。
然后还有一些其他的内容好吧,那咱们下节课再来说这个事情啊,好那么今天咱们就说到这儿啊。
感谢大家支持啊,咱们呢还有最后一节课啊,啊这个非常好非常好啊,那咱们今天就到这儿,我也不再多留时间了,今天我时间非常紧张啊,然后我差不多这还有其他事情,然后如果大家有问题的话。
那大家欢迎到论坛上面去问好吗,然后如果我能及时看到这就是回答,那咱们就现在就把呃时间交还给技术秘书同学啊。
诶好像不是这个啊,好没问题啊,感谢大家啊,大家再见啊。
GAMES101-现代计算机图形学入门-闫令琪 - P22:Lecture 22 Animation Cont. - GAMES-Webinar - BV1X7411F744
嗯是咱们的呃games 101的最后一节课啊,第22讲,咱们把嗯动画和仿真这块给说完,然后咱们这个课呢叫现代计算机图形学,入门对吧,然后上下来之后大家体会到了吧,这个虽然是入门啊。
但是有很多现代化的东西在里面,然后今天能这个把这门课给完结掉,然后我自己也非常开心啊,那咱们这个今天的课程内容相对较少啊,呃我们把课程内容说完之后,给大家做做广告,然后呢来跟大家互动互动。
如果有各种各样的问题呢,欢迎大家提出好不好啊,那咱们就这么安排啊,第22讲啊,在课程之前呢还是一样,咱们先说一说呃各种各样其他事宜哈,一个是应大家要求,我们把大作业的这个截止日期,往后延长了一个星期。
没问题啊,如果大家觉得不够的话,之后我们再反正都好商量啊,这个之后反馈给助教同学,或者呃这个论坛上吧,然后如果大家真需要更长的时间,那就更长时间吧,我觉得差不多够了哈,一个星期。
那么作业期现在是175份提交,然后比之前要少一些,所以我现在非常建议大家,如果说觉得作业难啊,多花点时间没问题,之后咱们还会很快把这个作业期的呃,重新提交给开启,然后大家就可以到时候再把它给补交上来。
没什么问题啊,然后呢这个呃怎么说呢,这里就是说呃做一期相对难一点,然后到时候我们有可能会想办法,把他的这个权重稍微往下调一点哈,大家看到这里其实出现了我的签名,这是怎么回事呢,这个我们问了。
这就是我们要说的下面一个事情哦,哦中间还有一个哈,就是说我们的作业吧,今天会给大家放出来,非常简单的绳子模拟器,之前上一节课还是见到的啊,没什么问题,正确实现mass spring就可以了。
好那么这个签名是主要说什么事情呢,是说咱们这本这门课了,大家上完了之后不会让大家白上啊,大家把这个作业呃,都已经这个都辛辛苦苦做完对吧,然后我们也会给大家提供一份证书,然后呢这个证书会有我的这个签名啊。
就会是这个签名啊,然后呢啊到时候会给大家呃放出这个嗯,电子版的就是pdf版本的这个证书啊,然后呃什么时候呢,那自然是大家提交完了大作业,以及这个所有的补充,这个补提交都已经提交了之后啊。
咱们把所有的作业成绩都给改出来之后,然后给大家发放这些证书,那么怎么发这些东西呢,需要大家提供一些呃这个认证的这些,这些嗯怎么说呢,信息比如姓名啊,邮箱啊这些东西怎么办呢,把它当做一次作业。
我之后会让助教同学们呢建立一个作业,虚拟的哈,就叫做这个所谓certification request,如果你需要一个呃这个电子证书的话,然后到时候呢,我们这个你你按照这个助教的要求。
然后提交这个所所要的信息就可以了,就当成一次作业提交,非常简单啊,提交了之后,然后每一位提交的同学,我们最后给大家这个发放这个啊证书,当然了,这你得能够顺利通过这门课对吧,这个没有问题啊。
好那大概就是这么个安排法啊,那么这里呢这个嗯有同学反映,我的中文字写的还可以,没有我专门练过签名啊,这个事情其他的字写得不怎么样啊,啊这这个事情,另外这是在ipad上面写的。
所以说其实和实际上写字还是有点区别哈,就是一个事情啊,好那么今天最后一节课了,虽然我也很难过,对不对,这个最后一节课了,这个之后就没有了,妈对吧,这之后我们再给大家说啊,这个事情啊,不过这门课结课了。
还是挺开心的一件事情啊,没问题,好那么好,那咱们这个呃开始说今天的话题啊,今天的话题啊什么呢,就是说我们今天啊沿着上一节课的思路,上一节课,咱们不是介绍了各种各样不同的方法对吧。
然后嗯就是说模拟各种各样的运动,基本知识对吧,我们说我们定义一个物体它的速度啊,然后我自然而然在任何一个时刻,我都可以算出来它在在哪,而是这么一种意思,对不对,但是我们没有讲具体怎么做。
那么咱们这节课呢,主要就是说从上一节的概念出发,咱们讲一讲方法,真正怎么样把这些物物体啊,这些各种各样不同的位置啊,时间在对应的不同时间,它出现在哪里对吧,一个物体以及堆物体,咱们怎么把它解出来啊。
简单给大家说一下,这里呢简单提一下这个欧拉方法,以及这个解决不稳定的若干提高的,这个办法好吧,然后简单给大家提一下钢铁的模拟,最简单的模拟,后面给大家说一下流体的模拟叫fluid,好吧。
差不多今天这么安排,最后再加上一些广告啊,就这么一个打算好哦,有同学反映说啊,之后要不要嗯给大家安排一下,这个是好问题,好那行,那没问题,那这个之后我在讲广告的时候,这个正好给大家穿插说一说好吧。
那今天内容其实这个非常简单哈,那咱们看一下呃,我们要干什么,刚才说清楚了,对不对,我规定了一个物体,它任何一个时刻,比如说啊任何一颗一个时刻的速度,然后呢,我又知道他一开始出现在某一个位置上。
那么我们想解什么呢,我们想解在某个时间之后,它会出现在哪里啊,这个这个事情啊很简单,对不对,那如果一个物体它有一个固定的速度,那么它原本出现在某一个位置上,在t0 时刻出现在某一个位置上。
然后在t一时刻它应该出现在哪儿,咱们知道对吧,把这个位置加上速度成立时间就可以了,那如果说唉这个问题没有这么简单的,大家看右边这个例子哈,这边这个例子呢,我们现在在说的,就是说我想模拟某一个例子。
他在一个什么呢,在一个速度场中怎么样运动,什么叫速度场啊,大家理解成跟广场啊,跟磁场啊,其他一切的这种厂完全一样的概念,也就是说任何一个位置,只要你知道这个位置,你就知道他这个时刻的速度啊。
这当然是一种理想化的情况,在这个实际的情况中,这种情况这很难做到的,对不对,你这能够定义任何一个位置,他受多少力,这差不多,但是一个位置它的速度是多少,不知道对吧,但是咱们认为哈有一种理想的情况。
这种就叫速度长,那大家可以想象,如果有一个粒子在这个地方,它应该会沿着这个类似水流的这个方向,往这边走,对不对,这个意思,那也就是说任何一个位置,x任何一个时间,我都应该知道它有一个速度没有问题啊。
然后我们现在考虑一个例子之后,我们再再把它这个提高到这个,很多例子在一块儿,咱们考虑好吧,行那是这么一个情况了,我们定义的啊,长对吧,有位置有方向,那这这自然就是一个速度长,然后呢这里看啊。
如果有一个物体,它一开始在这儿,然后他每一个点定义了它的速度,大家就知道这就是他所谓的切线方向,他往前走那么一点点就会改变一点点速度,然后就随着这个速度长,什么这么运动下来对吧,是这么一个意思。
我们希望做出这么一种模拟来,就是这个意思了,那么我们有什么呢,在任何一个x我有他的x点,还记得这个这个写法,这个x上面打一个点,就表示它是这个速度,一阶导数打两个点,那么在任何一个位置我都知道它的速度。
它的速度的定义,当然是一阶导数的dx除以dt对吧,嗯然后呢,它就有一个这个呃不同的这个速度,任何一个时候对吧,就这么一个定义方法,那么这里呢我们定义的这种写法,就叫做一个常微分方程。
就是大家如果上过这门课,那自然是很明白这个道理对吧,而且是个一阶的常微分方程,什么叫一阶呢,我们就说这个我知道这一个量,它的微分是多少,然后我希望推出这个量是多少,是这个意思,这是常微分方程。
那为什么叫常微分方程呢,叫ordinary对吧,o d e然后常微分方程的意思就是说啊,这里面不存在其他的对对其他变量的微分,或者说导数,比如说它这个可能还有一个d什么呢。
d u d v d y d t d这个d t出现了啊,如果这个还有其他各种各样的变量,然后呢你求出来的某一个值,它对某一个变量,它的导数你就写上这个partial x除以partial t。
这个partial这个写的很像这个呃,这个倒写的字母a啊,这个意思嗯,那么这里呢只有一个变量,这个变量呢就只有对它的微分,那这就叫常微分方程啊,好理解啊,就是单变量的微分方程好,那么我们现在呢知道速度。
我想求任何一个时刻它的位置,对不对,那就是这个意思咯,那我想知道任何一个时刻他的位置,我肯定一开始先得给他一定的起始位置,没问题吧对吧,那其实我认为它在x0 ,那我想要做什么呢。
我想给他任意的时间t你都能告诉我他,他会在哪个位置对吧,这个意思,这样我就等于可以把这个点,它随着时间运动,它的轨迹给解出来,没有问题啊,那么我们怎么解怎么解呢,这个其实呃一个最最简单的想法啊。
就是呃那我就呃怎么说呢,我要求一定时间之后一个点它位置在哪,那我把这个时间给细分成很多,很多很多的时间的小块,然后每一个小块呢我计算,比如说我当前的时间t,我计算时间t加上某一个deltt,唉。
这个之后他在哪儿,然后我不断这么做是不是就可以了,对不对,那么我每一步啊我要考虑的这个叫做不长,就是叫做delta t啊,就是从某一个时刻到这个时刻加上delta t,下一个时刻,这个应该怎么样变化。
也就相当于啊,我们对这个时间上,进行了一种离散化的操作啊,没有问题,那么具体怎么做呢,这里先给大家提出一种,这个最最最最简单的想法,其实不说他的名字,自己倒是想也可以想的出来啊。
欧拉方法欧拉方法呢他怎么做呢,呃最简单的这个思路就是说啊,我在上10个时刻就是t时刻啊,大家把时刻都给写在右上,右上方上一个时刻是不是有一个位置,然后我要帅这个t加上delta的一些时间,那那怎么办呢。
咱们知道这个事情就是说速度怎么样呃,那就是说啊我这个给定一定的时间delta t,加在速度上面,就变成了下一帧的速度,没问题啊,然后呢同样道理,那如果我说我上一帧有一个速度,有一个位置。
我怎么算下一帧的位置呢,那也是这么算啊,就是说这个下一帧,他肯定是下一帧的这个位置加上呃,这个这个就是上一帧啊,上一帧它的这个位置就是上一个时间,就就是t时间呃,他的位置加上它的时间。
乘以这两个时间中间的这个这个时间间隔,对待奥特t诶,这我就可以更新到下一帧的它的位置去,没有问题,那大家可以看到一个什么事情呢,就是说啊我用到的量,我始终在用上一个时刻的量,大家看啊,x t x。
t还是两个点t,始终用上一个时刻的量去估计下一个时刻,它的量应该是多少,对那个同学不说,我能不能这样啊,你看啊,上一帧有一个速度,我就可以算这一帧他的这个新的速度,我在用这个新的速度,我再去算这个呃。
这个呃这下一帧它的位置是在哪儿,就说这里呢,我能不能把这个速度换成这个呃x点,然后什么呢,t加l的t就用下面这个式子算没问题,这也是另外一种方法,然后这种方法就不再是欧拉方法了,好吧。
我们说的欧拉方法很简单,或者叫前向欧拉,或者叫显示欧拉,这是一个最最简单的方法,所有的量我都用上一帧的,然后我估计就是估计下一帧的,这两个是截然分开的,大家可以看到对吧,哎等式的右边用到的这个x的三个。
这个没有点一个点,两个点用的全都是上一个时刻的等式,左边全都是下一个时刻的啊,这么个意思好,那么他有什么问题呢,他非常不准啊,它非常非常不准,还会出问题,什么问题,这个叫做稳定性上会出问题。
会迅速的变得不稳定,那么这是什么意思呢,对吧,那咱们可以看这么一个例子哈,在任何一个这个位置上,我们还回到刚才的速度场上,考虑最简单的位置速度两个事情,那么在任何一个位置上,它会有一个这个呃速度。
然后在这里对不对,那我要要计算它在下一个deltt时间之后,它会出现在哪儿,那咱们用欧拉方法,那在一开始它有一个x0 对吧,然后一开始有一个v0 ,然后我们把它把这个v0 乘以deltt,加上x0 。
是不是就可以得到下一个位置,然后我同样办法,我在这个点诶,我再去找一次它的速度是多少,然后它的位置,它的速度我就可以知道下一个位置在哪,没问题,下个位置知道了又知道速度,我就可以不断的模拟下去。
那么可想而知啊,对不对,我如果用这个不同大小的不长,什么叫不长deltt对吧,deltt,如果我分得越细对吧,这样的话我的模拟就应该越准,那如果说我的这个步长走得非常大。
我每一次取一个速度让往前走很长一段,他就其实和我要的这个实际的这个路线啊,偏离的越来越多,那如果说我用一个小的步长诶,我每次用了很小的不长,然后我这样1。一点一点让它往前走,那就越来越精确。
是不是这个意思对吧,就是说我们用肯定是用这个更小的tt,然后他才会更精确,那是这么一个意思哈,没问题,这就是它产生的一些所谓误差,没有问题,这个误差呢可以通过你减小deltt来完成呃,来把它给做对啊。
这个意思好,那么呢这个另外一个问题是什么呢,另外一个问题咱们刚才说了,涉及到稳定性的事情,所谓稳定性呢,就和误差是不太一样的一个概念了,什么意思呢,就是说还是同样我们考虑这个欧拉方法啊。
欧拉方法任何一个位置,考虑它的这个位置,和他这个位置所在的速度对吧,我们正好这样模拟下去,大家看右边这个螺旋形,右边这个螺旋镜,它就会出现这么一个问题啊,就是说我不管取多大的不成。
我不管取多大的不长之后啊,就是时间上取多大的不长之后啊,然后我我会发现无论如何,我得到的这个这个线啊,都是呃肯定不可能沿着这个螺旋形走啊,不管怎么样,我只要取一个不长,那就意味着任何一个点啊。
我取它某一个速度,这个速度,如果认为是这个螺旋形曲线的切线,那就往往一个方向去到另外一个地方之后,它速度又会变成另外一个切线对吧,然后就一直这么走,一直这么走,最后造成的结果是什么,噪声根,结果就是说。
他一定会离开这么一个螺旋形的一个,速度场,而事实上来说我们看到啊,这个按理说这个如果你任何一个时刻,都有一个和你的这个位置垂直的,这么一个一个速度哈,它无论如何,这个粒子。
它应该是按照一个严格的圆周运动来做的,它不可能飞出去,对不对,就会出现这个问题,不管你不长取多小,它一定都会飞出去,它有这么一个问题啊,这个意思,那么同样道理,下面这个呢稍微更麻烦一点。
但是其实一回事啊,大家看到这个场更奇怪,它的厂呢是类似于这样的,跟头发一样的这种造型啊,在这里会有一个速度,会把这个一开始的粒子给打到上面去,上面去呢又发现下面又有一个速度要往下,又把它给扔到下面去。
然后呢下面这个又扔到了某个位置之后,又发现哦,它又有一个速度向上又变成这样了,所以说其实如果你正确模拟的话,应该怎么样呢,应该会按照这么一个这个这个区间,慢慢慢慢慢慢走到水平,对不对,走到这么一个情况。
但是这种情况它就会出现越模拟越大,出现这么一种情况,那如果大家学过信号与系统的话,其实这种情况会不会被叫做什么呢,叫做正反馈,对不对,就是说你出现了一些问题之后,这些问题会被无限的放大。
就会出现这么一种情况对吧,而这个问题,咱们还是回到这个螺旋上面来说啊,这个问题它就和误差它是两码事的,因为你不管delta t取得多少,他一定到最后都会出现这么一种,这个这个变成和你的实际的结果无限远。
这么一种情况,这种就叫做不稳定,这就是欧拉方法的问题,好吧好,那这就是就是说咱们提到这两个事情啊,误差和不稳定性,那么我们总结一下啊,就是说一切用数值方法去解,这个怎么说呢。
解微分方程都会面临的这些问题,第一个呢叫做这个这个误差,误差其实问题不大,因为你在每一步计算都会有误差,累积起来它还是有误差对吧,没有问题,那如果说我这个呃用的步长较小,我就可以降低它的误差那个问题。
然后有时候呢你模拟出来一些误差,按说问题也不大,特别是对于图形学的一些应用,其实大家主要这个关注的地方是说,你这个模拟看起来效果怎么样,对不对,而不是说物理上特别特别的真实,是这么个意思对吧。
那这种误差,那更大的问题其实在于不稳定,不稳定他才是问题,他就说啊,这个大家注意这个diaverage这个词,哎这个就比较厉害啊,就是说这个diverge呢,这边这边意思就是说。
你有任何一个这个某一某一种模拟方法,但是你不管你怎么样模拟你的结果,他最后他都和这个实际的这个呃,你要的这个正确的结果,它差的特别特别的远,就越来越远,出现这么一种情况啊,这种情况那就是问题。
而且它是一个非常非常基础的问题,就一定是会出现有这么一个问题的,所以说大家都在试图想办法,解决这么一个不稳定的问题好吧,那么这里给大家看一个例子啊,这个真实的游戏里的例子,这就是这个啊,绝地求生大逃杀。
里面的一个这个车子的例子啊,大家可以看到这是一个多么神奇的现象,好吧没问题啊,短短的几秒啊,我试试看能不能回来一点好,大家可以看这个车子撞上了一个摩托,按说呢他应该是直接继续往前走。
或者说这个弹一下对吧,他是不可能出现这么一手,很神奇的魔女的现象的,对不对啊,当然了,这个背后发生了什么,最后不知道啊,然后这个是不是说,因为这个不稳定性造成的一些问题,这个我也不知道。
但是咱们这里作为一个例子,不稳定确实会出现这么一种问题啊,诶有同学反应,这是诶嘿嘿行,这是我直播翻车现场行,挺好挺好挺好,机智啊,ok哎没问题啊,这是这个这个一个典型的例子哈。
然后嗯那咱们再回到这个课程上来,我们既然提到了不稳定性对吧,那我们肯定要想办法解决这个不稳定性,而且啊从刚才的介绍上来看,我们怎么解这个微分方程呢对吧,我们是不是用呃欧拉方法来解,那也意味着。
是不是有其他各种各样的改进方法,对不对,能够帮我们解决这么一个不稳定性,那确实是可以的,怎么办呢,这里呢提供若干种不同的方法,这些方法呢你看看大家可以看到呃,中点法啊,终点法,然后以及动态的这个改变。
或者说自适应改变不长的方法,然后以及影视的方法,然后以及说其他的一些,这不是基于物理的方法,而且都是什么意思,咱们挨个给大家说啊,非常容易理解的一个事情啊,就是怎么说呢,我们先介绍第一个概念叫做终点法。
那么我们要干什么,我们不希望说这个欧拉方法,让在这模拟的过程中啊,让这个结果离得越来越远,对不对,我们不希望出现这种情况,那怎么办呢,也有人发明了一个这个方法,什么方法就是叫做终点法,怎么做呢。
那一开始有一个位置,一开始有一个方向,咱们是不是可以直接拿欧拉方法来模拟,某个l i t,假设这个ott能够让它从这里先到达a好吧,没问题啊,当当它到达a之后,我们不用这个点,不用这个点怎么用呢。
我们取这个原始的点跟这a点中间的中点,取这个终点呢,考虑终点所在的速度啊,终点这个点他在的速度长,它可不是应该是有这么一个速度吗,啊终点我们认为是b点,然后它有一个速度,往往这个几乎是平着的这个方向。
然后我再回到原始的出发点上去,回到原始的出发点上去呢,然后我应用刚才的这个b点,也就是终点它的速度来重新再算一遍,欧拉方法唉,就是说这一点,我现在不再沿着它原来的速度上去了。
我现在沿着刚才我算出来终点的那个方向,也就是这个方向哎,这条黑线方向往这边走,考虑它的一个时间点太低诶,然后我就算出来,他这个时候就应该到达了c点,就这么一个意思好吧,这样一来呢,大家可以可想而知啊。
原本来说它的路线是不是应该这样的对吧,从这个速度长出,咱们可以猜测出来他先往上诶,到到这里开始平,到这里开始往后我往往下对吧,那么在这样一来呢,我会发现我用中点法计算出来的。
这个这个值要和要和这个什么相比啊,和这个原始了一次这个欧拉方法相比诶,那它好很多,对不对,就是会出现这么一种情况,那自然而然这个重重点方法呢,这就会比这欧拉方法要准确,那就有这么一个概念在里面。
那么它的核心是什么,核心是什么,就是说我仍然是用的欧拉方法,只不过用两次,第一次为了得到第一次的终点的速度,那么第二次是用中点的速度,再算一次欧拉方法啊,这个意思好吧,那么他的这个想法呢。
自然而然就是说,我这个我,我我在第一次模拟欧拉的这个过程中啊,它速度肯定会发生变化对吧,他在一开始跟最后的速度肯定会发生变化,我找一个更有代表性的速度,能够代表他整体一个运动对吧,那谁呢,就取一个终点。
就这么一好吧,就这么一种模拟方法,然后呢它其实也可以,这个写的非常呃这个呃工整啊,是这么一个一个一个算法啊,呃没有问题,那大概就是就是这么一个,简单的一个写法啊,然后你发现什么了呢,你会发现啊。
就是说我在把这个式子给展开了之后,给展开了之后,嗯,其实终点法为什么会准确,是因为中点法呢,比欧拉方法多了一个这个二次的项,也就是说啊通过终点法,其实你模拟出来了一个这个所谓抛物线。
这么一个一个呃运动轨迹,扔个意思啊,至于这个24个从哪来的呢,那自然就是说,我在平均两个速度的情况下啊,然后这么算出来的好吧,那这个就暂时先呃不用多说了好吧,然后这块呃重点方法就是嗯。
简单而言就是相当于是原本的欧拉方法,你可以认为是认为是一个局部,线性的一个估计的模型,那么这里呢用终点方法啊,那其实就相当于你算出了一个局部的呃,二次的模型,而这个意思。
那当然它就比这一次的模型要准确了,对吧好,那就是这个这个事情,那么对于中点法呢,它其实有一个稍微更怎么说呢,更呃好的一个应用哈,就是说我用中点法,我是不是可以得出两个点,刚才大家还记得吧。
a点和c点对吧,a点呢是我一开始咱们回去吧,好那a点是我用一次这个欧拉方法呃,来来来做出的对吧,这个正向或者是显示的欧拉方法,算出来的点,那么c点是我用中点法算出来的点,没错吧。
那么我能不能把这两个方法给结合起来,好吧,然后呢这这样一来呢,就有人这个想出了这么一个事情,就是说我还用终点,但不是用中点方法那个终点哈,就不是用终点的速度,那怎么做呢,很简单很简单。
还是把终点这个思想给应用进来嗯,就是说我应用一个时间的dio tt,比如说呃这个这个一开始有一点在这里,时间delta t之后,我用欧拉方法得到的,在这个大写x t上对吧,那显然它不是多准,那怎么办呢。
我把这个时间减半,我把时间减半,我把它分成两个单ott,我两个带ott呢,我算两遍,那我可以这么算,那在这个点我用这个二分之delta t,我可以算算到这个位置上,没有问题,那再二分之delta t。
我从这个点我再算一次这个欧拉方法,咱们这个点的速度,显然它就是终点的速度了对吧,再算一次欧拉,诶,我可以算到这里,那也就是说这样得出了另外一个点,叫x t除以二,其实是应用两次二分之t t没错吧。
那么这两个点它可能会有不一样,对不对,那怎么怎么去这个利用这个思想呢,如果这两个点它俩差的挺远的,那就意味着说我把这个deltt啊,分成两部分来分别考虑,我先跑一个二分之l tt。
再考虑一个二分之d tt诶这样做会更准确,那我就应该把这个时间再给拆分的,更短一点,考虑1/2的tt就是这么一个意思对吧,那这里啊再次强调一下,和刚才终点法啊不一样,没有。
是这个应用没有在一开始这个点重新应用,终点的速度,而是说就是说我就跑两次,每一次呢跑一半时间,在这个终点,重新估算这个它的这个呃新的速度,然后再用另外一半时间从终点出发,算出另外一点啊。
虽然都是利用了终点的概念,那不管怎么样吧,就是说他会给我们一个标准,我是否这个划分,把这个dd划分成两部分,而取决于说我这个这两个点差得远不远,那如果说我分成两部分来跑,然后跑出来两个这个点位置差不多。
那这就说明什么呢,这就说明啊,我现在用的这个deltt,或者说二分之d o i t,时间已经足够小了对吧,时间已经足够小了,我就没有必要再把它往下分下去了,就是这么一个道理啊。
这个是呃基本的一个呃怎么说呢,自适应也叫adaptive的一个思路啊,就是说我试着把时间分成两半,分别跑,跑出来的结果,如果说我的这个跑出来结果接近,我就不管了,我觉得是了,差不多了。
就是说已经没必要往下分了,如果跑出来两个结果相差甚远,那就说明什么呢,就说明这个我是有必要继续往下分的,对吧啊,这么个道理,那么分下来之后,你得到了一个什么呢,你就得到了一个在不同的位置。
你会选用不同的deltt来做这个计算,哎这就非常好,这样的话呢大家可以看到通过这种方法,你其实可以模拟的非常好好吧,这是一个事情,好啊没问题,那这是第二个方法了,那咱们现在呢再给大家说第三个方法。
第三个方法是什么呢,第三个方法叫做影视的欧拉方法,那么饮食的方法呢,嗯有时候也被人称为反向,或者是就是这个backward的这个方法啊,但是这种方法正常不是多么正式,正式的说法。
就是说我们之前教的大家的那个方法,就是叫做呃,叫做显示的欧拉方法或者前向的啊,然后这里叫呃,这里应该是叫做影视的欧拉方法,然后或者叫后项的,但是其实呢把它说成是后向的,这个更好理解,为什么呢。
因为它的一个核心思想,就是我用的这个所谓derivative,也就是就是我用的梯度也好,我用的这个导数也好,用的永远都是下一个时间的导数,咱们刚才说这个欧拉方法的时候,咱们有这么两个式子,对不对。
有这么两个式子,我刚才说啊,就是他无论如何是用上一个时间的位置,这个时刻它的这个呃速度和呃,和和位置对吧,那么嗯对于影视的欧拉方法就不是了,影视的欧拉方法是说啊,我用的速度,我是用这个下一帧的速度呃。
那么所有的区别就在这里,就在这个加dltt这边,然后这就是它和人欧拉方法的所有区别,那么大家可以看到一个什么事情啊,可以看到一个一个很明显的事情,是说你再用下一个时刻的这个呃,嗯就是就是速度嘛。
然后下一个时刻的速度,你一开始还不知道呢,你可能也是还是不知道嘛对吧,你用的相当于是未来的一个时刻,它的这个属性对不对,就这么一个意思,那么你这里要怎么做呢,这里最后要解出来是一个这个呃,一个方程组。
一个方程组,它要解出来一个它的位置和它的速度,是这么一个意思,所以说这种情况下就不就就嗯比较不好解,就是说我们对于目前来说,一个简单的运动方法,那自然是一个很好解的一个事情啊,间。
不是按照这么一种简单的线性方法,来来叠加的对吧,那么这种情况下,我解这个式子就不再好解了哈,就是说这里不希望给大家一个错觉,大家会觉得哎这下一个时时刻的这个速度,不是直接可以拿这个下面公式,这个算。
我把这个这个公式给扔进去,然后我就发现这可不就解出来了对吧,然后是这么回事啊,然后但是呢正常的一些情况,但是是不是特别容易解出来的,不是特别容易解出来,怎么办呢,大家想象一下啊,我可以认为啊。
我在下一个我在这个时刻位置知道,那么也就是说我只需要解下一个时刻,它的位置和速度,那么这个怎么解,我有两个等式,然后有两个未知数我肯定可以解出来,然后正常情况下,家呢大家会说用这个怎么说呢。
用各种各样的这个优化方法来解,或者说用这些求根公式来解,那比如说用牛顿法来找一些函数的零点啊,这些是肯定是可以直接做的,没有问题,但是呢大家可以想,就是如果我要解除某一个值,那跟我之间用这个公式。
我去推出这个下一个值,明显的公式直接写出来,然后呃正正相比的话,那这些数值解法那肯定是要慢很多,对不对,但是这个影射的欧拉方法就会给大家提供,非常非常好的这个呃稳定性,就是这么回事好吧。
那么啊就是这么一个意思,影射的欧拉方法啊,那么既然我们提到啊影射欧拉方法,我们又提到这个稳定性,那么肯定有同学要问这么一个问题,说我如何定义这个方法是不是稳定的,以及它有多么稳定,对不对。
这是一个很自然而然的想法,那么怎么定义呢,通常啊人们对这些数值方法的定义,它会定义两个概念,一个叫局部的所谓trication error,就是局部的截断误差啊,这是一个什么意思。
也就是你每一步会产生多少的误差,咱不是把这个时间分成很多dl t嘛,每个dlc t呢是一步对吧,我们走很多步,那大家可以想象,那我每一步的误差最后肯定会累积起来,最后累积起来的误差叫什么呢。
非常好理解啊,局部的每一步的误差,和整体最后算出来的误差,用这两个概念来衡量稳定性,然后是这么个意思,那么正常情况下呢,人们认为啊研究这两个这两个数,而是没有意义的,但是应该研究他们的这个阶好吧。
他们皆是什么意思呢,就是说他们和我取的delta t的关系,那咱们刚才说过这误差怎么样减少对吧,误差怎么样减少呢,我用更小的代l s t,自然而然这个误差就会减小,可是这个误差。
它是如何随着更小的delta t而减少的,他们之间是一个什么样的关系,诶这里是大家要研究的一个问题好吧,所以数值方法呢,大家会用这些这些办法来解决这个问题,那么我们现在直接给大家结论什么呢。
影视的欧拉方法它是一阶的,什么叫一阶的呢,意思就是说局部的误差,它是有一个这个o h平方的误差,然后呢这个全局的误差是h的误差,这么一个意思啊,不这是什么意思呢对吧,所以大家可以可以想象一下这个意思啊。
就是说呃这里a h呢是表示我们取的不长,对于咱们的实际情况来说,对于这个情况来说就是deltt啊,deltt,那么deltt取的越小,那我最后得到的误差肯定就越小,就是这么一个意思好吧。
那么怎么理解这个不同的o h多少多少,多少次方呢,那我们这样想,就是说啊,这里我们认为比如说这个影视的欧拉,我们告诉了大家,他的阶数是一,那如果咱们以这个这个全局的这个创开始,a或者说这个最后的结果。
然后以这个呃最后得到的结果的误差为例,它是o h的,意思是就是我现在说的这句话,就是说如果我把h减小一半,或者说deltt啊减小一半,那我就期望我得到的误差,也会跟着减小一半好吧,这样就好理解了。
对不对,嗯那那这样就这这样的话,那自然大家可以体会到这么一个事情啊,就是说我的这个接触,我这个不同的方法肯定有不同的接触,接触是越高越好,为什么呢,因为我这样的话,如果说我有一个平方的直接数啊。
那如果我把h减小一半,那我的这个误差可以减小到1/4,对不对,那如果有个三次方的这个方法,o h3 次方的诶,那我这样的话我把h减小一半,那我的误差我就可以变成1/8,那就非常好,对不对。
那所以说呢人们就这个经常去研究这些,这个不同的这些呃呃怎么说呢,就是不同的这些数值方法,来来来计算这个嗯他们对应的稳定性对吧,就是用这种方法来定定义,用他们的接触来表示他们的稳定性,那这样一来。
咱们就把这个稳定性跟一个接触,表示起来了,那么咱们讲完了这个影视的欧拉方法之后,咱们有一个方法是肯定是要提的,是因为在这个数数值的这个计算领域啊,有一类方法是非常非常有名的方法,叫什么呢。
叫龙格库塔方法,就是这个具体这个事是哪国的,这个这个文字我就不说了,反正中文这肯定是呃翻译成啊,龙格库塔方法,但是呢它不是一个方法,它是一类方法啊,然后这一类方法呢。
它是非常非常呃擅长解这个ode的好吧,就是偏v2 差常微分方程,特别是什么,特别是对于这个非线性的情况,咱们刚才不是说了吗,就是说这个当场扭曲的比较厉害的情况下,咱们看到终点法比这个呃前向欧拉法要好。
因为前向欧拉法永远认为它是一个这个,线性的模型,然后呢重点法认为它是一个平方级的模型,诶这里是更好,就这个龙格库塔方法是更好,那么呃龙格库塔方法,中间有一个龙格库塔方法是用的最广泛的,一个叫什么呢。
叫这个rk four,这是什么意思呢,就是说它有一个四阶的方法,咱们刚才说了,这阶数是越高越好对吧,大家知道这个隐士的欧拉,它这才是一阶的,他可是四阶的,所以大家想想,这个他的这个误差是有多么的小。
对不对,那么他这个这个方法呢就叫做这个ark for,就是简简称啊,这么这么说,然后呢同样道理,他解决了这个问题,跟这个啊影视的欧拉啊,或者各种各样的欧拉方法,咱们定义的这些方法其实完全一样的哈。
就是说我有一个呃某一个一阶导数,大家看有没有某一个一阶导数,某个量是这个量呢,它是肯定是时间和我这个量,这个就是这个导数本身肯定是有我这个呃,比如说位置啊,比如说位置这x这里就是y对吧。
然后和时间都是有关系的,它是某一个函数,一开始呢这个位置它出现在某一个位置上,那大家会发现,这里跟我们之前定义的这个位置,对时间的导数,也就是速度其实是非常一致的,对不对,还有一个这个初始情况。
知道了初始情况之后,他怎么做也是一样啊,他少不了做这么一个事情,就是说我取一个h就是delta d啊,delta t大家会看到诶,我从某个时间可以进入到下一个时间对吧,然后下个时间就是当前的时间加上。
不带t买h没问题,那么它只是在更新的时候,稍微和这个其他方法有点不一样,什么什么不一样呢,大家可以看到啊,它的更新是用上一帧的这个量啊,最后我要的就是对应咱们的呃,刚才速度场的,这就是呃位置啊。
呃上一帧的位置怎么样更新,才能更新到下一帧呢,那么通过这种方法来做什么呢,1/6乘以这个deltt啊,乘以deltt肯定得有,然后这后面这一系列东西,大家会发现,就相当于是deltt乘以某个平均值啊。
k一加两倍,k22 倍k3 加k4 除以六啊,这是怎么来的,咱们就不说,咱们这给大家这个简单看一下,这几个量都是什么,大家会发现这几个量其实都是,你这个x就是就是不是x就是x的导数。
就是类似于咱们速度场啊,速度场它在这个不同的位置,以及不同的时间,可以看到不同的位置以及不同的时间,它们的值都是多少,也就相当于是一个推广的这个终点法,对不对,这么一个一个理解方式。
只不过呢它这个中间算,这是经过精心设计的,并且它的它的这个呃,最后的接触也是可以呃,严格证明的没问题啊,它最后是这个四阶的,那么肯定有同学反映,说这个更神奇的这些方法都到哪,才能这个呃了解的更详细一点。
把这个方法彻底给搞明白,这里呢呃如果大家上过啊,这门课的话,这个课里面肯定是会讲到这个大量的这些,龙格库塔方法的,以及去分析他这个到底是怎么做的,好吧,然后这门课呢其实来说对图形学来说。
也是非常有用的一门课,然后所以我建议大家去上一上,如果没上过的话,数值分析,当然咱们之前课还提到过信号处理对吧,这些都是啊很有用的一些课程,然后如果大家说想要把图形学,那肯定把这些东西都掌握的会比较好。
好吧,呃比如说我这里自己其实就已经忘了,他是怎么样推导的,这些这个它的这个接触哈,但是不管怎么样,就是这一块儿嗯,呃数据分析这块的课程肯定是会讲明白了,好吧,那咱们这里就不再赘述,讲到这里差不多了好吧。
那么这是一系列方法啊,好啊,ok那咱们现在呢再说这个最后一种方法,就是一种咱们刚才说的是这个呃,不是基于物理的方法,那么这种方法呢其实是一个呃,最最最最简单的这种计算方法啊。
大家可以看到叫做position based,或者他还有个名字叫vent integration,这块呢咱们不用管它,意思就是说呢,我只通过调整它的各种各样不同位置,使得它最后能够满足某一定的这个嗯。
呃某种限制是这么个意思啊,然后咱们待会儿会讲了一个具体的这个,所谓position base的一个例子,那么这里是怎么回事呢,我们为什么要提这个概念呢,因为有时候啊这一系列的这些呃,不是基于物理的方法。
它其实挺好用,比如说咱们在这个嗯作业吧里面啊,我们就会有一块让大家实现这个事情,就是这个verlet integration,他是怎么想的呢,他认为说我这个弹簧,我可以认为某一截弹簧它确实是弹簧。
但是它只要被拉开了某一个位置之后,他立刻会回到原状,你可以认为它是一个精度系数,无限大的一个弹簧,那当然在物理里面,是不可能出现这种情况的,就是说它的长度肯定不会改变,但它会提供一定的力。
这个是说不过去的,对不对,但是它的实际的模拟中是非常好用的,这个为什么呢,因为你可以理解成是,当这个弹簧某一个地方拉了这个多长之后,然后他会想办法立刻去调整,这两个这个弹簧的两个端点,他们的位置。
使得使得这个弹簧立刻能够回到它的,这个原始的长度,是这么一个意思,那也就是说,他中间经过了一个这个很复杂的一个,什么样的过程,通过了一些非呃物理的一种简化方式,我就直接改变它的位置。
就是这么一个意思好吧,那这里咱们先说到这儿,马上让咱们说流体,就会说一个具体的这个例子,怎么我去调整这些这些呃,这个例子它们不同的位置好吧,就这个意思好啊,那这里呢首先它的这个呃,肯定它实现起来会很快。
它不需要经过这些物理模拟嘛对吧,我只需要这个呃,把这些位置给调好就对了对吧,那么既然不是基于物理的,它有时候它会嗯不太能够保证一些性质,特别是能量守恒的性质,就是这个意思。
就是说如果咱们应用了这个vintegration,在咱们绳子模拟器上啊,咱们会立刻发现这个绳子会很快停下来,会会有呃很大的能量损失,这么一个意思好吧嗯,ok那不管怎么样,大家自己在实现作业八的时候。
就会发现这个事情啊,另外是真的作业吧,非常非常非常容易,然后大家这个肯定可以立刻上手啊,没问题好,那咱们这里呢讲完了一个例子,对不对,怎么样去模拟它,那咱们回过来讲另外一个事情,讲什么呢。
讲这个钢铁的模拟,钢铁的模拟其实非常简单啊,rigid body就叫钢铁,那既然是钢铁,那通过名字咱们也可以理解的出来,它不会发生形变,它不会发生形变,那那意思就是说他基本上来说啊。
就是说这个这个这个这个他会嗯,他会让它的内部的所有的点,都按照同一种方式去运动对吧,它不可能出现某一个点,它的运动和其他东西不一样,那所以说既然是这样的话呢,那这个呃,其实钢铁的运动。
基本上就是一个粒子的运动,没有什么特别意外的情况对吧,就是这么个意思,所以说你能够模拟一个粒子,一定可以模拟一个缸体,只不过呢在缸体的模拟里面,人们会这个更多的考虑其他的物理量。
比如说这里大家看到这么一个公式啊,这个公式它是说呃这么些量,它对时间某一个这个导数是多少对吧,那呃这些量都是什么,比如它的位置,一个一个缸体,它的位置以及一个这个缸体的朝向,就是它的旋转的角度啊。
然后然后以及说它的这个呃速度啊,速度这个大家看到位置上面打个点嘛,速度以及它的什么呢,它的角速度它旋转的有多快对吧,这里呢也就是说考虑钢铁的时候,无非就是说在原本的位置和速度的基础上。
我们又可以考虑它的现在的所谓角度,和它的角速度对吧,那我们知道这四个量分别求导之后,咱们可以看到比如说位置对时间求导,它就是速度对吧,然后它的角度对时间求导就是角速度,然后你会发现它的输入。
会跑到另外一个输出里面,跟咱们刚才的这个是一回事嘛对吧,然后呃位置求导变成速度,那么你对于这个啊,没问题,这都是什么,这些物理上咱们都说过对吧,然而这些都没有什么问题好。
那既然我可以把这么一个式子给写出来,写出来之后,那我自然而然,我可以这个用欧拉方法去重新的呃,就是说呃给定一个时间dt啊对吧,用各种各样不同的什么欧拉方法,或者龙哥扩大方法,别的什么样的数值方法。
我就可以求出任何一个时间t之后,这个呃缸体它对应的位置,以及它是怎么样旋转的,没问题吧,就相当于是对一个粒子,简单的一些扩充而已好吧,那么嗯这块呢自然没什么特别需要多说的,一个内容哈。
那么我们现在直接进入下一个话题,我们刚才既然已经提到了,说呃所谓position based,它不是一个基于物理的方法,对不对,但是有时候挺好用,那么我们以一个这个流体的模拟的呃。
呃场合来给大家作为一个例子啊,呃分析一下这么一个所谓,position base的一个方法,那么首先我们先这个搞清楚,这方法干什么的呢,这方法是要去通过模拟这个呃,形成这个整个一个水的体积的这些小球。
它们的位置来模拟整个水,或者说浪花他们的运动啊,它是这么回事,咱们一个个来分析,首先呢他认为整个一个水体是有很多的,不可压缩的钢铁小球组成的,好吧,没问题吧,大家可以从这个例子上都可以看得很清楚。
很多很多很多小球对吧,那么这些小球,只要我能精确的模拟出每个小球的运动,那我最后我就剩下来的就是渲染的问题了,对不对,那咱们之前说过这个事情呃,模拟和渲染这是两个分开的过程。
先去模拟模拟出来这些小球的位置之后,至于怎么把它变成一个物体的表面,然后怎么去渲染,用不同的物理模型,对这些就是就是渲染的事情了,那咱们就是说只要能模拟出不同的,这些小球的位置。
我就可以模拟出整个这个这个水或者浪,或者水面与他们的运动啊,这点知道就好,那么它这里有一个重要的假设是什么,假设呢,认为啊,这个水它在任何一个地方都是不可压缩的,什么叫不可压缩呢,就是说你原本有一个。
比如说1l的水在这里,然后你这个用各种各样不同力去压缩它嗯,这正常情况也是压不动对吧,然后当然你也不可能把一个1l的水,你给拉开,你把它拉开之后变成变成这个2l的水,这是不可能的对吧。
这所以呢这是一个基本假设,它的基本假设就是认为啊水不可压缩,也就是说在任何的这个时刻,这个水呢在任何一个位置,它的密度都应该是一样的,好吧,会有这么一个情况,那么他既然这么假设了。
那么就有了他这个所谓position base的方法,的一个基本的解决思路是什么呢,意思就是说给我任何一刻一个时刻,这些小球它们的分布的这个呃,呃这个这个位置,就像大家看到的这些。
这些水花飞溅的这些情况对吧,任何一个时刻,这些小球它们的分布我都可以知道,任何一个地方它的密度对不对,如果说有任何一个地方的密度变成,变成什么呢,变成和一开始平静的水,它任何一个时刻的密度不一样的情况。
没错吧,如果我认为这个水是不可压缩的,那么任何时刻它都它的密度,任何一个点,它的密度它肯定都得和之前是完全一样的,那如果他有了变化,就通过我移动这些小球,它们的位置,然后使得这个任何一个他的呃。
密度不正确的地方,它就是这么一个思路啊,所以说呃大家可以看到这个假设,是一个很重要的一个假设对吧,其实就是在模拟这些这些水花,他们这些一个个小球对吧,是d对吧,怎么样去运动,就是这么一个事情好。
你需要做什么对吧,你需要知道说我这个呃任何一个点,它的密度,它的密度对什么呢,它的密度对这个所有的这个小球,它们的位置,这一个梯度是多少,没问题吧,或者说导数是多少啊,没问题。
只是说梯度呢是这么这么个理解方式哈,就是说你看任何一个点呃,如果考虑说他周围有一圈啊,这些呃粒子都会影响它的密度,那么如果我移动任何一个粒子,是不是都让它的密度发生一定的改变,哎那这就是这个密度呃。
它对于这一个例子它的位置的导数,那我当然可以求这个密度,对所有其他粒子它的呃位置变化的导数,比如说我这个这个水体,这么这么一个位置哈,这么一个位置,它的密度对对什么呢,对这个小球它的位置的变化。
如果我求一个这个这个导数,我得出来的结果一定是零,因为这个点的这个它的位置变化,是不太可能影响到这么一个点对吧,是这么个意思,但是如果我考虑这个点它的密度,和它周围的一些这个紧邻着的一些。
这个呃小球他们的位置关系,那我就知道,如果周围的这些小球变化一下位置,你就很有可能会影响到它的密度,没有问题啊,就是说我们这样一分析就知道啊,任何一个点处,它的密度都是任何一个其他的这些小球。
它的位置的一个函数,那我当然可以求出,求出它的导数怎么做,咱们不用关心啊,就是说把这个求出来了之后,剩下来的是什么,咱们还记得怎么做吗,对吧,任何一个位置上,我要让它原本不正确的密度。
让它回到正确的密度上面去,并且我又知道我如何去调整,各个不同的小球的位置,使得它的密度,往我们要的这个方向上去变换,那么这是一个什么过程,这再好理解不过了,这就是gradient descent。
梯度下降了,没有任何问题啊,就是说呃,我想要我的目标,和某一个这个这个结果相似啊对吧,然后我就让我这个当前的这个状态,往这个最后我的那个目标方向上面去,怎么样通过调整我的输入。
然后让这个结果更和这个目标相似呢,那这个过程就是标标准准的gradient descent,就是这么一个意思好吧,那通过这个在任何一个局部,我去调整各个不同的点对吧,它的这个呃怎么说呢。
它的这个密度什么东西都都怎么样变化诶,我都可以保证说我这个水它它的密度是呃,始终在任何一个地方都是不变的,大家会发现这个中间并没有解,什么样的各种各样物理方程啊,或者什么东西对吧,没用的。
什么欧拉什么方法,这是一个不是基于物理的一种模拟,好吧,没有问题哈,就是说大家大家可以看到说任何一个时刻,我都知道如何这些小球应该如何运动,那我自然可以把这个过程重复进行,随着时间。
那我自然也可以模拟出这么一些效果了,对吧,是这么个意思好,那具体的呢咱们就不再多说了哈,诶这个会会哈,然后就是说嗯会出现一个一个情况,就是你一直让它这个运动运动运动运动,最后他这个水呢它从左到右。
再从再到左再到右,一直停不下来,会有这种情况,然后然后呢,但是另外一点我们说的事情,就是说关于这个所谓position base,它本身就不是基于物理的对吧,然后首先它应该会有能量损失。
如果他有能量损失,他最后会停下来,但是另外一点是,你也可以人为的给它加入些能量损失,让他让他在这个更改这些过程中,然后还会考虑到能量衰减,这是可以的,没有问题啊,就是说实际的过程中,人们会采用这个。
肯定会比这个稍微复杂一些的办法,然后让这个模拟最后会停下来,没问题,好好没问题啊,那咱们现在呢我们说了这个呃,怎么样去改各个不同的这些点,他们的位置,对不对,那么我们既然提到这个概念。
我们现在就给大家来说一说,在物理模拟中模拟这种大规模的这些物质,这个过程中用到的两个基本不同思路,咱们刚才已经见到了模拟水,它是怎么模拟的呢,他认为水是由各种各样圆形的,小水滴组成的。
然后这些小水滴我挨个模拟,我总共得到的结果就是对了的,没问题啊,这种方法我们管它叫拉格朗日方法啊,然后呢俗称叫质点法,怎么理解呢,比如说你要模拟一群小鸟的移动哈,然后你就盯着每一只哎。
比如说这只黑色的这个香蕉,然后他在什么时候应该在什么地方,我把每一只都正确模拟了,那就没问题了,就是这么回事,当然我要考虑他们之间相互作用啊,这也没有关系,那这就是所谓拉格朗日方法,它是如何去分析。
我们对于一大堆这个物体怎么样考虑,那么另外一种方法叫做欧拉方法,那么欧拉方法,这和我们刚才说的那个欧拉方法,去解那个这个数数值的这个呃常微分方程,这不是一回事啊,就是说这里欧拉方法是指什么呢。
是指说我如何去看待,我模拟这么一系列大规模的这些这些物体,怎么做呢,我把这个整个空间,我把它分成各种各样不同网格,然后呢我不管你网格里面的东西,这个是出去了还是进来了啊。
我就考虑说我这一个网格随着不同的时间,比如比如时间它应该是如何变化,就是这个意思,那以还是以这个为例,假如说我把这个空间切成这样的,横着的一条一条这样格啊,那么我我知道哦。
在时间t它应该是显示这个黑色的鸟,那么在时间t减一,它应该是显示这个蓝色的鸟,当然这幅图我始终觉得有点怀疑哈,从这个鸟的朝向上来看,这里应该是t加一,你你能看到的时间,对不对。
也就是说在t t加一的时刻,你应该能看到这个蓝色的鸟飞到了这里,就是你盯着盯着看的是什么,盯着看的是某一个固定空间,那么在上一个时刻,应该是这个橙色的鸟出现在这么一个呃,小的空间里面这么一个事情。
对不对,那也就是说这是考虑所谓网格法,咱们想象一下,如果要对这个流体做模拟,那它就会把空间拆成各种各样不同网格,然后网格里面这些,他们他们本身每一个格子的密度,应当如何去变化,是这么个意思对吧。
然后他盯着格子来看,而不是盯着这个物体来看,那很好理解啊,就是中文我觉得会比这些呃,这个拉格朗日和这个欧拉啊,这个更好理解一些所谓质点法和网格法啊,那么呃这里呢呃其他不同的翻译,有的管它叫做所谓。
欧拉视角和拉格朗日视角啊,怎么样看待这么一个呃,不同的这个模拟方法啊,然后呢呃不管怎么样,两种方法都是有人用的,并且在最近,然后有人把这两种方法给结合在了一块儿,确切来说这个方法很早就出现了呃。
就是所谓一种hybrid,这种方法就是混合型方法,就是说我考虑欧拉方法,我又考虑这个呃拉格朗日方法,那就是说这两个两个我都去看待,怎么样做呢,就是这样哈,就首先我认为我认为这些不同的粒子。
其实它都具有某些材质属性,比如大家看到这个,这个在烘烤的一个兔子哈,那兔子肯定这个上面,它它里面有各种各样的粒子对吧,这些粒子本身肯定得有粘性对吧,它肯定得有密度,它肯定不是质量对吧。
有各种各样不同的这些属性哎,都存在点上,然后呢我去模拟它,去这个这怎么样去融化啊,这些过程就这些过程我把它在格子里面做,我考虑不同的这些格子,然后呢我算出来了之后,我是不是还这个信息都记录在格子上。
我再把这些格子里的信息写回他们,不同的例子上面去,是这么一个意思啊,就是说他们是把这两个不同的视角混合在,要考虑这种考虑的方法,就叫做material point method,叫材质点方法呃。
或者物质点方法啊,然后a m p m,然后这也是这个呃,整个模拟仿真领域,现在非常火热的一个话题啊,就是说怎么样能够尽快地模拟它,就是这么一个事情好,那么这里呢就是呃简单说一下。
我们看待这个模拟的各种各样呃,不同的方法,那么到此为止呢呃就可以恭喜大家了。
咱们的这门课今天就算圆满结束啊,总共22节课,然后讲了11周啊,将近三个月了对吧,然后感谢大家这个一路支持啊,然后咱们可以看看我们学到了这些东西,对吧啊,然后这四块之前在我们课程中频繁的出现,对吧。
然后现在终于这个没有一块是嗯,加粗的写法了啊,都已经学完了,没问题,到此为止,可以放心的跟大家说啊,咱们这个呃课程啊,就算是这个呃圆满结束啊,非常好,我觉得啊,至少咱们把这些现代化的这些题目。
基本都已经说到了,然后呢,现在图形学中的各种各样的一些发展,基本上也都覆盖进去了,以及说我们也讲到了各种各样的实现的,这个具体的细节对吧,然后背后怎么样去理解各种各样的东西,如果返回头来。
这个大家再去回答这么一个问题对吧,之前有同学问问说,这节课会不会教open解对吧,咱们一直说啊不讲,然后为什么呢,因为你学了光栅化这块之后,你自己可以手写一个软件的光栅化渲染器,而且你这个就算不手写。
直接去掌握open gl,现在在过去学,那就没有任何问题对吧,那就这么回事,所以说刚才有同学问,下面一步咱们应该怎么学呢,那关于这块哦,首先感谢大家哈,有同学反映哈哈哈哈,可以可以可以啊,非常好啊。
谢谢大家,不要谢我,我这个嗯应该的应该的啊,那么这么回事啊,实时渲染这一块儿,那大家现在是最好的时间去拿到real time,rendering这本书,然后呢。
在对照着这个任何的open gl的编程的东西,基本上来说自己就可以这个开始学下去了,肯定不会有任何问题,这中间各种各样变换什么背后的知识,我们说的一定会比这个各种各样,其他的这些使用欧问题啊。
呃这些参考书要难啊,然后如果大家想学这个不是open g,要学一些这个direct x,比如说大家想掌握说之后怎么样和这个,real time retracing结合在一块儿对吧。
dx 2怎么用或者volen,我怎么样搞这跨平台的东西对吧,都是没问题的,一切这些光栅化的东西都差不多,然后注意一下学业,学这个各种各样不同的所谓着色器,新的东西对吧,咱们讲过这个顶点和呃和和片段对吧。
然后这块呢肯定是直接就可以上手了,没问题,几何这块呢我不是专家,这块不能乱说,怎么说呢,就是几何这块东西还是挺多的,如果大家要学的话,肯定得有这个嗯背后呃深厚的数学基础,得去学呃。
微分几何以及离散微分几何啊,这些是肯定是必须要学的一些东西,然后以及数学上涉及到各种各样的拓扑,流行这些东西啊,肯定是要掌握的,那么呃如果大家还要学呃,这个啊光影传播的话,那这个没问题。
就是这块肯定还有各种各样的资源,我们马上要做广告,对不对,这块没什么问题,就是怎么说呢,从我的角度上来说,如果大家认识我对吧,呃在这门课之前,如果大家认识我,大家都知道关于rendering这块。
我是很有自信的,是没有问题的,这块我觉得能够给到足够的指导,没有问题哈,那么这块儿待会儿再说吧,啊光线传播,那么第四块呢呃模拟与仿真,那自然就涉及到咱们的电es,201这门课了,咱们的广告已经发出去了。
然后由我的这个学弟啊,胡彦明大婶啊,现在还是博士在读生啊,第3年,然后给大家来讲这个呃,呃关于模拟仿真这块最新的东西,用他自己写的太极,太极这个模拟仿真器以及渲染器,没问题啊。
这个呃我自己也非常期待哈哈,我很想看看这个呃,好吧啊,那没问题,然后呢,呃这里呢,我给大家再再继续多说一点什么呢,多说点广告啊,哈哈哈哈嗯行哈,就是我刚才其实简单的也提到了一些,这些事情啊。
那么咱们一个一个说啊,首先呢这个首先要要特别感谢这个games平台,嗯,这门课其实原本策划,我们跟跟跟大家说过对吧,聊过这个事情,原本呢根本没想到会有疫情,这么一个事情哈,然后呃是指差不多。
去年12月份开始策划这个事情,然后呃因为疫情的原因,然后咱们把这门课给点提早了一些,变成2月份,然后呢这个特别感谢这个games平台,然后这是这琉璃刚老师,这个呃呃为了这个国内的途径学发展了。
然后这个呃也是付出了呃非常多的心血啊,我觉得如果我能够贡献在这个课,这个怎么说呢,就是games的这个课程这块里面啊,我自己也非常开心啊,没问题嗯,然后呢games啊,首先这个缩写大家都见过吧对吧。
它是这个图形学与混合建设研讨会,这个缩写其实和games没关系,不过咱们说的这些东西呢,当然可以应用在游戏里面对吧,没什么问题啊,然后呢嗯大家肯定知道这games每次都会组织。
每个星期都会组织这个非常呃高质量的呃,各种各样的学术报告,然后大家有兴趣的话,都会对这个这也没事过去听一听,肯定会有所收获啊,然后呢呃今年这是咱们的games 101,是第一门这个在线课程啊,非常好。
我觉得大家既然喜欢对吧,那咱们之后就可以继续,再多做一些各种各样的优质的课程,然后给大家这样的话呢,喜欢图形学,那肯定就能够找到这个对应的这些资源,那非常好,然后所有的视频ppt,这都可以。
当然大家都知道对吧,嗯没问题,那么以后这个肯定可以发展的更好啊,然后这是各种各样的,这个这是加微信群的方法,如果大家现在还不在的话,我自己是在第六群里面,可想而知对吧,现在还是很火热的啊。
非常好啊非常好,那么这是一第二呢,在这个games平台之后啊,电子平台之后我们再介绍两个事情,两个学术会议都是在国内进行的,然后这两个会议呢第一个叫做china graph。
2020是这国内的图形学的会议,然后呢,嗯今年如果没有这个之后的这个,这个更严重的疫情出现哈,那咱们暂定这个会议日期是在,10月23~25号在厦门大学进行,然后这个这个会呢正好也邀请了你。
到了我和胡彦明啊,这到时候再会再混上啊,还会给大家说一说,关于这个呃渲染和这个呃模拟仿真,这两块呃的这个怎么说呢,怎么样去进入这个科研这么一个话题啊,做这个会前课程,然后大家又看到几何方面的大牛。
和各种各种这个嗯,嗯反正这个肯定大家会呃,这参会肯定会有所收获啊,做做广告,以及咱们的两位特邀的嘉宾给大家做报告,所以说应该会是一个非常质量,非常高的图形学的大会啊,好那没问题啊。
这是关于china graph,同样道理啊,同样道理啊,我们还有这个china v2 这么一个会啊,这china v2 呢嗯嗯大家看到v2 对吧,虚拟现实大会,然后那同样道理。
也会有各种各样的这个高质量的会见课程,然后如果大家有兴趣的话,这个一定要参加啊,没问题好啊,那这里就是关于咱们的这两个呃会议,这么一个简单的介绍啊,然后啊是这么回事,我简单多说一句哈。
就是说不知道大家对这个参会这个事情,理解是不是怎么说呢,感觉有点遥远,如果大家还都是本科生的话,我相信啊,主要是咱们的主要听众应该是本科的同学,对吧,嗯没有任何问题,我觉得是这样哈。
就是参会本身一定会让你这个呃,就是体会非常多,比如说我自己,我自己,其实我本科的时候没有参加过会议哈,然后我到了这个博士阶段,然后开始参加各种各样的学术会议,然后见到各种各样的大牛。
然后这个之前就听说过名字的,但是实际实际生活中没有见过的,然后都可以接触接触,然后和各种各样的这个朋友们在一块儿,听一听报告对吧,然后记录一些这个自己的一些想法,然后再和这个演讲的人讨论讨论。
非常非常开心的一件事,然后呢我也有学生在做这个,比如说cigaret啊,这些会议的这个志愿者,然后当志愿者本身也可以,当这个是一个非常不错的经历,认识一些朋友们,然后以及呢。
也可以顺便利用这个志愿者身份对吧,去这个这个听一听这个各种各样的呃,会议内容,这是非常不错的事情,总之呢开会是一个非常愉快的事情,可以认识很多人,然后呢可以学到很多不同的东西。
然后就算是你听一个和你完全不相干的,一个报告对吧,你觉得我比如说我的领域,我做rendering,然后呢我过去听什么,我听这个呃微分几何的这个前沿进展,我仍然会觉得非常有趣,听不懂归听不懂,对不对。
然后有时候呢可能在各种不同的这个呃,不同领域的人看待,可能看到同一个问题的视角也完全不一样,然后可以了解一下大家,这个对一个同一个问题的,这种不同的分析方法,或者什么样的这个呃演讲呢。
我也可以在中间学到不少东西,所以参会这个事情,永远不是说说自己说一定得有些论文啊,然后过去去讲一讲啊,这个这个事情啊,就是说呃肯定会嗯是一个不错的收获,我这么觉得,所以我非常鼓励各位同学呢。
以各种各样不同的身份参与到这些呃,不同的这些学术会议,重点一定可以让你的这个这怎么说呢,学术生涯吧这么说有一个很好的起步啊,这么回事好,那么ok这就是这个事情啊,听不懂没关系啊,真没关系好。
那咱们现在进入到这个话题哈,我我这个好好给我师弟这个也宣传宣传啊,就是呃胡彦明大神mit的,然后呢,呃这个他在本科期间就已经是自己动手,实现了50余片哥cigarette paper啊。
大家可想而知这种这种功力对吧,然后呢他自己实现了一个这个可微分的,可编程的呃太极编程语言啊,然后这个编程语言呢,呃也就是咱们下一节课提高课games,201要给大家讲的东西。
去做各种各样的呃物理模拟仿真,好吧啊,这个没有问题,然后呢这里多说一句哈,关于这个课号的事情,这个课号呢是按照国外的这个编排标准来,正常情况下以一开头表示基础课,以二开头表示提高课啊,没问题。
是这么个安排方法,然后后面的这个数字呢就从一开始编啊,这么个意思好啊,没问题,总之就是说啊这个唉对吧,这是反正时间充足啊,给大家多说一句吧,大家听说过这个,这两天闹得沸沸扬扬的这个事情。
叫什么雷课堂的事情对吧,哈哈哈哈,是这么回事,我觉得胡彦明写了出来啊,哈哈哈哈。
这个水平明白了吧,嗯好啊,没问题,这门课大家可以看到,是让自己手动写一个物理引擎啊,然后呢适合人群,不管你是什么样的基础,所以我自己我也非常期待作为这个嗯,我我我是这个属于研究方向相对单一的呃。
比如说我做的就是渲染这一块,希望能够专精这一块,然后呢啊然后对于这个模拟仿真这块,我自己也非常期待能够听这门课啊,是这个意思,所以啊非常好,然后如果你是这个上了咱们的这个games,101。
然后再上这门课,那肯定更没有任何问题对吧,然后只要你会任何一种编程语言,就差不多啊,课程是这样的,从六一开始啊,从六一开始,然后啊,也就是说中间有差不多一个月时间啊,休息休息,也算是把咱们这门课。
这个大作业做一做对吧,然后呢呃六一开始开十节课,每周一节啊,比咱们这个嗯要没那么频繁啊,每周一节,然后呢呃呵呵呵呵,嗯,这个嗯大家可以自己去看这些课程内容哈,基本上来说覆盖了各个方面。
从这个各种各样不同的模拟对吧,各种各样不同的模拟方法,几种不同的视角,怎么样去这个做各种各样的优化方法对吧,各种各样的呃内容都会在其中覆盖到,还会说你模拟出来之后,如何用太极模拟器直接把它给渲染出来。
对不对,这个非常好,然后所以说呢,大家通过这门课,肯定可以学到非常不错的东西啊,这个呃非常好啊,呃大家这个呃都很期待啊,那咱们呃六一不见不散啊。
真的是同学啊,好,那么这里呢,我在利用这个机会给自己做做广告啊,怎么说呢,就是说有同学反映说我在rendering这块,如果想要继续把它学下去,呃,应该学些什么呢,呃首先是这样哈。
我自己这边啊有一门课叫做呃,叫做实时高质量渲染啊,然后这些基本上就是在说这个工业界,现在用到了各种各样实时的技术里面,然后最新的一些东西大家都是怎么做的啊,然后这是一个好,那么大家可以看到这个课呢。
咱们这这这门课呃提到,但是没有说怎么做对吧,这个辐射传输是什么意思呢,就是说我可以把这些各种各样的计算呃,有一些复杂计算拿到这个渲染之前去做,然后之后渲染的时候,我就可以使用轻量级的计算。
就可以得到非常好的效果啊,然后呃基于图像的渲染,就给你一张图,咱们之前见过了,已经对于这个环境光对吧,然后这个是呃怎么样去渲染,这是一个事情啊,然后以及说我怎么样实现嗯,比如说在呃游戏中实现这种水面。
反射出了天空这种概念啊,这些都是基于图像的渲染方法,然后还有一些呃非正式感的图形渲染这块,比如说像塞尔达,大家打这个塞尔达旷野之息啊,这块就就是大家看到画面,基本上来说是卡通的。
但是这种卡通的东西怎么做对吧,咱们之前最早第一节课还跟大家说了,一些关于无主之地的事情对吧,关于卡通渲染这块是怎么回事对吧,然后嗯以及说这个实时的,或者说交互性的这个全局光照。
咱们知道自己现在实现过这个作业期了,对吧,知道全局光照多慢了对吧,那如何把这个过程给做到实时呢,对吧啊,而确实就有一些人就可以把它做到事实,那么这个中间是怎么样做的对吧,这都是要给大家提了一些事情。
然后呢嗯呃关于最新的一些进展也会提到,比如说这个实时光线追踪这块我挺熟的,然后关于这个呃,d l s s,超采样,对吧啊,这没有问题,那么嗯这里我们来看看啊,实时渲染是这么回事啊,我现在先说一下。
是我现在在这个在在国外,也就是在我这边啊,3a8 不开的课,然后这个课呢已经是第二次开,我希望再把它做好,然后呢呃之后呃会以中文的形式呃,我在和这个刘利刚老师商量。
然后看看咱们什么时候再拿到games里面来播,好吧,这是这个事情嗯,总之就是说呃应该是没问题,应该到时候会给大家播出来啊,这样搞啊,然后这门课呢我到时候也可以考虑,请到一些大神。
比如说大家知道这个我师弟,刘师兄做的这个啊d o s s啊对吧,然后可以请他过来给大家说一说,各种各样的东西都没有问题好吧,就是以一种研讨会,研讨会行使,每次说一个专题,这样来说,好吧啊,那没问题。
那这样哎对,大家是不是反映,这个是不是反映出来一个问题,是不是我有很多大牛师弟们,对不哈,哈哈哈,这个非常好啊,可以啊,这当然了,从另外一个角度反映了,我这个带头作用带的还不错啊,这个意思啊。
就是自夸一点。
自夸一斤啊好,那么另外一方面呢,肯定不只是实时渲染这一块对吧,离线渲染这块其实要求的功率更高,那就是说你要真正能够写对各种各样的,所谓呃复杂的光线传播方法,咱们之前在那个课上呃,这个就是说咱们有一节课。
在讲完材质之后对吧,给大家说了一下,各种各样的最新的一些进展,对吧啊,然后呃呃这一块呢在另外一门课,就是高级的图像合成这个这块里面,来来给大家说所谓这个合成嘛对吧,就是基本上来说。
就是通过渲染的方法来生成这个意思啊,然后如果可能的话,其实我在想这门课,我在想,要不要加入一些关于这个,更先进的一些东西,emerging technology,就是说各种其他东西怎么样怎么样。
用在这个渲染里面的,比如说呃大家可能听说过虚拟现实上面,现在大家在用这个叫做for viated rendering,就是说人眼看到的可视角度挺大的,但是人眼盯着看的这些区域其实挺小的。
那就意味着说我只用把大量的资源投入,盯着看的这些清晰的区域,在其他的这些区域,或者就或者说清晰的区域之外,这些地方我就可以投入更少的计算资源,对不对,这块对渲染来说有什么好处呢。
然后就是说在这块又引出了什么样的新的,渲染问题呢,对不对,一块都是我们要思考的一些问题对吧,作为这些最新的这些呃这些科技对吧,我们如何把它应用在渲染里面,也是我在思考,可能要这个可以加入这个。
关于这个这个高级的这个呃,课程中间的一个一个一个事情啊,好吧,就是说进入呃渲染的科研的一个呃,非常好的一条路了,就是说如果有这么一门课的话,那呃这个课呢,我之后也会在继续想办法和呃。
和这个games这边嗯讨论一下,然后看看什么时候咱们把它安排出来好吧,那这么一个事情,那么在这里呢,这也给大家呃显示一下我个人啊,对于整个一个rendering领域的这么一个把握,我是这么理解的。
就是说每一个领域嘛,都会有一个嗯怎么说呢,叫做gold standard,就是黄金准则,这么说啊,比如说咱们说这个信号处理,大家就说这个嗯这个耐quest sampling,就耐克斯的采样率对吧。
这块是一个非常非常重要的一个概念,比如说网络,然后这肯定会提到呃,这个三次握手,这是一个非常非常重要的概念对吧,那在rendering里面,那咱们就说rendering equation。
咱们之前老早就跟大家说了对吧,这个最重要最重要的概念,那么我自己呢其实是有一个版本的,这个版本呢在说什么事情,大家可以看到什么呢,就是说我们渲染最终要达到一个,什么样的目标对吧,咱们把这个事情搞清楚。
那渲染自然而然最后要达到目标很简单,中文说以假乱真,没错吧,我希望我生成的东西是无限真实的,那就是说我们希望的所谓ultimate realism对吧,然后这里呢这个大家可以看到,也就是说啊,做渲染。
其实来说最终的目标就是所谓无限阅读,对不对,然后如果可以发动了这个之后啊,大家可以想象所有东西都是虚拟的吧,假的吧,那肯定是通过这个渲染的方法来做吧对吧,然后人们生活在这个环境中。
却不知道这个看到的东西是假的,这是一种什么样的境界,对不对,这样想哈哈哈哈行,那这是最终的目标,怎么达到呢,那大家可以想的啊,这边稍微挡住一点啊,就是说实时和离线的渲染,这块肯定是要是要这个了解对吧。
就是说关于实时和和这个离线,现在都能做到一种什么样的地步,然后呢,我们这相当于是在解已知的一些问题,比如说全局光照不知道怎么做,那么对于未知的问题,就是咱们之前也在课上提到的,说我对于这个动物毛发呀。
我不太了解,是他和光线怎么做,所以我做出来东西不真实,那对于这块这个研究,就叫做所谓appearance modeling对吧,这个材质的建模的外观的建模,然后呢这块就是已知的和未知的。
咱们研究出来之后,下面一步就要成下成像,还会有什么样的挑战,什么呢,比如说咱们在现在的这个显示器上来说,并没有什么太大问题对吧,那咱们说如果考虑到v2 a2 这块,头戴式设备,那要成像两个眼镜。
两个眼睛,并且都是90帧,那这个计算量是不是一个问题,对不对,然后以及说呢,这个整个一个这个头戴设备啊,不同的领域对他的理解是不一样的,对我来说,我就认为它就是成像设备。
他这个呃会对这个整个的渲染的输出,会有这这个不小的挑战性对吧,这块需要考虑以及什么呢,不只是这些,对不对,这些东西本身既然是要成像,那肯定背后需要用到这些呃。
整个rendering这个领域需要做到的一些知识,对不对,那么以及说这个时下的一些热门的,这些话题,这些能不能够被用到来这个研究,整个一个这个这个渲染的这么一个过程中,对吧。
把这些所有的东西都给考虑在一块,那就是最后咱们能达到的这个所谓这个啊,无限阅读的这么一个最后的境界哈,那当然这是一个很理想的情况,但是这是属于我毕生追求啊,我希望能够把这个,这个真正能够给做出来啊。
当然不容易对吧行吧,那不管怎么样,咱们说到这个哈哈嗯,关于这个科研这块啊,不管怎么样,再做一个广告吧,我就这个利用一下,好歹我也上了这个20多节课对吧,然后做个广告啊,不许不许说我什么,这怎么说呢。
就是说啊如果你对渲染的科研有兴趣,那我觉得非常好,然后呢我这里给自己做一个广告,那对于这样p p t我就一点也不谦虚了哈,就是说我来说一下这个事情,首先呢可能有部分同学认识我,是因为这门课对吧。
但其实来说对于这个领域认识,我并不是因为任何课,而是因为科研,在科研这方面呢,我做的还是唉还是不错的啊,这么说,然后我个人的一个成就呢,之前其实我感觉这个不只是在那个呃,咱们的课程上说这个事情啊。
就是说呃另外还有一点就是嗯,其实在渲染领域,我自己是保持着一个世界纪录的啊,当然这个记录不然不完全统计哈,就是啊先说清楚渲染的科研领域啊,然后我在博士期间,然后我发出了欺骗第一作者的siggraph。
论文啊,然后这个应该是目前目前还无人打破哈,呃这个整个渲染领域哈,然后嗯所以说这个叫什么,我的同学们拿这张卡牌来描述我啊,哈哈哈哈哈啊对,其实我认为这门课上也给大家说过,炉石的事情哈。
就是说我自己也是这个很喜欢打炉石,很很久之前,然后我们之前在berkeley的时候呢,我们我们有一个三人的小队,参加过一个叫做test part的一个竞赛,炉石的比赛,我们还打打进了季后赛,可惜啊。
后来被淘汰掉了啊,然后但是还不错哦,那个时代如果大家打过炉石的话,会知道哈,呃我给大家说一下我的卡组,大家就知道了,叫奴隶战啊,这个应该知道那个时代,这个是是是什么情况啊,ok行吧。
然后就是说咱们再回到这个话题上来啊,这个是保持者啊,然后呃这样呢,我有一个学弟,然后他这么描述,我叫令吉言,first of his name。
the unrejected author of seven papers,breaker of the record and the chicken eater,怎么样。
然后这个呃如果大家看这个前列的游戏好,大家就知道这个是在描述谁对吧,然后是用那个用那个句式来写的好的嗯,当然了,这里算是自夸一下啊,就是说呃不管怎么样,rendering领域我还是这个还是不错的啊。
所以说我非常希望如果大家有兴趣啊,并且这个能够在running领域做的比较好的话,如果有兴趣加入我的这个组,那我会非常欢迎啊,然后加入我的组,打破我的记录,成为新的传说,传说中的三人啊。
哈哈哈哈哈哈呃行吧行吧行吧,没问题啊,那呃行,那这样的话咱们这就呃到此为止。
广告也就差不多了啊,那么这里最后需要好好感谢一下这个呃,所有的同学们啊,然后咱们这个呃这个叫什么来着,大家看啊,我会回来的,当然大家也可能会意识到另外一个问题,用这个头像反映了家庭地位啊。
这是没有问题的啊,然后如果说之后大家有什么问题啊,这个呃欢迎来信和我交流啊,然后还可以怎么说呢,这个呃就是说关于这个课啊,还希望大家踊跃的在论坛上去发问,然后咱们这个一直到这个课程最后结束。
然后还记得啊,记得及时去提交呃,那个叫什么来着,那个申请,就是就是就是给大家发这个证书的,这个申请啊,呃作为一次作业,别忘了这个事儿啊,好啊,那没问题,那既然说我会会回来的行,那之后啊跟大家保证之后。
什么时候啊,再会回来之后再给大家开其他的课啊,没问题,好哈哈哈哈哈哈,哎行啊,那没问题,那咱们就到这儿吧,啊啊好嘞。
GAMES101-现代计算机图形学入门-闫令琪 - P23:番外:纪念16万观看 - GAMES-Webinar - BV1X7411F744
哈喽大家好,各位亲爱的同学们,我们又见面了,哈哈哈哈,今天是2020年7月8号对吧,呃然后呢,今天给大家带来一期番外,为什么呢,是因为咱们的game 101啊,今天突破了16万观看人次啊,16万啊。
我想都不敢想,这是感谢大家的一路支持对吧,这么整的一个数字,然后咱们不庆祝一下,可惜了,对不对,啊是这么回事,我本来是想喝红酒的,家里面没有了,我就拿快乐水顶一下啊,这个意思意思到了啊。
这个呢我今天下午录了段视频啊,给大家献丑了啊,然后哦大家记得元素观看啊,这就开始,嗯,嘿嘿嘿嘿诶后面没了哈,这个付费dlc啊,嗯行啊,什么水平,实事求是来说啊,这刚出新手村。
完全谈不上什么专业或者什么对吧,大家知道我专业是计算机图形学,对不对,哈哈哈,没有就跟大家开心一下啊,没什么问题啊,那我说几个事啊,一个是嗯咱们的games 101,现在已经这个顺利结课对吧。
然后大家应该各自已经收收到了,这个成绩通知,然后如果大家成绩通过的话,现在是提交结业证书申请的时候啊,嗯好的,那么有同学会问嗯,这个如果这次错过了,电子101的课和作业怎么办对吧,说我一直在b站上学习。
然后嗯就没没来得及,按照这个官方渠道去提交嘛,那怎么办呢,呃我们之后啊会重新去继续开放game,901这门课,然后呃定期的,然后会开放这个作业提交的通道,所以说大家之后可以补没有问题。
还请大家多多关注这个,咱们的games平台的网站,然后和微信群好吧,然后呢,我个人这边呃有一门实时渲染的新课,正在积极筹备中啊,应该很快可以和大家见面,哈哈哈哈行啊,那么啊就到这吧,那这次就到这儿。
下次如果再赶上一个什么数字的话啊,然后到时候再给大,家出三问啊,感谢大家的一路支持啊。
GAMES101-现代计算机图形学入门-闫令琪 - P3:Lecture 03 Transformation - GAMES-Webinar - BV1X7411F744
感谢大家一如既往的支持,咱们今天是这个games 101这个现代计算机图形学的第三节课,然后咱们从这节课开始要花个几节课的时间呢,给大家讲变换,那么咱咱们这个立刻就开始,然后这节课的最开始呢。
首先给大家说两个事情,一个是作业零,作业零很快就要放出来了,然后我们这个和这个这个助教们这这段时间这个好好讨论一下,看什么时候把它给这个做好,然后给大家很快啊很快。
然后这个啊因为有一些同学反映说怎么注册这个作业,提交系统不能不能注册,那是因为你用,了qq邮邮箱啊,然后我们这个系统它自动过滤这个qq邮箱不允许用,所以说注册的时候大家可以用一些别的什么其他的邮箱。
好吧啊,就是这么两个事情,那咱们这个今天的正式课程,然后大家普遍反映啊,上节课的内容相对简单啊,没问题,上节课确实简单啊,这个我们提到了一个向量向量的这个定义,基本操作加成特别提到乘呢有两种。
一种叫做点乘,然后点成呃,在很多情况下被用来做这个嗯,判断前和后,根据它编程出来的结果是正是负来决定对,吧,然后我们又讨论了另外一个叫做插成cross product。
然后呢这个这个插成呢两个向量的叉乘得出来的或者叫叉g啊,得出来的是一个新的向量,然后这个向量根据它的朝向,我们可以判断两个向量的相对左右关系,那么上节课我们主要说的就是这个内容。
然后我们提到了一点点关于这个呃矩阵的一些这个这个计算,以及这些呃向量和矩阵在图形学中的应用好那这就是上节课的内容,咱们为什么要这个花时间说这些呢,是因为这一系列都是这个之后要提的变换的基础。
那么这一次我,们就主要来说变化,然后今天大家可以看到我们要着重说下面几个内容,首先提到说我们为什么要变换,也就是说这个变换到底它是在干什么对吧,然后这个我们会提到几种这个呃比较常见的二维空间中的变换。
特别是旋转缩放以及切片,然后我们会给大家介绍这个嗯,其次坐标的概念,以及说我们为什么要用它,然后最后我们会提到说怎么把各种各样不同的变换给组合在一块,形成新的变化,如果有时间。
咱们今天开始说一些这个三维的变换,然后给之后的课留一点这个这个这,个充足的时间,但是够呛啊,咱们尽量那么嗯今天咱们就先从第一个话题开始说,首先大家可以看到变换,这里呢我提到两两个这个呃不同类型的变换。
一个叫做model,一个叫做viewing,咱们暂且把它的一个叫做这个模型变换,一个叫做视图变换。
然后这个是什么意思呢,大家可以看到啊,就是说这个呃动画咱们在上一节这个啊课里面已经提到过了,大家可能看到这个这个动画,然后这个动画主要在说明什么呢,这是一个静态场景,没问题,但是呢摄像机在移动,而且他。
在以一个这个这个平滑的一个曲线这样一种移动方式。
沿着这么一个曲线移动,然后大家可以看到一个平滑的过渡的动画,所以说这个首先呢这个描述这个这个这个这个摄像机的运动啊,这里当然是变换了一个非常重大的应用,然后这里大家会看到一个另外一个例子哈。
然后这是一个跳舞的机器人,然后大家可以看到这个机器人呢他这个各处关节都是可以移动的,然后它这个可以形成一个呃这个某一种舞蹈对吧,大家可以看到这个,头现在也可以移动,然后各处关节也可以移动。
然后这里多给大家介绍一点关于这块这块涉及到这个计算机动画之后,要给大家介绍的这块知识,就是说还有一种运动啊,比如说你拿着这个机器人的手,然后往空中这个某一个地方这么一放。
然后你问那么在这个如果这个手的这个指尖停在这个地方,那么它的这个关节应该怎么样去弯曲,才能使得他这个手被移动到这里来,这里就是之后要给大家介绍的逆运动学方向的知识啊。
然后就是说这里呢当然就是给大家举一个例子啊,就,是说变换啊,同样可以表示各种各样复杂的旋转,以及他们之间这个互相错综复杂的这个呃联系在一起之后,形成了这种复杂的变换。
然后呢这一个例子大家应该都见过对吧,看过皮克斯的动画,大家都知道这个这个皮,这个皮克萨他们这个做的一个这个这个经典的开场就是一个台灯,然后这跳来跳去,然后跳在这个i这个字母上面。
然后大家着重可以看一下啊,这个这个癌,然后这个会被这个压扁对吧,然后压扁过程中变胖,然后最终完全被压扁,然后也就是,说变化还可以表示各种各样的这种这种这个呃缩放,这样111系列的呃动画。
就是说啊很多动画都是由各种各样不同的变化,然后合成在一块儿的,那么不只是动画,要给大家介绍的这个这个如何成像,就是说光栅化成像这么一套方法里面也是大量涉及到变换,特别是这里大家可以先看左边这个例子啊。
左边这是什么呢,是一个人坐在一个屋子里面,然后他在看这个一个窗户外面,我确切说是往窗户这个方向看,然后呢会看到一部分这个,然后他会看到什么呢,他在这个三维空间中往这个方向看。
它会看到右边这样一个二维的这个图呃,也就是说如果我在在人这个人眼这个地方放一个照相机,往这个他看的方向这么一摆,然后这个拍一张这个这个照片出来,然后它就会变成这个二维的平面上的东西。
那么大家想这个中间啊发生了什么事情对吧,原本这个世界是三维的,然后你拍了一张图之后呢,把它给变成二维的,因为存在平面上了,嘛对吧,然后这个从三维到二维,我们管它叫做投影。
然后这个投影也是一种非常非常重要的变化,这就是之后要给大家这个介绍的,然后这么几节课呢给大家讲变化,正是为了做这样一步,从三维世界到二维平面这么一个投影变换,这么一个铺垫好吧。
那这就是这个这几节课的逻辑,那么大家看到啊,这个变换不仅在动画或者成像,在这个各方面都得到广泛的应用,那咱们这个可以继续,那么呃我们从什么开始呢,我们先说一说这个二维的变换,那,么二维的变换。
这个最主要的就是说我们要把这个矩阵和变换联系起来,那这个咱们这就开始好吧,比如说啊这个呃首先我们提到一个缩放变换,什么叫缩放变换呢,大家来看这两个例子啊,从左边这张图。
然后假如说我看到的是一个这个方块的这个这这这张图啊,它的左下角放在这个世界这个的这个原点,也就是零零这么一个二维的平面的原点,然后呢我们要把这张图做一个缩放,我们要把它给变小对吧,这个大家这个很常见。
大家在这个adobe photoshop里面经常会做到这种这个图像的缩,放啊或者什么这些缩放就是一种变换,没有问题,那么对于这个例子来说,就是说啊横轴和纵轴都缩放了0。5,也就是都变为原来的1/2。
那么这个写成数学形式是什么呢,就是说啊如果我们认为一开始任何一个点的坐标是x y,然后呢经过这么一个呃呃缩放操作之后,它就变成了一个x撇和y撇,然后这个应该念作x prime和y prime啊。
然后呃如果我们把它写成数学形式,那就是x prime是x乘以x,那y也是同样操作,那么在这里s呢大家可以看到就是0。5,那么我们之前学过这,个矩阵了,对不对,那么对于这两个式子。
咱们可以把它写成一个矩阵形式呃,那就写成这么一个矩阵的形式,大家可以看到啊,是一个这个一个对角阵,这个s00 s然后乘以x y,那乘以出来的结果呢就是x prime和y prime,那那是不是这样呢。
咱们可以验证一下,比如说大家可以看到这里矩阵这个大小是多少啊,这个矩阵大小是2x2对吧,xy呢是大小是2x1,那得出来的结果就是2x1没有问题,所以说x y变成x prime和y prime。
然后那咱们看看比如说x prime等于什么呢,那咱们会发现它是,二乘以矩阵的第一行,第一列,还记得咱们上节课给大家介绍的,对不对,就是说取这个第一个矩阵的第一行,然后再取第二个矩阵的第一列。
也就是s0 啊,点成xy,那么得到的结果就是s x呃,那就发现x prime就是s x,那是对的,没有问题,y同样也可以这么验证,那就是说我们可以把刚才两个式子给写成这么一个矩阵形式。
那么这里我们就管这个对角阵s00 s叫做这个呃缩放矩阵,在这里,如果你让i s等于0。5,那么它这个就对应着这么一个,把这张图和横轴和纵轴都各缩小一,半这么一个变化。
那么这是这个这个缩放的矩阵比较简单啊,然后呢大家可以想到,假如说呢这个x和y方向它这个缩放的各不相同,比如说大家看到这个例子,这里呢x方向缩放的这个是一个按照0。5的比例缩放的。
然后y轴呢这个y坐标根本没有变化对吧,就比如说咱们可以看到这个在左上角,这个这个这个角大家应该可以看到我鼠标鼠标对吧,然后这个角现在仍然对应这个角,那么右上角仍然对应右上角,你会发现他们的纵坐标没有。
变哈x的坐标也就是横坐标缩小了0。5,不过没有关系,我们仍然可以写成这么一个这个对角阵形式,只要让这个s x和xy不相同就可以了,那么这里s x应该对应0。5,这里x y应该对应一,就是应该是这样的好。
那么呃这里是关于这个缩放也很简单,然后呢咱们提到另外一种啊,其实上节课给大家提到过这个事情,对不对,这里给大家做一个反射的操作,什么是反射呢,这个或者说对称的操作啊,就是说大,家看到左边这张图。
它其实这张图相对于y轴,如果经过一个反转,就可以得到这个呃这个右边这张图,那么相对于y轴做一个反转,那么表示成数学形式是什么呢,那就是说原本给你一个x对吧,然后反映在新的图上,它会变成负x。
也就是它告诉你新的坐标x prime应该等于负x对吧,那么y坐标同样没有变,对于任何一个点,咱们看这个呃,右上角对吧,右上角现在这个经过翻转之后变成了左上角,但是它们的高度都是一样的。
所以y轴一直没有变,所以y prime还是等于y,那么大家也可以,自己试一试,把这个给写出来,这个矩阵形式写出矩阵形式应该是什么样子呢,应该是这样的,就是说如果我让一个图啊。
这个相对于y轴进行一个镜像操作,那也就是说把x反过来,那就应该是变成这么一个矩阵呃,这个-1001,也就是它只影响x不影响y,那么这个矩阵和这个左边的这两个等式的写法,是应该是完全完完全全一样的。
咱们把它写成矩阵,大家之后可以看到这是一个很方便的写这个表示方法好吧,那咱们可以继续,那么这里给大家提到一个稍微困难一点的这个,这个变换啊,这个变换叫做切变,也叫sheer啊,什么叫切变呢。
就好像说你拿到的这个图啊,它本身带有这个弹性,然后就是说你可以这个拽着它上面这条边,对于咱们这个例子来说啊,拽着上面这条边向右向右这么大,然后你就会发现这张这张图被你给拉这个歪了对吧。
然后就会形成这个右边这么一个一个这个呃结果,那么这个结果我们仍然可以通过这个矩阵呃,或者说我们通过分析啊,这个前后经过变换前后它们的坐标之间的关系,咱们可以写出这么一个x和x prime之间的关系。
以及,y和y prime,那么这里这里怎么样去理解呢,大家可以先看左下角的这个这几个提示哈,这也就是我们能够观察到的一些这个这个现象,首先咱们可以看最后一点这个这个vertical shift。
也就是说竖直方向上,大家发现这个切片啊,我们是沿着水平方向去拽的对吧,其实对于任何一个点来说,它的纵坐标没有发生任何变化,比如说呢咱们看这个左上角这个点,这个点原本在这里,然后现在移动了之后呢。
出现在了这里,然后大家会发现啊,他只是这个水平方向坐标发生了变化,诶它这个y坐标也就,是竖直方向坐标并没有变,那对于其他任何点都是如此,比如说这个啊这个表盘的中心啊,这个经过了这个切片之后。
它会发生一定的移动,但仍然是水平方向发生移动,这个数值方向它并没有发生任何变化,所以有一个有一个式子已经可以明确的写出来了,是什么呢,就是y prime一定就等于y,因为y方向根本没有任何操作诶。
那这一点之后我们就已经确定了一半一半的关系了,对不对,那咱们现在就只需要研究这个水平方向上,它到底发生了些什么,那么水平水平方向发生什么呢,咱,们可以看另外两个提示,也就是观测到的结果。
就是如果我这个y等于零,什么是y等于零呢,就是说我们盯着这底下这条边来看,我们发现底下这条边啊,最底下这条边完全没有发生任何变化,这仍然是底下这条边,说明任何一个点,只要它在最底下这条边。
它的水平方向的移动都是零对吧,那我们再看顶上这条边,如果我们看顶上这条边,我们会发现啊,呃比如说左上角这个点,它现在出现在哪儿呢,它现在出现在这个位置上,那这个位置它的水平方向呃,它的水平坐标是多少呢。
原本是,零对吧,它左左上角,然后现在变成了a那么原本这个假如说是一,那他这个就应该是右上角这个水平的坐标,假如说是一,那么经过切片之后呢,就是变成这个位置,这个位置对应的应该是一加上a然后我就发现啊。
这个在最上面这个呃这条边上面任何一个点的移动嗯,它移动了多少呢,它都移动了a这么一个距离,我是说水平方向上都移动了a这么一个距离,那么咱们总结一下,在底下这条边所有点的水平方向移动都是零。
那么在上面这条边所有点的水平方向移动都是a然后咱,们可以看一下中间这个位置,那中间这个位置比如说在y等于0。5的时候,那么水平方向的移动是二分之a它原本在这里,现在移动到这里。
那也就是说水平方向到底移动了多少呢,应该移动了a乘以y没有问题吧,那咱们如果写出来,那就应该是这么一种形式,也就是说任何的x水平方向的移动都是a乘以y没有问题吧。
然后这样的话就等于是x prime是什么呢,x prime就是原本的x加上a y,那x加上a y写成矩阵形式,就是这个ea乘以x y,那这就是这一行,那咱们刚才说过这个,y方向上这个坐标一直没有变。
所以y prime一定就等于y,所以咱们可以把它简单写成这么一个矩阵形式诶,那咱们就可以看到这个这个呃这个矩阵啊,就是这个切片这么一个矩阵啊,他写作这个1a01 是指水平方向的这样一个切片好吧。
这就稍微困难一点,但是大家从这个中间可以看到一个规律,就是说我们要想写出一个变换很简单,我们就要找一个对应,找一个这个变化之前的这个xy和变化之后的x prime y prime,这两者之间的关系对吧。
只要找到了这么一个关系,那么自然而然就,可以写出这个变化来,那么那咱们可以继续啊,那么这里给大家说一个这个更复杂一点的这个变换了,这个变化当然是非常非常常见的,大家在这个图像的编辑里面。
或者说在这个各种各样的这个这个游戏啊,或者干什么都会涉及到各种各样的这个旋转这么一个变换,然后旋转呢这里咱们首先先说这是二维的旋转,在这个平面内的旋转,然后咱们规定两个事情,第一任何时候我们说旋转。
只要我们不说别的这个这个信息,我们就认为它是绕着原点,也就是零零进行旋转,也就是说相,当于啊你这个你把这个圆点这个点零零这个点定死,其他的呢就绕着它转,就是这个意思。
ok然后这个另外如果咱们不说旋转方向,那就是说我们默认是逆时针方向,逆时针方向啊,也就是说这里如果我说我们把左边这张图旋转45度,那就应该是说左边这张图呃,以这个原点为中心,逆时针方向旋转45度好吧。
然后咱们管它写作r45 ,然后大家可以猜测这个旋转之后是长什么样对吧,应该长成右边这个这个这个样子,那么旋转那当然是也是对应一种变换对吧,那么旋转,的公式,咱们应该如何把它写出来呢。
或者说旋转的矩阵咱们如何把它给表述出来呢对吧,那么大家可以看这么一个例子,这个这就是大家应该看到的旋转矩阵的这个这个结果是什么啊,那么大家肯定关心这个旋转矩阵咱们是如何得到的呢,对吧。
那这个时候我给大家做一个简单的推导,但是这个推导之前啊,先这个呃给大家回忆一下,我们刚才已经说了对吧,不管再复杂的这这么一个变换操作,最重要的是什么呢,最重要的是找到一个一一对应关系。
找到这个前后这个啊坐标之间,的关系,也就是说xy原本说xy,比如说这个点,然后旋转之后变成x prime prime,它应该变成了什么新的一个什么样的点对吧,把这个关系找到就可以了。
那么我们现在这个看一眼啊,这个是头一次在这个课上给大家首推公式啊,好。
ok那咱们看一下这个旋转,好这假设是这个输入的这幅图已经画好了,然后呢咱们要把它旋转某一个角度,咱们假设它是c塔角度好吗,ok那我们可以看到偶三维的时候就不再首推了哈,然后我们可以看到原本说啊。
比如说x y这个它会被旋转到x prime y prime,那么我们要的其实就是这么一个关系,就是说x prime y prime它是等于什么样的一个矩阵,乘上x和y对吧。
那也就是说我们需要知道这四个数都是什么,如何得到这四个数呢,那么这里就有一个这个简单的技巧,首先呢就是说我们这个旋转上面啊,所有的点任意给你一个xy,肯定都得符合这么一个旋转公式。
那么既然任意一个点都要符合这个旋转公式,那么对一些特殊的点肯定也要符合对吧,那呃什么特殊的点呢,在这里我给大家一个例子,比如说咱们看这个点一零这么一个点啊,就是这个点,然后咱们画一个红色吧。
o然后它旋转了之后会旋转到这个点上去,并且呢我们知道旋转的角度是c塔角度好吧,那么我们知道这个旋转呢,他肯定不会改变这个物体本身的大小对吧,那我知道这条边的边长,这条边的边长是一,那么旋转了之后。
它的边长肯定也还得是一,那么我们知道这个三角函数告诉我们了,那如果我有一个直角三角形在这里,我知道它的斜边是一,并且它的有一个锐角是c塔,那么我们就应该知道它对应的另外这两边两个直角边都是什么。
这两个直角边是什么呢,一个是cos in c的,一个是sc的好,然后这样一来呢,我们就知道了一个信息,什么信息啊,那就是说原本的这个一零这么个点被旋转成了cos,theta和sin thet,诶。
那么我们找到了一个什么对应关系呢,这里一零cos sin,那咱们现在假如说啊可以做这么一个操作,我们这四个数,这个矩阵的四个数咱们都不知道对吧,不过没关系,我们把它写成a b c d。
那么我想知道这个如果,如果我的输入,是一和零的话啊,x y是一和零,那么经过这个a b c d这么一个变换之后,它会变成cos theta和sin thet,那也就是说什么呢,把这个矩阵展开。
我们就可以看到cos c塔等于a乘以一,加上b乘以零,也就是a然后呢我们如果看sin thetsin the,它等于什么呢,我们找第二行和第一列,也就是说c乘以一加上d乘以零,也就等于c。
我们发现什么了呢,我们就会发现哦,原来cos c的等于a,也就是a等于二糟糕,也就是a等于cos c的,然后呢这里,c等于cc,所以就等于说啊我们用这么一个特殊的一个点,一和零这么一个点。
我们考虑一个简单的三角函数,我们就立刻可以得到a和c等于多少,那么同样道理对不对,我们只需要再考虑另外一个特殊的点。
然后我们就应该可以把b和d算出来,而且其实我相信大家应该已经可以猜到。
我们会用另外一个什么样的点,来把这个后面这个这个第二列给算出来对吧,大家可以看到我们可以用这个零一,也就是说左上角这个点这个点向左旋转一,同样是一个theta,然后它会旋转成什么呢。
它会旋转旋转成负sin theta和cos theta,然后这样的话我们就可以把这个第二列也可以算出来,那么大家看到一个什么事情啊,就是说我们通过简单的这两个特殊的点。
我们就可以把一个完整的旋转公式给推出来,我们并不需要考虑一个一般性的结果,因为刚才逻辑就是这样的,既然任何一个点都得满足这个旋转公式,那么对于这两个特殊的点肯定也得满足。
所以我们只需要把这四个数给弄出来就可以了对吧,所以说那关于这个第二列的推导,我就不再多说,那这个第一列这个咱们咱们这个已经说明白,那思路就是这样的,那呃到此为止,咱们就可以得到一个旋转的矩阵。
那么这个旋转的矩阵呢完全没有任何必要去记忆对吧,如果你实在忘了,你就照这个方法推导一下就可以了,对吧好,那么这里就是这么一个这个旋转的这个矩阵,然后嗯这里呢呃大家会发现啊,有一个什么共同点。
咱们讲了这么几个这个呃运算了,或者说这个叫什么变换变换啊,都可以写成什么形式呢,都可以写成这么一个x prime是a和b的某一种组合,或者说我们叫线性组合,就是a x加b y,然后y等于c x加b y。
然后写成矩阵形式,大家会发现啊,这个就是我们刚才要推的这个这个这个矩阵,然后a b c d对于对于这个呃缩放,如果大家还记得,那就是对角阵就是a和d是有直的,然后b和c是零,然后旋转的话。
四个都有跟c它有关,然后对于切片也是一样的,那么都可以写成这么一种形式,然后如果呃我们可以把这个呃变换写成这么一种形式,也就是说用一个这个呃矩阵去乘以你这个呃输入的这个坐标,可以得到输出的这么一个坐标。
那我们就认为这种变换我们管它这个起个名字啊,叫做线性变换好吧,那也就是说这个这就是这就是我们这个这个介绍的一个概念啊,我们刚才提到这几种,这几种变换都是线性变换好吧,那么写成矩阵的形式。
大家可以看到x prime就等于一个呃矩阵乘以一个这个原本的一个坐标,x好吧,然后这就是就是这么一个这这个这个这个简单的这么一个矩阵乘法,这就是说啊我们这这里就把这个联系建立起来了,对于一个变化。
我们就用一个矩阵来表示,然后呢大家看到这里我提到一点,这个我们要用一个相同维度的矩阵来乘以这个向量,这是为什么呢,难道说这个不相同维度的这个矩阵,我就呃也也也可以乘上某一个这个这个输入的变量吗。
比如说这个变量是二维中间的一个点,那肯定是两个数,那如果我用一个3x3的矩阵,肯定没有办法乘它对吧,那我为什么要特地提到这么一个事情呢,这就是为了区分后面的一个概念,那咱们为了理解这个事情。
咱们这个继续这个进展一块重要的一个一个概念给大家介绍一下,叫做齐次坐标好吧,然后为什么要这个提到齐次坐标,最重要的事情就是说,首先我们要理解我,我我我们为什么一定要引入这么一个复杂的东西对吧。
然后再去理解说,我们为什么要这个这个这个这个呃需要需要用到它对吧,然后呃以及后续的这些操作要怎么样去操作,如何去定义,那么从一开始来说,我们为什么要用齐次坐标这个概念呢,那正是因为有一种变换。
它非常特殊,什么变换,平移变换呃,平移变换这个这个这个有什么特殊的,大家看这个例子对吧,大家看这个例子,这个什么呢,左边有一幅图,然后他经过了一个平移,很简单,x方向平移了一个tx。
然后y方向平移了一个t y,就这么简单,就是简单的移动一下它们的坐标,然后大家肯定会觉得这个太简单了,那咱们直接就可以写出来它们的对应关系对吧,原本的一个x会变成什么呢。
x加tx原本的y会变成我这个y加t y啊,正是如此,大家可以简单的把它给这个这个这个写出来对吧,然后这个写出来之后啊,大家会发现是挺简单的,但是好像有一个问题,好像有一个问题对吧。
就是说你你还能不能把这么两个式子写成他们刚才写的这个矩阵形式,就是说x prime呃,呃y prime这个这个向量是不是还能写成等于某一个矩阵,a b c d乘以x和y,这回大家发现不能不能吧对吧。
这个这个这个怎么回事呢,是因为大家只能把它写成这么一个形式,大家可以发现什么形式呢,大家看到这里呢,大家熟悉的这个形式,咱们刚才说的这么几种变换啊,是这样的,就是a b c d乘以x y唉。
这里又加上了一个tx和t唉,为什么我们一定要这个加上一个txt,因为我们可以看到前面这个矩阵a b c d乘以x y,无论如何,他得到的形式肯定都是a x加b y。
或者说多少多少x加多少多少y这么一个形式的组合,然后我们再回到刚才的平移的这个这个呃情况来考虑哈,我们是x加上了某个常数,外加上了某个常数,也就是说这个矩阵并不能表示这么一种操作,所以无奈之下怎么办呢。
咱们这个先用这个矩阵乘以这么一个xy,再加上一个这么一个向量tx t y,然后咱们来这个这个描述这么一个这个超级简单的变化,对不对,平移变换,那么平移变换呃,如果只有平移的话。
大家可以知道这个a abcd,那就应该是这个这个这个这个单位矩阵,也就是说它是这个1001乘以x y乘了之后没有任何作用啊,就是xy,然后再分别加上tx t y。
那么这个x prime y prime就对了对吧,也就是说通过这么一种形式,我才可以去表示这么一种平移的操作,这个就就发现这个有点反人类啊,对不对,然后这个这个同时也反映了一个问题。
就是说啊这个平移操作并不属于咱们刚才定义的这么一个线性变换,这么一个一个范畴对吧,因为我们说了,线性变换必须得表示成一个向量,等于一个矩阵乘另外一个向量,那这里不行,它多了一个这个向量。
它后面要加上一个东西,那所以平移就不再是线性变换,而是一个特殊的情况,那虽然它简单,但是也得这么承认,但是我们呢都不希望把这个平移当做一个特殊的情况去考虑,说每次我都带上这么一个尾巴,把它加上去对吧。
人类总是懒的,懒呢是一个一个一个一个一个美德,就是说这个人类有很多进步都是因为这个这个这个懒才造成的,人们很贪婪,人们希望有一个简单粗暴解决方法对吧,那对于这个例子,同样道理。
我们不希望把平移变换当做一个特殊的变换,那么这里大家就会问这么一个问,题,有没有办法能够把所有的这些变化,然后和平移在一块儿,用一个最简单的变化来表示对吧,这就是大家要的东西对吧。
那这个嗯这就是大家这个这个这个思路哈,就是说呃我们在提任何的这个齐次变换,旗子坐标是什么东西,之前咱们先提到这么有这么一个问题好吧,那么人们就沿着这么一个问题往下问好吧,能表示各种各样不同的变化。
那自然是好,那如果能找到自然是好,那那那就是说呃这个这个这个人们经过探索之后,确实发现了一个解决办法,就是引入齐次坐标这么一个概念,但是咱们在讲这个齐次坐标这个概念之前呢,先给大家说一下这个事情啊。
就是在计算机科学或者说各种各样的这个这个不同的这个这个领域吧,都会有这么一个情况,就是说我们永远要考虑的一个事情啊,叫做trade off,什么叫trade off呢。
就意思就是说你为了引入某种这个方便的,什么样的一种一种表示也好啊,比如说这个大家学这个数据结构好吧,大家这个知道呃,各种各样不同的这个这个降低这个时间复杂度的办法,但是都会引入更多的这个空间复杂度。
那如果能够这个两者都能够保证都很低,那就非常好,但更多情况下是一个这个非此即彼的事情,此消彼长的事情对吧,所以这个这个呢呃也有一个定理叫做no free lunch serum对吧,没有免费的午餐。
道理就在这儿,咱们就要注意这么一个事情,就说齐次坐标,那咱们既然已经提到这个概念了,那它自然就是用来解决说这个我不想让这个平移成为一个特例,这么一个1111个目的。
然后我希望用齐次坐标能够把所有的这个呃变换都给统一的表示起来,那自然是好的,那么它不好的地方在哪里,咱们就要关注这些这个呃这些问题好吧,那咱们这里这个就继续往后说。
那么人们在这个这个长期的这个斗争过程中啊,就发现了啊,我们可以这个引入一个新的形式来表示这个物体的坐标,那么我们现在说的是二维的变换,那么人们会发现啊,我可以把这个二维的点或者向量给增加一个维度。
就是大家可以看到在这里啊,就是对于任何的一个二维的点x y呃,我们不再写成x y,我们把它写成x y一这么三个数,然后呢对于任何一个这个向量,对于任何一个向量,然后我们把它写成x y0 。
这个取决于说你这个xy到底目的是为了表示一个点,还是为了表示一个向量,那那这这这是在干什么,大家会发现这个直观上来看,大家就等于是把这个原本的这个这个这个二维的点增加了一个维度,这不这不是浪费吗。
但是大家会发现啊,我把这个呃x y增加了一个一之后,然后他就有了一个非常好的性质,什么性质,咱们看下面这行,这行说的是什么呢,就是说大家看啊xy 1,这就是我的二维的一个点,仍然是xy啊。
仍然是二维的一个点x y啊,然后只不过他写成了这个用三个数来表示x y1 ,那么在他前面乘以的这么一个矩阵做了一个什么事儿,大家可以看到这么一个矩阵,它是基本是对角的。
除了在这个最后一列上有一个tx t y,然后呢,这个你会发现这个矩阵乘以x y一这么一个向量之后会变成什么呢,会变成x加t x y加t y,然后一哎大家发现这个这个如果我单看前面两项。
这不正是我要的平移的变换吗,对吧,我希望把x变成x加tx y加上y y y变成这个y加t y哎,这就是我要的平移操作,并且这个平移操作现在可以写成一个矩阵乘以一个向量的形式了对吧。
也就是说啊我们的这个这个引入齐次坐标最大的目的,这就达到了,就等于说我们用齐次坐标可以这个通过增加一个数这么一个方式呃,然后来把这个平移变换也写成这么一个矩阵乘以向量的形式,那么大家肯定要问了对吧。
这个那其他的这些变化是不是也可以这个写成这么一个形式行,没问题,其他的线性变换也可以,咱们之后会看,但在这之前呢,大家这个肯定会有人会问这么一个问题啊。
这里这个这个为什么我们会把这个点和向量区别对待对吧,我这个点还是二维的点,我后面给增加一个一,然后呢我这还是二维的点,我后面增加了一个零,我就是用来表示向量,我这是干什么对吧,那这里我们要把它搞清楚。
那么这里其实啊大家回忆之前我们讲的一个概念,大家就知道为什么呢,因为我们提到一个向量,所谓向量它表示的是方向性,我们提到说如果你把一个向量从这边移到这边,那它的方向是不变的对吧,它仍然表示同一个向量。
这就这就表示一个什么什么事情呢,咱们正式的来说就是向量具有平移不变性,也就是说不管你对向量进行任何一个形式的这个平移操作好吧,在它上面做任何的平移变换,这个向量永远还得是它原来的这个向量。
它不应该发生变化啊,那也就是说如果有一个向量x y0 同样经过这么一个矩阵,它的变换得到的结果,我仍然希望它是xy 0,绝对不是x加t x y加t y0 ,没错吧。
也就是说我这个呃把这个向量的最后一个维度增加一个零,是目的,就是为了保护它,让它这个经过这个平移变换之后,它不变对吧,就是这么一个目的,那么这个更深层次的一个理解呢,就是怎么说呢,就是就是这么看。
就是说啊我把后面增加一个一还是零,其实是有意义的,为什么呢,因为我们知道啊,在空间里面我们提过这个这个不管是二维还是三维啊,这个向量加上一个向量,那我们我们记得这个三角形法则对吧。
首尾相接得到一个新的项链,没问题,那么如果他的这个这个呃坐标最后是零,比如说啊第一个向量叫x1 y10 ,第二个向量叫x y x2 y20 ,那么加起来之后就是x一减x2 ,然后y一加y2 。
最后还是零,也就是说它还是一个向量,没问题,那咱们可以再继续验证这么一个事情啊,就是说这个呃那如果原本空间中有个点,那我减去空间中另外一个点,那我知道这是在干什么,这就这样就形成了一个这个向量对吧。
从被减数指向减数的这么一个向量,那那我们看看对不对呢,比如说x1 y11 ,这是一个点,然后x2 y21 ,这又是一个点,相减之后正好会出现x一减x2 ,y一减y2 ,而最后一个维度1-1=0诶。
正好反映这么一个问题,点减点是等于一个向量a所以说这么一个定义它,他这个在这种这个基本的这个加减这个操作的情况下,仍然是非常有意义的,那那个咱们可以自行验证第三点对吧,一个点加上一个向量,什么意思啊。
一个点沿着一个向量移动移动到了一个新的点上,所以说最后一位原本是1+0还是一道理就在这,所以说这就是这个这个引入这个齐次坐标,它这样一个妙处啊,就是说他这个呃这个向量最后一位是零。
不仅保证了它的平移不变性,而且它还能保证在这些操作下是对的,那同样道理,第四点也是一个点,加一个点本来就没什么意义对吧,这个这个这个x y1 ,这这后面也是一加起来最后是二诶,这是什么意思呢。
这个其实人们也扩充了它的定义,然后这个定义是什么呢,什么呢,大家可以看就是说啊,首先咱们先这个说清楚,我们还是在描述一个二维的点,也就是说只有xy是有意义的,这个w是我们加上的一个东西。
那么如果我们认为任何的x y w作为一个二维的点,它表示的点其实都是什么呢,其实都是x除以w,y除以w,然后一诶,那这样的话就等于是对于任何的w,只要w不是零对吧,w如果是零。
那这个x y w就是一个向量了,就不再是这样,那x y w在w不等于零的情况下,可以把x y w都除以w,那么这样的话第三个维度就自然而然变成一了,于是现在表示的就是一个点了,那表示什么点呢。
就是x y w表示的点就是x除以w和y w这么一个二维的点,那么从这个呃这个这个这个定义上啊,这是一个扩充的定义,我们其实就可以得到说这个点加上点到底是什么呢。
然后这里我简单直接给大家这个提供一个答案哈,一个点加另外一个点,在这个齐次坐标的表示下,表示的就是这两个点的中点对吧,那这个我希望大家这个这个自己回去验证这个事情,为什么呢,因为呃很简单。
因为w会变成二对吧,那你怎么把w变回一呢,呃通过这个思路应该就可以,这个很容易的知道会得到另外一个点的终点诶那行,这样的话咱们就等于是把这个齐次坐标说明白了,那最重要的是什么,不是这些变换。
而是目的我们引入齐次坐标,就是为了把所有的变换给写成一个矩阵乘以一个向量,这么一个简单的形式,而不希望有平移操作这么一样的一一这么一种特殊的变化,好吧好,那么这里对于任何的一种变换。
如果我们把它这个原本的这个变化,大家可以看到呃,我们之前讲过线性变换abcd这么一个矩阵乘以x y,然后如果这个后面再加上一个平移啊,然后我们就可以写成一个新的这么一个坐标,对于类似的这种变换。
我们可以给它起个名字叫做仿射变换,然后这个叫做a fine transform啊,然后反射呃呃这么一个变换,那么所有的仿射变换都可以写成这么一个呃这个齐次坐标的形式。
大家可以看到这这两个表示有什么区别呢,正是在下面这个矩阵里面啊,下面这个等式里面,我们只需要用到一个矩阵,然后乘以这么一个向量,就可以得到一个新的向量好吧。
那这样的话就是说诶我们就用一个矩阵统一了所有的操作,然后这个矩阵呢其实有一定的结构,这个这个可以研究哈,大家可以看到,如果我们用这个其次坐标去表示一个这个二维的仿射变换的话,那么它的最后。
一行永远都是001,然后呢这个它的平移永远是写在这个最后一列的头两个数上,然后它左边还有一个2x2,是原来的这个这个这个abcd就是原来的这个线性变化的这一个部分,那么它对不对呢。
咱们可以通过这个之后的这几个例子可以看到对吧,那我们会发现啊,果然是这样的,就是说啊我在其次坐标的表示下x y一对吧,这这个这个某一个点上,然后我们要对它进行一个这个缩放操作,那就乘以一个s s x。
然后在y上乘以一个x y,然后这个大家会发现诶结构还是这样,的最后一层001,然后因为它只有这个缩放嘛,它并没有考虑这个平移,所以等于是两个平移,tx t y都等于零,那么旋转是同样的一个道理。
你会发现只有左上角2x2是一个旋转,也就是说这一部分2x2是线性的变换,然后呢最后一行永远是001,然后没有平移,这个txt y都等于零,那对于平移来说,同样道理,没有经过这个线性变换。
然后所以左上角是一个单位矩阵1001,然后它只有平移,所以平移写了最后一列txt对吧,这样一来的话,这个就等于是我们知道我们可以,用这样一个矩阵可以把这个线性变换的部分改成二和,这个平移这一部分啊。
都统一的写成这么一个形式,那么咱们现在回到之前说的这么一个这个这个这个呃问题上来哈,我们知道这样一来呃,我们用其次坐标,就可以很方便地把各种各样不同的变换给写成同一个这个呃,统一的表示形式。
那么它的代价是什么呢,很简单,我觉得大家就已经可以看到对吧,它的代价自然就是说它引入了一个额外的数字,然后任何的一个点x y都让他写成了x y,一任何一个向量都让他写成了xy,零,所以这是额外的数字。
那对于这个对于这个矩阵来说呢,原本2x2,然后我顶多再加上两个数,然后这是六个数对吧,平移的两个数,然后现在它其实是九个数,但其实呢大家会发现最后一行这个竟然表示仿射变换,他最后一行都是001。
所以说大家都知道,所以其实存储的话,理论上来说只需要存储前面这几个就可以了,所以理论上来说这是一个非常好的发明法,几乎没有什么这个这个代价的情况下,就可以把很多东西给写在一块儿。
然后呃这里呢呃给大家强调一个事情,我,刚才一直在说啊,在仿射变换呃,或者说在表示二维情况下的仿射变换的时候,这个旗子坐标对应的这么一个矩阵,最后一行才是001,并没有说在任何情况下都是001啊。
就是说在其他情况下,它这个是是有着他自己的意义的,咱们之后再说这个投影变换的时候,大家会意识到这么一个问题好吧,然后呃行,那这就是这个咱们引入这个旗子坐标这么一个一个概念好吧,然后呢。
在这里简单给大家这个这个这个提一些这个各种各样其他的变化,比如说咱们从这个呃这个呃逆变换,开始,然后咱们之后会涉及到这个变换的合成好吧,那么逆变换是什么意思呢,很简单。
就是说如果我把一个这个变换的这个操作反过来,那就是它的逆变换,然后咱们看下面这么一个例子哈,就是说我们看到这个这个这个这个这个图像呃,原本说这个左下角在原点,然后它这个经过某些变换之后变成了这么一张图。
那如果我想把这张图给变换回原来的这个形状,那他应该经过一个什么变换呢,经过的就是咱们之前说的这个变换的逆变换,然后这个逆变换正好在数学上对应的是什,么呢对应的是乘以这个变换的逆矩阵。
然后咱们之前提到过这个逆矩阵对吧,就是一个矩阵乘以它自己的逆矩阵一定等于这个单位矩阵,就是等于是我做了一遍什么操作之后,再做了一遍反应的操作,诶,它就等于什么操作都没做过,这道理是完全一样的对吧。
咱们比如说从这幅图开始,经过这个m变换之后,又经过m的逆变换之后,那我就知道他肯定还得回到原位,什么都没有变对吧,那么这就是它的这个这个逆矩阵,然后唉这里就是就是这个逆变换这么一个概念,然后逆边框呢当。
然是有用的,然后咱们马上就要给大家这个介绍这么一个事情好吧,然后在这里之前呢,我们给大家介绍一个这个这个变换的组合这么一个一个过程,那这是什么意思呢,就比如说咱们还以刚才的这个变换为例。
咱们这个左下角有一张图,然后呃这个这个都通过了某些变化之后,它变成了这个右边这么一幅图对吧,然后那么我们自然而然就要问呃,那这个变化是怎么得到的呢对吧,那我们也许可以尝试一下这么做对吧。
比如说我可以先让这幅图向右平移一个单位,也就是说平移量,分别是一和零,在x和y上对吧,然后就是我们把它写作t10 ,这是一种简g啊,然后呢我们再把它旋转45度,这个我们刚才说了啊。
只要不说这个旋转永远是沿着这个呃以这个圆点为中心旋转,然后这个旋转方向永远默认是这个这个逆时针方向,那么先平移一个单位之后,呃,x方向一个单位之后,然后再做一个45度的旋转,我们会得到这么一幅图。
右边这幅图哎,如果大家对比这幅图呢和左边这这个我们要的这个图会发现不对对吧,哎这个这个这个这个呃呃并不是我想,要的这个结果大家可以看对比对吧,那这个说明这个这个尝试不成功哈,那怎么样做才能成功呢。
那我们可以这么做,比如说我可以给你一个这个这个图仍然是输入的这张图,我先做一个旋转操作对吧,我先做一个旋转操作,这个45度的这个旋转呃,变成这么一个图,然后我再把它平移一个单位,向右移一个单位诶。
那我发现这张图就是我要的这个结果了对吧,也就是说通过这么一种组合方式,我们就可以得到这么一个结果,也就是说这里提到了两个事情啊,第一是这个,首先呢我。
们复杂的这个变化可以通过一系列简单的这个变换得到br,变换的顺序是非常重要的对吧,因为我们这两步做了什么操作呢,一个是咱们现在看到的先旋转后平移,然后一个是先平移后旋转,这么两个。
这个呃虽然来说做的事情呃,这个单个的事情都是一样的,但组合起来顺序不一样,得到的结果也就不一样,那这个可以通过什么事情呃这个理解呢,那就是矩阵的乘法,大家知道这个咱们刚才已经说了,旋转呃,不是旋转啊。
变换就是在某个向量前面乘以一个矩阵,那么如果说我再变换,一次那就在前面再乘以一个矩阵对吧,那那也就是说我的矩阵乘的顺序,这个如果调换得到的结果就不一样诶这个是非常有道理的,因为咱们上节课就已经提到了。
呃,你是不可以任意的把这个方向去这个这个改变的,呃这个这个顺序啊对吧,那自然而然就和咱们之前说的这个矩阵的操作联系在一起好吧,那这是一个题外话,然后呢这个我们刚才提到的这个结论,咱们已经说了。
这个变换的这个呃顺序是非常重要的,然后呢这个矩阵的这,个不能这个叫什么,咱们刚才也已经验证了,然后呢这里着重给大家提到一点,就是说啊我们之前这个在提这个向量概念的时候。
我们就说呃向量在咱们这门课里面默认是一个列向量,那么如果我要乘一个矩阵的话,那应该是这个矩阵放在它的左边,然后就相当于是呃它左边这个矩阵就会应用到这个向量上,没有问题吧,那咱们看现在这么一个例子哈。
咱们刚才说如果先旋转45度,然后再进行这个呃一个单位的平移,然后就可以得到这个准确的结,果那么这两个向量要如何呃,这两个矩阵要如何,分别乘在这个我们这个一开始的这个任意一个坐标xy上面。
那就是现在咱们这么写的,就是说给你任何一个xy,你要先做平移,所以在他左边写一个呃,先先做旋转啊,先做旋转,然后在他左边写一个这个旋转45度,然后等这步操作结束了之后,要在这个整体上再做一个平移。
也就是说在它的这个左边再写一个这个这个呃平移操作,那也就是说他会写成这个t然后二,然后是这个呃输入的向量这么一个形式,也就是说呢给你一个向,量它会从右到左逐个的去应用这个矩阵,没问题吧。
也就是说嗯这么这么这通过这么一种这个表示方法,然后咱们就知道了啊,这个是和这个数学上是完完全全一个概念,就是说如果我这个呃有个向量在最右边,然后前面有一对矩阵,那么它会从右边一个一个的去应用这个矩阵。
一直应用到最左边,然后对于这么一个例子也是这样,然后同样道理大家可以再熟悉一下,这个在啊其次坐标下描述的二维的变换的矩阵,大家可以看到这个呃一开始我们要先应用一个这个旋转矩阵,所以。
这个这个3x3的这么一个齐次坐标表示的矩阵的左上角2x2,就是这个呃旋转矩阵,并且这里没有平移,然后也就相当于在左边乘以这么一个呃平移的矩阵,那大家看到这个这个2x2呢是什么也没做的对吧,单位矩阵。
然后只有这里有一个一,也就是说左边这么一个3x3的矩阵所做的事情只有一个,就是沿着x单位呃,沿着x轴平移一个单位对吧,那呃算是再熟悉一下这个齐次坐标好吧,那也就是说我们这里着重跟大家说的。
就是说这个矩阵的应用从右到左,那么这个概念是可以推广的,什么意思呢,就比如说啊,如果我有原本有一个点,然后我连续给它应用很多不同的这个呃这个这个呃变换呃,分别是a1 a2 a3 好吧,大家看这个顺序啊。
就是说我要对这个点分别进行a1 a2 a3 ,a4 这么一个一个计算方法,自然希望它先应用a1 ,再应用a2 ,最后应用到a n,那如果我要把它写出来,怎么写呢。
大家可以看到这个左边这个这就写的很清楚了呃,首先给你一个x,你要先对它应用a1 ,然后应用完了,呢会得到另外一个点,然后再应用a2 ,然后最后最后再应用a a n,那么写成矩阵的形式呢。
就会变成这个an一直乘乘乘乘乘乘到a1 ,再乘以这个点xy一好吧,a那这样的话大家会发现一个这个事情,首先呢这个呃应用顺序没有问题,从右到左,先应用a1 ,一直最后到a n。
但是这里给大家要提的一个事情呢,就是说矩阵首先没有交换率,这是它的一个性质,但是矩阵有结合律,矩阵有结合律,在这里有什么有什么作用呢,那也就是说我们看啊,这里是一系列的矩阵相乘,最后乘以一个。
这个这个向量对吧,我们之前是说啊,这相当于是这个向量逐个应用这个呃矩阵,从右到左,先应用a1 ,再应用a2 ,再应用,最后到a n,我们也可以认为什么呢,也可以认为我可以先把这些an a a n减一。
一直乘上乘到a一这么一个这一些变换啊,咱们先把它盛在一块儿,乘在一块之后得到一个矩阵,然后我们再用这个矩阵去乘这个原始的这个向量,这当然是可以的对吧,数学生告诉我们这样这样做是这样做完全没有问题。
而这样做告诉我们一个什么事情啊,大家想一想,这个a一如,果说我们表示还是这个二维这个空间中的呃,用其次坐标表示的变化,那么它就是3x3的矩阵,那么a2 也是3x3的矩阵,一直到a n都是3x3的矩阵。
那么乘完了之后得到一个矩阵是多大呢,还得是3x3,也就是说我把这这么些矩阵乘起起来了,我得到了一个矩阵,它可以就等于是啊等于是一下做了这么多矩阵可以做的变换,它仍然是表示乘3x3这么一个表示方法。
唉也就是说啊这个这个矩阵是非常厉害的对吧,这种表示变换的矩阵,只要我给他一个3x3的矩阵,它,可以表示非常非常非常复杂的变换,这就是一个这个非常好的一个一个一个性质对吧。
就相当于是我们我们可以说用一个3x3的矩阵,这个表述非常复杂的变换,而不而不是像这个之前我们会想象成这样说这个啊变换,那我自然是这个变换经过的次数多了,然后它会变得越来越复杂,越来越复杂的。
然后可能33不够用,不会这里就是大家得到的这么一个结论,好吧,那就是这里这个关于这个矩阵,咱们怎么把它给合成这个不同的这个呃合成一个矩阵,把把很多不同的这个矩,阵啊,对合成一个同样道理。
这个变换呢不只能够合成,还能够分解,咱们其实一开始做的这个这个操作啊,咱们再试图猜咱们从这个左边一幅图变成右边一幅图,这么一个变换应该是什么样的,先旋转,而是先还是先平移。
这就已经是在试图做一个这个分解矩阵了,这呃这个变换的分解,但其实变换的分解其实有很多,而且呢很多程度上能够帮助我们理解,比如说咱们现在要回答这么一个问题,我们之前提到过一个这个呃什么呢。
提到过一个呃旋转,如果我们默认咱们什么都不说,就是,说认为它是沿着呃,按照这个零和零零这个这么一个点呃来旋转,就认为这个原点不变,然后其他都是绕着它旋转,那么如果我们想沿着呃,不是说沿着啊。
就是说以任意一个点为中心进行旋转,而不是受限于说我只能以这个原点为中心旋转,那这个怎么办,那假设说我们想跟想以这个c点为中心啊,然后对它进行旋转,对于这个特定的例子来说。
咱们认为这个c点就是这么一个点啊,左下角这么一个点,然后我们希望以它这个为这个中心进行旋转啊,那么怎么做呢,这时候就体现出这,个呃变换这么一个分解它的好处怎么办呢,咱们可以这样。
我们先把这个点这个任意一个点c先把它给移到这个原点上去对吧,我们只会做这个这个关于这个原点的旋转对吧,那我们自然就先把这个问题转化成我们会解决的问题,那就先把这个点给移到这个原点上去。
那当然不能只把这一个点移到圆点上去,要把所有点都这个对应的也发生一个移动,那怎么做呢,我们就先把先把所有的点都沿着副c方向移动这么一个距离对吧,就是说为什么是负c啊,原本这个点它对应的坐。
标是c然后你要想把它给移成零,可不是所有的点都要减去c吗,那就是说这个所有的点都要移动一个副c这么一个方向呃,就是有x有y啊,这里是一个向量,然后哎移动到这个情况下,那我就知道了。
那我那我就可以这个呃按照之前我们所这个教的这个旋转的矩阵,我们可以对这么一个图进行旋转,因为这个时候这个点我们要旋转,这个中心点已经移到了原点好,那么咱们可以简单做一个旋转操作。
然后呢咱们再把这个点经过旋转之后,我再把这个点给移回来对吧,我再把这个,点这个中心点啊,从这个原点我再把它移回这个c,然后我就就要经过这么一个平移操作这个tc这么一个过程对吧。
那么诶这个就是一个一个典型的这个这个分解这么一个过程啊,然后在这个旋转阿尔法角度,那如果我们要把它写成矩阵形式,大家记得这一点一定是从右到左,所以这这里是最右边是副c,然后最左边是c好吧。
这个应该是大家知道了这个应用的顺序之后,这个就没有问题了,也就是说这是一个非常不,错的应用咱们之后这个这个三维空间中沿着任意轴曲旋转也同样,这个可以这么考虑好吧,那这里就是说关于这个呃变换的分解。
那么看来是有那么一点点时间哈,那这个嗯简单说一下这个这个三维的这个变化好吧,呃说起来是这样啊,让我先看一看有没有同学问什么问题啊,或有同学问的问题相当那个相当深入啊,这个不容易啊,ok这样吧。
嗯感觉应该是没有什么这个直接简单回答的问题之后,大家把这些问题收集一下,然后拿到那个里面吧,拿到论坛里面,我有空给大家回回一下好吧,然后这里先给大家这个说一下这个三维三维的变化。
那咱们刚才已经说到了这个二维的变化了对吧,那么三维变换自然而然咱们利用这个这个这个思维哈,就是把这个所有二维的变化拿过去做类比就可以了,并不复杂好吧,就是说三维,空间中的变换。
那就这个自然而然这个呃东西会稍微多一点对吧,那大家可以想三维空间中也会有线性变换,三维空间中也会涉及到平移,对不对,那同样道理,大家在这个三维空间中,x y z我可以在前面乘以一个3x3的矩阵。
然后可以得到一个x prime y primary prime,那如果有平移,后面还得再加上一个txt t那我也不想这么表示对吧,我们仍然是需要做这个类比,那么这个怎么办呢。
我仍然不希望在三维空间中的平移变成一个特殊的现象,那我就希望把平移也给写进同一个操作里面,那怎,么办呀,原本我们现在变成三个数对吧,那那如果我现在试图引入齐次坐标,那我可不是还得再加一个数吗。
那这个自然而然就变成了用四个数去描述三维空间中的点和向量,没有任何问题对吧,那同样道理,三维空间中的点,咱们在最后加个一向量,咱们就加一个零好,那这个同样道理。
我们仍然会定义它的这样一个这个基本的这样这样一个呃操作对吧,就比如说xyz w或者说定义只要w不等于零,那它表示的就是一个点对吧,因为零表示的向量,那w不等于零,我怎么把w转换成零呢。
等我把x y z w哎不不不不不等于零,它不等于一哈,就是说就是说只有在w等于一的情况下,才会表示一个空间中的点,如果w不等于一,那咱们就把x y z w全都除以w。
不就都变成这个这个呃w等于一的情况了吗,那这个时候就等于说他告诉我们一个结论,x y z w表示的其实是三维空间中的这么一个点,什么点呢,x除以w y除以w z除以w道理是完完全全一样的对吧。
now ah这里这里并没有问题哈,咱们用这个四个数为了表示的是三维空间中的这么一个点,所以说这个x,y z各除以w啊,然后好,那同样的道理,三维空间中咱们也可以用这个呃这个齐次坐标描述的矩阵对吧。
来来这个简单的去乘以三维空间中的一个在齐次坐标表示下的点,x y z1 ,那大家知道x y z一它是四行一列的,那咱们前面乘以的矩阵自然得是4x4,然后4x4呢,大家会看到一个很很有趣的这个现象啊。
首先最后一行永远还是0001,也就是说在描述三维空间中这个呃的仿射变换的情况下,呃,这个呃对应的这么一个4x4的矩阵,最后一行肯定是0001,那,么平移在哪里呢,平移还在最后一列。
咱们通过对比可以发现很多事情就很简单对吧,这个平移三维空间中的平移当然是沿着x y z了对吧,那所以说这个平移仍然是tx t y t z在这,然后呢如果大家会发现呢。
这样一来就等于是围出来的一个左上角的一个3x3的这么一个区域,那3x3的区域大家自然可以可以想象哦,那这个3x3那肯定是三维空间中的线性变换对吧,x y z各缩放50%之类的这种操作,的平移。
咱们很快要给大家讲,然后呢呃这里就是这么一个呃应用方式,好吧,这里就跟这个二维情况下呃很一致,那咱们后面还会涉及到说这个具体的是如何表示,但是今天咱们这时间差不多到了啊,在这里用这个问题来结束吧,好吧。
唉就是说我们刚才一直说啊,我们可以把这个仿射变换给写成这样这样一个简单的矩阵形式啊,然后这个这个矩阵它表示的这个呃是两个操作对吧,第一是一个这个呃线性变换换的一个部分。
就相当于这里3x3的上面这个3x3呃乘,以xyz对吧,然后他同时还要表示这个平移,那么我问当你写上这么一个4x4的这么一个形式的时候,它是先表示平移呢,还是先表示这个线性变换呢。
就是说他呃这个矩阵应用在xyz这样一个三维点上,它是先线性变换再平移,还是先平移再线性变换呢对吧,然后这个其实呢这个咱们刚才这个这个答案已经这个这个写出来了,对吧,咱们先回到上面一样啊,诶诶诶诶诶好吧。
唉在这里好,在这里,那大家可以看到我们用这这样一个这个齐次坐标的矩阵表示的,其实对于xy来说是先应用,线性变换,然后最后再平移对吧,这两个式子是等价的,在三维空间中是完全一样的。
所以大家这个顺序不要搞错,当然呃就是说我们这里先应用线性变换再平移,然后写成这么一个形式,到了后面这个位置,到了后面这个位置,也就是说他他告诉我们,如果说我有一个这个二维空间中一个点先进行一个线性变换。
这里是旋转,然后再平移,其实这两个矩阵是可以写在一起的,没有问题吧,然后这两个矩阵写在一起是什么结果呢,非常简单,最后一行001不会变,左上角旋转不会变,然后右。
上方这个平移x和y只要把这里这个零右上角的零改成一就可以了,没问题吧,所以说这个顺序咱们这个大家不要搞反,大家只要知道这个对应到这个不用其次坐标的表示是什么就可以了,那咱们回到这一页。
好这个那就是这节课的全部内容了好吧,希望这个咱们这个说这个叫叫什么来着,齐次坐标这块呃会比较好理解,从为什么开始,然后再去思考这个这个呃如何去表示,好吧啊。
ok那咱们把这个这个这个画面在教给我们的技术秘书,同学好好行。
感谢大家的大力支持好,那咱们下节课再见。
GAMES101-现代计算机图形学入门-闫令琪 - P4:Lecture 04 Transformation Cont. - GAMES-Webinar - BV1X7411F744
好谢谢大家的大力支持啊,这个图形学入门咱们已经讲到了变换,然后这节课我们真正要深入讲一些,这个这个变换的一些内容好吧,然后呃我们简单说一下啊,在课在这个这节课之前,咱们先做一做这个呃一些事情的宣布。
一个是呃大家期待已久的作业零嗯,咱们这个如果顺利的话,今天应该会放出来,然后到时候大家这个呃,时刻关注这个微信上面,这个消息就好了好吧,然后作业零非常非常简单,只是给大家配置环境上手用。
基本没什么实质内容好吧,这是一个,然后另外一个这节课大家做好心理准备,这节课不容易啊,这个可能是这么头几节课以来,最困难的一门课呃,一一节课了啊,然后但是我希望咱们这个呃,把这个事情一块。
咱们把这个事情探讨清楚,所以应该还可以,所以也没有什么心理负担啊,咱们就这么听下来,然后在这个之前呢啊,我上节课其实有一块内容,希望给大家补充一下,然后但是上节课给忘了,然后咱们在这个之前。
先把先把这块儿给说明白,这个也就是我现在给大家写的这个白板,再看这个这这里我是在说什么呢,我是在说这个,上节课我们提到了这个,二维情况下的这个变换啊,如果我们不考虑这个齐次坐标,那么二维的变化。
基本上就用这个2x2的这个呃,矩阵来表示,那么呃旋转怎么写呢,就是旋转一个c塔角度,这个写作这个cos副词i,然后一个sin,一个cos就是这样,那么咱们想一个问题哈,那如果我们要想要想写一个这个嗯。
旋转副c塔角呃,那这个矩阵应该怎么写,大家可以看到这是在这个第二行,这里就可以看得到对吧,这个呃负theta很简单,把之前的这个theta都用负theta来代替。
我们知道cos把sa换成副theta之后不变,它还是cos thet,然后如果是sin的话,它就得在前面加负号,那就是说sin负最大等于负sin it的,那这样的话就会变成呃。
这个右上角变成了sin阶段,左下角变成了负sin the对吧,然后大家会发现啊,这个矩阵和上面一个矩阵如果我们相比,我们就会发现这个旋转副c塔角度,其实就是把这个旋转c塔角度,这么一个矩阵。
做了一个转置行和列对换对吧,然后然后这是一个可以观察到的情况,那另外一个情况是什么呢,就是从定义上来看,咱们大家来看这个第三行,从定义上来看,那我旋转c塔角跟我旋转副c塔角,正好应该是一个互逆的操作。
然后从咱们之前介绍这个矩阵的这个逆,这么一个一个一个定义上来看,那么旋转副c塔角,其实就应该是旋转c塔角得到的,这个矩阵的这个逆诶,所以大家就可以看到一个有趣的,这个关系啊,咱们用这个黑色把它圈出来。
在旋转里面啊,旋转的这个矩阵,它的逆就等于旋转矩阵的转置,那么这是一个不错的性质,为什么咱们今天要说这个呢,是因为咱们今天会用到这么一个性质啊,如果我们想求一个旋转的密呃,旋转对吧。
就是往相反的方向旋转相同的角度,那么很简单,我只是要写出来一个正向的旋转,然后把这个矩阵给转制过来,这自然就是它的逆,另外呢在这里多说一句,在数学上,如果一个矩阵的逆等于它的转置。
那么我们管这个矩阵叫做正交矩阵好吧,这里是一个这个算是稍微加一点点知识。
然后这节课也需要稍微用到一点,那咱们继续啊啊。
那上节课我们主要说了什么内容呢,这个呃说的就是最基础的变换对吧,从这个变换的应用上来看,我们说变换是非常重要的东西,然后呢,变换我们着重说了几种二维情况下的变换,这个旋转缩放以及切片,没错吧。
然后我们说啊有一种变换它很特殊,是什么呢,那就是这个平移这么一个变换,这个变换它特殊在,你不可能把它写成一个矩阵,乘一个向量的形式,你非得在后面加上一个这个平移的这个量,那么为了这个不把这个平移。
变换当做一个特殊情况怎么办呢,人们就这个研究出,用这个这个旗子坐标来表示这种变换,这样的话呢,就是不管你表示的变换在多少维度,那么它都是增加了一个维度,就比如说二维情况下。
我们原本xy表示一个点或者向量,然后呢我们在后面加一个一或者一个零,来表示它的这个呃,这个在齐次坐标下的点和向量,然后呢同样道理,这个呃相应的矩阵也多加了一圈对吧,相当于是这个意思,然后在二维的变换下。
应该是一个3x3的变换矩阵,那这样的话的好处,就是说,我可以把这个这个各种各样的这个呃,线性变换和这个呃平移变换可以写在一起,然后就不用有任何的特殊情况,然后我们还说了啊,这些矩阵可以乘在一起。
并且可以这个根据结合律可以任意的进行,这个先运算矩阵,还是先运算这个,这个这个呃矩阵应用在向量上对吧,然后我们还提到了这个呃各种变化,如何去分解它,如何去合成它,然后我们提到一点点关于这个三维的变化。
那么在这节课上呢,我们先把这个三维变换给说完好吧,然后今天我们先把三维变换结束掉,然后之后我们主要来说,这个相对比较困难的一个,我们管它叫这个view in变换,那这个其实说我这个做了不少调研啊。
我发现这个国内的教材,其实更多的是把这个观测这么一个变换,给分开来,来这个这个命名,一个叫做view transformation,咱们管它叫视图变换。
然后呢一个叫projection transformation,咱们管它叫做这个投影变换,那么很少有人把这个视图和投影,放在一块儿,管它叫做观测变换,另外其实我真的不知道他是不是应该叫做,观测变换啊。
那如果没有之前没有人定义,那我就这个我就这么定义了,好吧,哎咱们这个是大概就是这么个意思,就是说咱们今天着重要讲两个,一个是视图变换,一个是投影变换,其中投影变换呢,咱们会讲到两种不同的投影。
一种叫正交投影autographic,还有一种叫做透视投影,叫perspective,然后这两个都是什么意思呢,咱们把它给说清楚,这么一个关系啊,大概就列在这里了,那么大家可以看到这个三维变换。
其实我并不准备这个说得特别深入哈,基本上来说按照二维的这个变换理解一下,然后咱们大概就知道,这个三维变换是怎么回事的,那么三维变换咱们上节课提到这个事情,就是说啊三维的情况下,如果我要用呃。
其次坐标来表示三维的点或者向量,那我们那我们就在这个三维的这个坐标,x y z之后加一个一或者是零,然后用来表示这个点或者是向量嗯,这个跟二维情况下完全一样,那么它的操作呢也是完全一样,就是在这里。
这个我们认为如果有任何一个三维的点,x y z w,然后这个w呢只要它不是零,我们就把这个所有的x y z都除以w,那么我就认为x y z w这么一个三维的点,表示的三维的点就是x除以w。
y除以w和z除以w,那这个咱们这节课还会这个,更多的去用到它,好吧,那么这个我们上节课差不多停在这里对吧,我们提到说嗯,在三维空间中,我们一样可以用其次坐标,然后来表示这个三维空间中的变换。
那么三维空间中的变换原本的3x3,那用了齐次坐标之后,那自然会变成4x4,然后我们说了,对于仿射变换,也就是线性变换和平移这两个合在一起,这个嗯他们的这个啊仿射变换的这个矩阵,这个4x4的矩阵。
它是仍然满足一定的规律的,比如说最后一行还是0001,最后一列的前三个仍然是平移的量,tx t y t z,然后左边的3x3,仍然表示这个正常的这个这个呃线性变换,比如说像什么缩放对吧。
xyz都可以这个同步的缩放,然后其他的这些变换也都一样,然后我之前问了问了这么一个问题,就是说那么在这个矩阵的表示下,那我们是先应用线性变换,在这个在在这个点上xyz一上,还是先应用平移。
然后我们刚才回到了我们之前上节课,最后啊回到了这个二维的情况下,大家看了这个展开的式子,你会发现啊,原来是先应用线性变换,然后再加上一个平移量呃,所以在三维空间中是一样的,没有问题,那么类比的来看呢。
这个三维的变换其实非常简单,比如说咱们看这个呃缩放,缩放呢x和y和z可以这个自由的缩放,然后三个轴这个缩放的量和可以各不相同,然后呢这个每一个缩放就会影响自己的轴,所以它是左上角的3x3的一个对角阵。
sx xi和sz,然后这里没有问题,那么平移呢平移也是一样的,就是说这个大家看到只有最后一列,然后它有tx t y t z,这是指表示平移,左边的3x3呢是一个单位矩阵,然后这个没问题。
那么三维空间中的最复杂的操作,可能就是旋转对吧,然后呢,旋转这里给大家把这个式子列出来了啊,就是说这里在说是一个什么事情呢,如果在三维空间中,我希望把一个这个物体进行一个旋转。
我想写出来这个旋转的这个这个嗯矩阵嗯,对于任意的旋转,那当然很难写对吧,那咱们先从简单的开始写,假如说这个物体,三维空间中的物体,都是绕着某一个固定轴旋转,比如说要要么绕着x,要么绕着y。
要么绕着z对吧,然后大家看右边这幅图,右边这幅图呢,这个呃描述的就是呃,我有一个什么样的物体对吧,比如说这里有一个平面,然后它绕着x轴旋转,大家会发现绕着x轴旋转,反映了一个什么问题呢。
反映了它的这个y和z啊,都是再进行旋转的,然后但是这个任意一个点,它的x是不变的对吧,然后这就是一个特殊情况,反映在这个矩阵上面,大家可以看这个矩阵,这个大家可以看到左上角3x3的矩阵,x是不变的。
所以所以这个第一行是100,然后第一列同样也是100,然后呢,这个大家可以看到右下角,这个2x2的矩阵,这个是不是非常这个很熟悉对吧,因为这个矩阵其实就是在对y和z进行,alpha角度的旋转。
所以说这个呃绕x轴旋转非常简单,同样道理呢绕z轴旋转也非常简单,大家可以看到这个绕z轴旋转,那就是z对应的这一行,这一列没有变化,左上角的2x2,x和y还是一模一样的对吧,那也就是说这个非常简单。
但是有一点,如果大家这个这个细心看的话,现在就已经能够看出来了哈,就是说如果大家看这个绕y轴旋转,是不是发现有一些问题对吧,然后是什么问题呢,大家会发现啊,这个cos和sin。
这个在这个2x和r z这两个矩阵里面,哎,他们都是这个右上方,这个这个sin它是负的,然后左下角它是负的啊,它是正的,然后在这个r y里面正好相反,对不对,然后呢这个这是怎么回事呢,是不是哪儿写错了呢。
嗯答案是不对呃,是这里写的是完全正确的,只是这个这这里的理解会不太一样,这个要怎么想呢,就是说这个涉及到我,我们怎么样去思考,这样一个这些轴的相互顺序啊,比如说我们说这个轴是x y z。
那么就是说x x乘y,还记得右手螺旋定则对吧,x x乘y得到z,同样y差成z得到x,所以大家如果把这个这个给写的这个呃,把x y z啊这个反复的抄写很多遍。
就是x y z x y z x y z这么重复下来,你会发现给你xy你会得到z给你y z,你会得到x就给你任何两个,你都可以得到最后面的一个,那么这样哈,就是说就是说嗯,在这里。
大家会发现这个这个性质叫做这个嗯,循环对称的性质,然后呢,嗯这里这就可以解释,为什么这个y得出来的这些结果是反的,因为大家可以从右边这幅图上来看,谁和谁差成,可以得到y是z差乘x。
得到y并不是x差成z对吧,所以这就是为什么它它是反的,这如果是x长成z,那么正常写这个x和z这么四个四个数上,应该还是跟原来一样,但这里是z差成x是反的,所以说这个这就是为什么这个r y这里啊。
看起来要稍微这个跟其他的不一样一点,但是没有问题好吧,然后这个就是说三维空间中,最简单的一些旋转就是绕轴旋转,那么咱们自然而然要问这个问题,就是说如果是一般性的旋转,应该怎么样处理,对不对。
那么嗯嗯在这个图形学里面啊,大家通常都会思考这么一个问题,就是说我们能够解决一些简单的这些问题,但是对于复杂的一些问题,我不会不会没有关系,我们可以把它转化成一些这个这个这个呃。
简单的这一些这个呃问题的组合,比如说像这里就是这样,就是说我任意对于这个某一个这个,这个旋转啊,我不知道要怎么样把它给分解成这个呃,任意绕轴的旋转,但是呢就是说我们可以先思考这么一个问,题。
就是说这个给你这些简单的这些旋转,绕着这三个轴的旋转,你是否可以通过这个旋转,把某一个方向旋转到任意一个方向上去,就首先证明说,我们能够做到用这些简单的旋转,来这个描述复杂的旋转。
那么在这里就是这么个意思,大家可以看到上面有一个公式,这个公式其实非常简单,意思就是说这个你的任意一个,这个3d的这个旋转,然后我们都把它写成绕x轴轴,绕y轴,绕z轴的这个旋转的组合。
然后呢绕x y z轴三个这个轴的旋转的量,分别是alpha角,贝塔角和伽马角,然后这三个角呢又被称作欧拉角,然后这是这个我们数学上这么个定义方法,那么在这里就是说如何证明,说这么一种做法是合理的呢。
那咱们大家就想象一个这个正常飞机啊,它这个运行的这个方法,这个飞机假设它在向前这个运动,那么它可以做几种不同的旋转呢,第一它可以抬头或者低头对吧,这是一个可以做的这个旋转,然后另外一个呢。
这样向左或者向右,这样一个一个方向的这个旋转,还有一个旋转呢,大家在这个坐飞机的时候会发现很常见,还有一个旋转是把飞机歪过来,这样旋转,对不对对对,就是这么这么一种旋转,大家可以体会一下区别啊。
这样一种旋转和这样一个旋转,是完全不一样的,所以说这分别对应了这三种不同的操作,我刚才说这个旋转基本上叫做这个roll,这个操作,然后呢我们说的那个左右这个这个旋转,这个旋转叫做这个要这个操作。
然后peach这个旋转操作,那大家可以想象说这个飞机啊,基本上来说诶,他他这个通过这么几种不同的旋转,它当然可以把它的这个飞机的这个头朝向,调整到任何一个方向,也就基本上这个事情。
就就是说给了我们一个怎么说,一个直观上的想象,那就是说确实是可能复杂的这个旋转啊,绕任一轴的旋转,咱们都可以把它分解成这个最简单的,这个绕这个xyz轴的旋转的组合,那确实事情也是这样。
那这里是呃在图形学里呢,就有人这个发明了一套这个办,法,然后可以把任意的一个旋转,给写成这么一个矩阵,这当然就是通过把任意一个旋转给这个,分解成这个x和y和z,三个不同的这个呃轴上。
然后分别做旋转得出来的结果,那这个公式呢,大家可以看到叫罗德里格斯旋转公式,然后这个旋转公式啊大家可以看到呃,非常复杂不错,然后推导怎么推导的呢,这里这个在这节课后,我会把这个我自己手写了一份。
这个这个推导的一个一个一个嗯过程啊,那咱们课上不多说,我把这个推导的过程,放在这个课程的补充材料里面,这个在课程,的网站上,在这节课之后都会能够这个看到,那这里其实我着重要说一点什么呢。
就是说大家可以看到,这个罗德里格斯旋转公式是在干什么,他是给我们一个旋转矩阵,它这个旋转矩阵的定义了一个旋转轴呃,n对吧,大家可以看到旋转轴n和一个旋转角度,那旋转角度我好理解。
旋转轴似乎不能这么简单的定义,对不对,因为一个旋转轴来说,你只用一个向量来表示一个旋转轴,是不是不太合理,这个旋转轴首先得跟它祁连有关系,然后跟它方向有关系对吧,假如说我让它沿着y轴旋。
转跟沿着这个这个嗯x和z各等于一,并且也是沿着y方向这么一个向量,就是方向一样,但是他们起点不一样,那整个结果肯定不一样,所以说我只说一个这个轴的方向,似乎是不够的对吧,那么实际上来说呢。
这里是大家默认的一个想法,就是说我说沿着某一个轴的方向旋转,其实就认为这个轴它是过圆心的啊,不是圆心啊,过圆点的,然后这个这样的话,它的起点就认为在原点上,它的方向就是这个n这个方向。
然后旋转角度是alpha方向,所以没有问题,那么大家在这里肯定是要问这么,一个事情啊对吧,那如果我真的要让它沿着任意轴旋转,怎么办呀,就是说这个轴如果我可以平移怎么办,那么这个时候就是考验大家。
上一节课其实我们提到过这么一个事情,我们在讲这个呃变换的分解的时候,我们说这个我们会做一个二维的旋转,绕着这个圆点来旋转,但我现在如果我想绕着任意一个点来旋转,怎么办呢,那么大家如果还记得对吧。
我先把这个这个旋转的这个点,中心点给平移到这个原点上去,再做旋转,再把它平移回来,那么在这个这,个三维的空间中里面是完全一样的做法,就是说如果我要沿着任意轴旋转,而这个轴的起点并不在原点,没关系。
我们先把所有的东西都给移到这个这个呃,使得这个轴的起点在原点这么一个条件下,然后再旋转,然后再把所有的东西都给移回去,这样问题就解决了对吧,那就是说所以说我们这个知识啊,都是触类旁通的。
就是说这个在三维的情况下,也同样是这么一个道理,那这是第一点我想提到的一个事情啊,然后第二点我想提到的一个事情,就是后面啊这个大家看到有个大括号,括起来有这么一个n对吧,这是一个矩阵。
然后这个矩阵不知道,大家看着熟悉不熟悉啊,这里当然了,这这个又涉及到我们之前课上说的东西,对吧,我们提到向量和向量是可以做叉积的对吧,或者插成,那么向量的叉乘是可以把它写成一个,这个呃有一些公式啊对吧。
差成最后的结果得到的是一个向量,我们也可以把这个第一个向量给写成一个,矩阵形式对吧,然后呢,我们再用这个矩阵去乘以第二个向量,然后得到的结果,这个就是就是这个差成的结果,那么这个对应的矩阵就是写作。
这么一个形式,所以如果大家记得这个事情的话,就是说这里其实就是在说,如果我想运用某一个插成,然后我把它写成矩阵形式会是什么样的,那么整个这个式子看起来,这个相对复杂一些。
但其实推导来说是一个很直观的事情,虽然这个推导过程比较繁琐,但其实思想很简单,大家之后这个看一眼这个这个推导的,这个过程就好,那么到此为止啊,就是说对于这个三维的变换,我并没有说特别多,就是说嗯有很多。
这个这个嗯知识点基本是相通的,像一些基本的线性变换,然后向平移向,旋转就是稍微麻烦一点,然后呢旋转这里有一个概念,我并不打算在这门课里面说,但是简单跟大家提一下嗯,在旋转上,这个图形学的课啊。
大家可能会学到一个概念,叫做四元数这么一个概念,这个概念并不是说这个概念就非常古老,所以我不再说了,而这个概念其实现在还在用,就是说呃四元数这个概念,其实它这个它的引入嗯。
是更多的是为了这个旋转与旋转之间的差,值这么一个目的来做的,是什么意思哈,就比如说大家写一个二维空间下,咱们还,还不考虑这个什么呃,齐次坐标,二维呃,二维的旋转呃,比如说旋转个15度。
然后呢那我可以写出一个公式,2x2的对吧,然后我还另外写一个公式,旋转25度,然后如果我把这两个矩阵加起来求个平均,那么相信大家应该知道,这个结果并不是旋转这个20度,这么一个结果对吧,然后也就是说呢。
这个旋转矩阵这么直接写出来之后,是不太适合做差值的,是这么一个过程,就是说嗯考虑到这一点,这个四元数在这方面就得到了一个,不错的应用,但在这门课里面咱们就不再提了,好,大家去找到四元数。
并且找到这个如何与这个矩阵来进行转化,这个应该就可以解决问题,那咱们这个三维的空间变化,基本就说到这儿,那么今天最主要最主要的内容呢,还是说这个要把这个呃这个viewing,这么一个变换啊给说明白好吧。
投影变换,然后咱们挨个说,先把这个视图,或者说这个相机的变化给说明白,然后再说投影,那么在这个之前我先确认一下啊,看看大家这边有没有什么问题,ok大家之间有有同学问这个说这个y特殊。
是不是因为右手这个细的问题呃,并不是啊,左手系的话也一样会存在一些特殊的轴,这个没有关系,ok其他好像并没有什么问题,ok啊有同学拼了一下这个四元数的英文,拼错了哈,这个稍微改一改啊。
ok然后其他应该就没什么,那么咱们这就开始说啊,这个这个viewing呃,或者说观测这个变换,那么这是什么意思呢,就是说我们学了那么多变化啊,咱们别忘了最基础的这个目的,我们为什么要学这个呢。
最终我们试图把这个,三维空间中的物体给变成二维的一张照片,对不对,在这个过程里面呢,这个这个到底发生了什么,咱们要把这个事情给搞明白,而这个过程大家可以想象啊,从三维原本三维空间中的世界对吧。
然后变成一张图,那自然变成了二维,那这个过程肯定,这个这个涉及到从三维到二维的一个变化,那么这个变化肯定非常复杂,那咱们这个把这个事情给给这个,想清楚对吧,那我们学这个矩阵现在要开始用了。
ok那么咱们一开始先说啊,这个我们这个拿到一个场景,那我肯定要规定这个场景,然后呢这个呃我肯定还要规定一个,比如说这个相机的位置,或者说我人眼的位置对吧,然后我得到某一个这个投影出来的图。
这个是应该是一个比较直观的,这个这个思想,否则的话给你一个三维的场景,你从不同的地方看看到东西肯定不一样,所以怎么看这个东西,这是很重要的,所以说咱们从这里开始,ok那么我们说首先什么是视图变换。
这里呢就让大家思考一个简单的问题啊,什么问题呢,思考一下我们怎么样拍一张照片对吧,我说现实生活中怎么办呢,首先找一个好的地方,把所有人都集合在那里摆好pose对吧,这一步。
我们在这个图形学里面有一个相应的对应,我们管它叫做模型变换对吧,相当于把模型什么都摆好,把这个场景搭好,这是第一步,第二步我们要找一个好的角度对吧,大家都知道这个拍照最重要的是什么角度,对吧。
然后找一个好的角度,或者说找一个好的位置对吧,我先把这个这个相机放好,然后往某一个角度去看,唉这一部分我们就管它叫做视图变换,就是说我们改变的是这个相机好吧,这是一个布置相机的位置哈。
这个咱们把这个都之后都说清楚,那么这两步都完成之后,下一步是什么呢,哎下一步自然就是茄子,对不对,然后这个时候就已经可以拍照了,那咱们这个时候,就等于是这个从模型和视图,这两个变换之后,然后做一个投影。
这样的话把这个三维空间就可以投影到,一个诶二维的这个这个照片上去,那么自然就是这三部,那么在这个实际的生活中,我们就是进行了这么三步,来这个得到一张照片,那么在这个图形学中是完完全全一样的。
那我们做的也是这三个变换模型,试图投影变换,简称mvp变换,ok所以这mvp的意思是这个是model view projection啊,不是这个most valuable player,好吧啊。
这里这个嗯就简单给大家说一下这个过程,那么咱们这里这个主要说的就是这个view,对吧,这个这个视图变化,那么怎么做这个视图变换呢,那咱们想一想这是在干什么,咱们回忆一下啊,刚才咱们已经说了。
视图变换是在摆照相机,哎那咱们怎么摆照样机,大家先想一想,如何才能确定一个相机的摆放,那首先相机的位置一定非常重要,那相机放在哪个地方,这个对吧,这个都没有什么这个,这这不就是说相机放在什么位置。
是很重要的,所以说这个相机的位置,首先我们要定义它,然后呢这个只定义这个位置没用啊,就比如说我我现在在这里,对不对,然后我现在坐在这,然后我可以向侧面去看,我可以看这个方向,我也可以看背后对吧。
假如说我脑袋这个相机啊,然后就是说我放在哪儿,这是第一位,第二是我往往哪儿看,这当然是为了定义这个相机,我肯定得定义它这么一个这个这个属性,往哪看呢。
咱们管它叫做look at或者叫gaze direction,就是说我们这个往某一个方向看,我们剪辑做这个g向量好,然后呢这个相机其实呢还有另外一个属性,光定义在哪儿,光定义说往哪儿方向够吗。
不够还得再定义一个什么东西呢,叫做向上方向很简单,大家在拍照的时候拿着一个相机,然后向前拍照,如果大家把相机给旋转过来,就变成竖的了,对不对,那如果大家旋转45度,拍出来图45度的。
也就是说相机本身它这个旋转,这个这个肯定会影响到你,最后拍出来这个图是什么对吧,那么是什么呢,那就是说就是说我们用一个向量,来定义它的向上方向,这样的话就可以把这个旋转给固定住。
那这样的话经过相机的位置呃,看的朝向以及向上方向,我们就已经可以把这个相机给定义下来了,那也就是说,这就是我们需要的这个观测矩阵,这个所需要的一些这个初始的一些定义,对吧。
那咱们有这么些这个这个需要用的东西,那么下一步是什么呢,下一步就是说这个我们要想如何去进行,这个呃视图变换,那么我们思考一下这个问题啊,就是说嗯在这个现实生活中也是这样,比如大家坐在这个车上。
如果不往窗户外面看,大家是感觉不到自己在移动,对不对,这个东西物理上太简单了,这个叫相对运动,那么在这个这个观察上面同样是一个道理,拍照片也是同样一个道理,假如说大家是在摄影棚里面拍照呃,相同的人。
相同的相机,相同的摆放位置,相对位置,那么不管在哪一个摄影棚,大家拍出来的这个结果呢是一样的,那也就是说啊,当这个相机和所有的物体,所有的东西都一起移动的时候,那这张图就拍出来这张照片一定是一样。
对不对,那也就是说我们考虑到这一点来说,那我们直接就可以分析得出一个结论,什么结论呢,那就是说当这个呃,就是说就是说我移动这个物体啊,移动不同的物体,假如说我移动的都是呃完全一样的,这个方式。
或者说我移动这个相机,其实有可能得出来的结果是一样的对吧,只要保证它们之间没有相对运动就可以,那更进一步思考,那既然是这样的话,咱们为什么不把这个相机放在,永远让相机放在一个固定的位置上对吧。
我们就认为所有东西都是这个,其他物体在移动,相机永远不动,并且相机永远是放在原点,相机永远在往负z方向看,相机永远在这个以y轴为向上方向,唉为什么要这么做呢,这个就是说大家约定俗成的一个事情啊,对吧。
然后这个啊嗯所以道理就在这儿,就是说我们把这个相机,原本他在任何一个某一个位置上,然后咱们把它给硬生生都给移动到,这么一个这个固定的位置上,那其他的物体当然是同样,随着这个相机也这么移动对吧。
那得到的结果肯定是一样的,没问题,为什么要要这么做,因为这样做可以让这个操作简化,因为这个相机放在000有很多的好处,相机沿着负z看也有很多的好处,当然会造成一定的问题,咱们待会儿会说好吧。
那也就是说这里是一个最重要的这个观测,就是这样,咱们把相机先放在一个所谓标准位置上,就是呃大家在这个回忆一下,000是中心往负z方向看,向上方向是y,当然这里大家如果做一个这个右手的这个,螺旋定则啊。
大家可以看看x x乘y是等于z啊,大家我这个画的这个轴,这里是向右的,这个轴是负z,没有任何问题,这还是右手系啊,那么这步怎么操作对吧,我们要把这个相机从任意的一种摆放,给放到这样一个标准位置上去。
那咱们做一个一一对应就好了,那么这个相机原本它的中心在e这个位置,那那这个它的朝向是指向g方向看,并且上方向是t,那么现在我们要把它给改成原点向负z,并且向上方向是y那么怎么做呢,很简单。
咱们一一对应就好,咱们把这个中心从这个e方向,先给移到零对吧,先先把这个e放e e这个位置啊,移到零,所以先把这个e做一个平移,那这个不够对吧,然后我还得把这个观察的方向,给旋转到负z上去。
把这个g旋转到负z上去,大家看到这个红颜色的点啊,红颜色的这个向量,我把这个方向旋转成跟负z一样,把这个向上方向t呢给旋转到y方向,然后呢自然而然这个x方向也就对上了,没什么问题对。
然后呢这个这就是基本的思想,就是说我们先把这个这个呃,摄像机给摆放好,o那么对于这样一系列的操作,咱们如何把它给写成一个矩阵形式呢,其实挺简单的哈,大家这个呃应该还记得,我们先做什么操作呢。
把这个e这个点就是相机原本的中心点,给移到这个原点上去,那么这个平移量自然就是负的,x e y e z e,那么就是一个简单的平移,那么在平移之后咱们再考虑这个旋转诶,大家这里就应该能意识到说。
我为什么一开始先这个先这个呃,给大家这个思考这么一个问题啊,如果我们写一个这个矩阵,这个用齐次坐标写,是先做平移,还是先做这个其他的线性变换对吧,我们知道如果写一个矩阵,它是先做线性变换,再做平移。
而这里呢我们先要做平移,所以先写出一个矩阵了,在他的左边,我们再单独写这个旋转这一系列的变换,那么旋转谁呢,我们把这个这个g方向也就是看的方向啊,look at的方向。
这个呃当做这个啊呃旋转到这个负z方向,然后把这个向上方向t旋转到y方向,然后g差成t,那就是它的另外一个轴旋转到x上面去,那么这里其实是不好写,为什么呢,你要你要把一个这个这个任意的一个轴。
给旋转到一个规规范化的轴,比如说负z是什么零零-1,对不对,你要把任意的某个什么x g y g,z g给旋转到零零-1,那么这么一个数不好写嗯,然后同样道理,t旋转到y这后面这个旋转的x都不好写。
但是有一个事情很好写什么呢,反过来写对吧,大家想一想他这个x x轴,x轴是什么,100,咱们要把这个100,可旋转到某一个这个这个点上呃,这个这个方向上去,这个gg乘以t然后呢这g g插成t。
它肯定能够写成某种xyz的一种表示方法,所以你只要把100给,旋转到那个方向上去,然后同样道理,010旋转到t,然后001旋转到负极就可以了,那么这里正是说,我要求这个原始的这个旋转不好求。
那我们先求它的这个逆旋转或者逆变换,那逆变换很好写,咱们这就可以把它写出来,大家看到左下角这个方呃,这个这个矩阵,这个表示的就是这么一个逆变换,大家可以看一看,比如说啊大家可以看这个100。
如果说我们把这个啊,把这个矩阵应用在一个向量上,比如说x向量也就是1000,没问题吧,第四维应该是零,因为它是向量,那么这个矩阵乘以1000之后,得到的是什么呢,得到的就是这边的第一列。
也就是这个呃对应的这个x y z,这个g g差成t这么一个向量,它对应的x y z,那么说明这里是对的,那么同样大家也可以验证这么一个矩阵,是不是乘以0100,也就是y是不是得到这一列呢,答案是是的。
它会得到这么一列,然后也就是说,就是说左边这个矩阵它是相对好写的,也就是说我们实际要求的旋转矩阵,它的逆变换我们已经可以求出来了,那么我们如何才能得到他的这个他自己,这个这个旋转应该是什么呢。
这里就要用到我们刚才这个课程,最开始给大家说的这个知识对吧,我旋转多少,这个这个从哪儿旋转到哪儿,这个不好写,我先算这个反过来旋转,那么我只需要对这个矩阵求个逆就可以了,怎么对一个旋转矩阵求逆呢。
那这里大家会想到偶旋转矩阵是正交矩阵,所以旋转矩阵的逆就是它的转置,所以咱们把它直接转制过来,这里这个呃这个这个这个呃,我们要的这个旋转这里就可以得到了,没问题吧,哎也就是说我们通过这么一种简单方法。
然后我们把这个这个问题先这个反过来解,然后呢我们再把它给变回来啊,那么回到这里啊,大家可以看到这个r view,这个矩阵就是旋转的这个矩阵,我们已经得到了,那么配合上一开始的这个平移的矩阵。
先把这个圆点对上对吧,先把它原本的中心移到原点,再做旋转,那么得到的这个变换,这个mv有这么一个变换,就是叫做这个这个视图变换,那么我们刚才说了,相机要通过这种变换,把它变换到一个这个所谓的一个呃。
固定或者约定俗成的一个位置上去,那么其他所有的物体,也都需要跟着做这么一个变换,对不对,呃,因为我们为了保证这个相对运动不变,得到的结果不一样呃,得到结果一样对吧,然后就是说呃这呃这么一个矩阵到此为止。
那咱们这个呃这个视图变换,咱们就已经说清楚了好吧,那么呃这里是一个简简单单的总结好吧,就是说这个我们任何时候,只要是相机和物体都应用同样的变换,或者说同样的移动方法,然后只要这个相机能够移动到一个这个。
这个规定的位置上,那其他的其他物体自然也就落在了,他们这个需要的位置上,ok然后呢这里需要着重给大家多说一点,这个呃旋转呢,呃呃不是旋转这个视图变换的对吧,操作的是相机,然后其他的物体跟着变换。
那咱们刚才提到说这个相对运动,这么一个概念对吧,也就是说我移动这个移动完这些物体之后,呃,然后呢,我又把这些物体按照这个视角视图变换的,这么一个矩阵做了一次变换,因为它要和相机一块变换。
所以大家会发现啊,不管是这个模型矩阵,就是我一开始怎么摆这个物体呃,还是说这个视图矩阵,我最后呢,都是把它给应用在这个物体上的对吧,因为只要做了这个操作之后,我立刻就知道好的,我的相机一定已经在这个呃。
这个我之前设置好的位置上了,所以说这个这两个矩阵本质上做的事情,差不多一个意思,然后就是说模型或者视图变换,这两个变换经常在一起被大家称作模型,视图变换,也就是这么一个呃。
这么一个这个这个这个定义的方法对吧,这个呃,那么大家可以看到这个model view之后是什么呀,大家还记得吗,mvp对吧,p就是projection,咱们之后就要说这个投影。
那就是说当一切这个相机的人已经站好,相机已经摆好,下面就是要做一个三维到二维的一个投影,变成一张图好,那么这这里呢就是说呃,我们之后就要立刻来说这么一个事情好吧,那到这里我先这个停一下啊。
我来先看看大家有没有什么其他的问题好,我们看一看啊,啊,啊好好像这个有一个问题,就是大家有同学提到说这个啊,向上方向是什么,对吧啊,向上方向啊,咱们举个例子,就比如说我正常我这个脑袋啊。
然后我再假如他是个相机,我在看一个什么东西,我看到这个照呃,如果如果说呃,我看到这个世界它是正的对吧,然后就是说如果我把我脑袋给骗过来啊,如果把脑袋偏过来,那我看到的就是一个偏着的一张一张图。
那么同样道理对于相机也是对吧,相机也是,然后就是说如果我在相机上面,这个插一根这个草之类的东西啊,然后竖直的,然后我把这个相机这个呃旋转过来,大家会发现这个草跟着这个,这个这个相机在移动哈。
这个草的朝向就是就是这个向上方向好吧,这个就表示了这个相机是怎么样旋转的,对吧,即便是你规定好了位置,知道往哪儿看,不同的旋转得出来的结果,肯定是这个这个旋转各不相同的好吧。
或者你可以理解成方向盘的正中,然后它的向上的那个朝向,如果你旋转方向盘,那这个朝向就会这个也同样会被歪过来,对吧,道理是一样的好,那么就是说这里就是这个向上方向,那么嗯其他的问题呢,咱们之后再说好吧。
那那这里这个我们就继续来进行,这个可能是这个课嗯最困难的一部分,但是如果这部分大家这个听下来,然后觉得没什么太大问题,那我觉得就挺好好吧,然后如果大家有疑问之后,这个也没有问题。
先记下来自己的问题是什么,然后咱们之后再试图这个呃一点点解决,那么大家看这里咱们要说什么了呢对吧,要做这个投影投影,我们我们提到其实有两种不同的投影方式,诶,两种不同投影方式都是什么呢。
咱们这个各做一个解释啊,一个叫autographic,是指正交投影,然后另外一个perspective叫做透视投影,那么他们两个分别表示什么呢,大家可以看到这个这个就是这本书啊。
就是这个tiger book这本书,他们这个这画了一个这么一个例子,这个例子非常不直观啊,就是说我在看一个立方体,然后这个可以看到这个这个不同的结果,左边和右边,他们两个分别用了两种不同的投影方式。
然后大家可以看到啊,这这里这个嗯,嗯左边这幅图大家可以看到有一个现象,就是说我知道立方体啊,它这个不同的面,它有各种这个不同的这些这些平行线对吧,比如每一个面有两组不同的平行线组成。
那么左边这幅图我看上去嗯,它这个原本说在这个面上平行的,这个线仍然是平行的,然后右边这张图就不是了,我看一个立方体,我会发现,如果我延长了两条这个这个对应的线哈,比如说这上面这个面,它它对边的两条线。
然后我把它给延长,大家会发现它会相交在某一个点上,然后左右这两条也是大家这个把它给延长,会发现它会相交在这个底下这么一个点上,或者说素描啊,这这一系列的这些画画,大家就知道说这个人眼的成像吧。
其实是更类似于右边这种,就是说右边这种就是所谓透视投影,透视投影呢会有一个性质,就是说你会看到平行线不再平行,他们都会相交到某一些地方去,当然这个事情说的这这个之后,我们会说的更多啊。
就是说这个左边的这个这个呃正交投影呢,更多是用来做工程制图,然后但是这样说的话并没有说到本质,最本质的是什么呢,就是说正交投影,并不会给大家带来一种现象,叫做呃这个近大远小的现象。
而这个呃透视投影会有这么一个现象对吧,大家知道有个成语叫做一叶障目,对不对,什么叫一叶障目呢,有一个叶子叶子多小啊,对不对,但只要它放的足够靠近人的眼睛,那他就会挡住这个所有视野对吧,道理就在这儿。
然后呢,这个还有一个这个稍微通俗一点的,叫做道理我都懂,但是为什么鸽子这么大,这是个梗哈,这个这个诶嘿嘿嘿嘿,之后这个大家有兴趣自己查吧,然后就是说这里也是在说这么一个事情啊。
当一个鸽子离你非常近的时候,你就会这个拍摄到一个超级大的鸽子,比背后的行人要大,那么道理就在这,这里,就是应用了这么一个这个这个透视投影啊,那么这两种投这投影本质的区别就在这里,是否有呃。
这个啊近大远小的这么一个一个性质,那么我们反映在数学上,怎么样去说这个事情,然后那咱们这个呃,马上就这个给大家说这个事情好吧,那么这里是两个这个这张图啊,两张图来解释这个两种不同的投影。
这里这个左边就是透视投影,所谓透视投影呢,我们就认为这个摄像机放在某一个位置上,然后摄像机我们近似,我们认为它是一个点,那么这个点我们去连出一个,在空间中的一个锥,好吧,这里是一个四棱锥。
大家可以看到这个在四棱锥里面,我希望把这个四棱锥,从某一个深度到另外一个深度之间,的这么一块区域,这个区域我们管它叫frost,把这块区域里面的所有东西都显示出来,然后呢这是透视投影的做法。
那么相应的对于正交投影,它其实就是假设说我的这个相机,离得无限远好吧,离得无限远,这样的话就相当于是当我这个呃一个相机,这个比如说我从这个透视投影这里,把这个相机拿的越远,越来越远,越来越远。
越来越远的时候,跟远处的平面就会越来越接近,越来越接近,直到你把这个呃这个这个相机拿到,真的无限远的时候,那就会发现近和远是这个完全一样的大小,那么这样投影出来大家可以看到,不论这个物体有多远。
那得到的这个这个,这个就单讲这个场景来说啊,得到这些球的大小都是一样的对吧,那其实这是另外一种理解,那么就是说这两个呢咱们之后都会讲好吧,ok然后呢,这里哎这个这个这个呃。
咱们就从最简单的这个正交投影开始讲,那么正交投影呢这个很简单,非常好理解,我们刚才说了,它其实就是相当于是远处,不管远处还是近处,咱们一股脑把它给挤到这个某个平面上去,就可以了,那这个事情怎么样做呢。
这个非常简单,首先呢我们先把这个相机放在一个位置上,大家可以看到这里,这个这个把相机放在原点上,往负z方向看,并且向上方向是y诶,大家会觉得很熟悉啊,因为这个相机这个摆放,基本都是这么一种摆放方式。
然后这里最关键的一步操作,就是如果这么摆放,那么有一个好处,就是说把z坐标给扔掉,得到的结果,自然就是一张这个平面上的这个图了,就是x和y平面上的一张图,大家可以看到这个示意图啊。
这里有一个三维空间中的字母e,还有一个这个这个小方块啊,他们两个在不同的这个方向上,一个在这正向,一个在反向,然后呢呃只要我把它们对应的这些,不管是什么物体啊,这个对应的z给扔掉,那么只剩下x和y。
那得到的结果可不就是这个,大家看到xy上面这么这么一张图吗,那右边这里是一个侧面的这个观测啊,就是说我看的是y z平面,然后然后就是说如果我从侧面看呢,这个e应该在这这个小的这个格子在这。
那我把这个z都给扔掉之后呢,可不是都被都被挤在这个x和y上面,得到的就是这么一张图,对吧嗯那么这里这个有同学会问了,那如果我要把它给这个z都给扔掉,我如何区分物体的前和后呢,这是个问题对吧。
那这里之后我们再想办法去解决,然后呢这个啊这里没完哈,这个当你把这些这个这个呃z扔掉之后,所有东西都只都是在x和y上面的对吧,都在x和y上面呢,咱们再做一个基本的操作,不管它x和y范围覆盖多大。
咱们都把它移到-11乘,-11这么一个这个小的这个矩形上,然后然后这样的话就可以得到一个这个,正交投影的结果,那至于为什么咱们要把它移到这个,-11,-11呃,呃呃这个这这样一个这个矩形上面呢。
这是也是同样是一个约定俗成的一个做法,就是说这样做可以可以方便之后的计算,好吧,那么这里是一个简单的理解方式,但在实际操作中,这个啊我们图形学上啊,这样操,这样操作。
其实并没有我们要说的这一种操作来方便,所以说我们来给大家说一说,这个这个正式一点的做法是什么,好吧,那么我们的平行投影,实际上在做一个什么操作,首先我们定义空间中的一个立方体好吧,大家可以看到左下方。
这里定义了一个立方体在这里,然后这个立方体很好定义,我们只需要定义说什么呢,定义立方体的左右在x轴上都是多少,然后下上在y轴上都是多少,然后远近在z轴上各占多大的范围,我们把这个立方体这个给描述出来。
那我只需要这六个数对吧,xyz 3个轴的范围,没问题,然后呢我们把这样一个形状给呃,试图给映射到什么样的一个形状呢,映射到右边这么一个最右边这么一个形状,就是我们管它叫这个正则或者规范。
或者标准立方体好吧,然后这个英文叫做canonical cube,就是说我们不管我给我什么样的一个空间,中的这个长方体,我都可以把它给映射成成,这么一个标准的立方体,那么这部分怎么做呢。
那大家可以看到中间经过了这么一个过程,我们先把这个立方体的中心给移到原点,然后呢,我们把x y z的轴分别都给拉成这个负,11-11-1~1不就行了吗,对吧,所以这样做其实非常简单。
然后事实上来说呢,我们这个就是这么做,然后呢这里有两个事情跟大家提一下,第一这里和我们之前所说的这种,简单的把这个z给扔掉,这个呃是有一点这个不一样的地方,就是说我们先做这个呃,这个呃平移。
然后我们再做这个呃,这个叫什么来着,这个缩放缩放,ok然后这是第一点,这也是一个正规的做法,我们是这么个做法,然后第二点咱们回到前面一样,这里可以看到哈,在x轴上我定义左和右。
那是因为它这个左比右小对吧,然后在y轴上我定义一个下和上,bottom top嘛对吧,因为下比上小,然后在这里其实有一个并不直观的一个,这个定义,在z轴上,我们定义的是这个这个物体,离我们远还是近。
但是大家会发现远近就是f和n啊,其实远呃和这个近,它们各自代表的这个z的这个值,大家可以看一下,这个z的方向其实是向y的对吧,我们是看着负z方向,所以如果一个这个呃一个面离我们远。
其实意味着它的z值要更小,然后如果一个面离我们近,那就意味着它的z值其实要更大对吧,那也就是说呃这个圆其实是小于近的啊,这里是这么一个这个做法,这里的这个原因很简单,就是因为这个这个呃。
我们是沿着负z方向去看的,就是就是因为是这么一个一个事情,因为我们为了保证这个右手右手坐标系,这也是为什么说这个呃这个呃啊,ok,这,这也是为什么说这个在一些这个图形学的,a p i里面。
比如像open gl,他们会假设说我们用的是左手系,因为左手系在这一点上会相对方便一些,但它会造成别的问题,x x乘y不等于z对吧,就是说这个好处坏处肯定都是有的,那咱们仍然坚持右手系。
那就是这个意思好吧,那这个就是说对于我们正交投影来说,就是呃,我们会把任何一个这个形状给变成,这么一个这个canonical的,这个这个这个这个立方体啊,标准立方体好,然后呢,这个我们现在要做的。
自然就是,把这么一个变换给写成数学的形式,用矩阵来做,那么这里就非常非常非常直观了对吧,怎么做呢,我就把这一个立方体,首先这个平移把它的中心啊,中心什么是中心呢,就是左和右的中心是什么呀。
就是l加2÷2对吧,把这个中心移到原点,那就是沿着这个负的方向去移动,那同样下和上也是近和远,也是远和近也是对吧,我们先做一个平移,把这个中心移到这个圆脸上,然后呢咱们在这个在在这个呃做一个缩放。
把x y z他们的这个宽度啊都给变成二,为什么变成二呢,因为-1~1吗,它覆盖的范围是二,那它原本的覆盖的范围是什么呢,比如说左和右,那它覆盖的范围就是r2 减l对吧,那我要把它给变成二。
这就是我要在它上面乘以一个这么一个,缩放的因子,使得说这个最后我缩放完了之后,xyz各自覆盖的范围都是-11呃,所以说我们管它叫-11的三次方,定义的这么一个这个标准立方体,那自然而然这个非常好写。
所以说对于这个呃,这个这个正交投影非常简单,就直接写成这么一个形式,两个矩阵相乘就可以了,那么这里也就呃呃结束了好吧,然后这里之前,我这两点就已经给大家提过了,这么个事情啊,就是说啊。
就是说这个首先一个是,因为我们是沿着负z的,所以说近其实大预言,然后呢,另外一个,这就是为什么像这个open gl类似的api,他们用左手系,然后呃这个没有关系,然后所以如果大家之后涉及到。
比如说作业啊或者干什么,可能在网上看到的结果,跟我们结果正好相反,这个是很很很正常的事情啊,也就是说这个考虑到大家用的这个这个,坐标系的不一样,还是有各种不同的好吧,那么这里就是这个这个正交投影。
那么咱们这个呃好吧,再说这个透视投影之前呢,呃我我先看一下啊,大家有什么各种各样不同的问题,嗯好有同学问平移为什么是负的啊,平移是负的,是因为你要一个空间中的x y z。1~0。
那你可不是要按照负x负y,负z z去移动它,它才能得到这个零对吧,这是一个另外一个说这个啊,有同学说啊,为什么不考虑旋转啊,这个事情就相对复杂一些,那么之后再说吧,那这个说嗯ok再看一下啊。
哦说如果我们把一个这个原本的这样,一个长方体这个这个范围哈,然后如果我们把它给这个缩成一个立方体,那这些物体难道不会被拉伸了,会会一定会的,但是这个这就涉及到我们之后会说的,另外一个b变换。
在所有的变换做完了之后,这个物体在这个呃,就是说所有物体都在这个-1~13次方,这么一个这个立方体里面之后,还要做一个叫做视口变换的事情,这里还会做一次拉伸,所以说这个之后我们再考虑好吧。
就是说这里不是问题,就是说做完了这个投影变化之后,确实这个物体是什么东西,不管它的长宽比原本是什么样的,都会被拉成这样一个这个这个呃标准,这个这个嗯立方体好吧,然后呢我看一下啊,这里啊变换。
有同学问为什么不用坐标系来呃,坐标系的变化来解释这一点,其实是我个人非常反感的一个事情啊,个人个人啊,就是说这个我觉得变换一些物体什么东西,这些都相对好理解,变换一套坐标系。
从一个坐标系变成另一个坐标系,导致其他的物体,这个坐标都会发生一系列的变化,这个我觉得不直观啊,不好理解呃,虽然来说本质上是一样的,没什么关系啊,ok归一化的长方体怎么得到的啊,也就是一开始的输入对吧。
一开始的输入是这个,当然是这个规定好的对吧,如果我们要对某个空间中的某一块儿,然后进行这个呃这个这个正交投影,那我们先把这块儿给规定好,我到底要要让它显示什么,这当然是我们自己说了算好吧啊。
就是就是这么个意思,然后嗯精度上会有问题,这个之后我们会嗯不一定有时间吧,有时间我就会提这个事情好吧,那咱们这个就先说到这儿,其他的问题看起来相对复杂一些啊,然后这个嗯o嗯,那那咱们就继续说。
那咱们刚才已经说了,正交投影,正交投影是相对简单的一个投影对吧,那咱们现在要说这个复杂一点的投影,但是咱们应该已经说明白,这个这个正交投影了,那么这个透视投影啊其实就并不难。
首先透视投影是用的最广泛的一种投影,然后在各种各样的这个这个,图形学的应用里面,几乎都是这样的投影,然后呢近大远小满足这么一个性质,然后呢这个这个嗯他能够带来的视觉效果,就是平行线就不再平行了。
大家可以看到这个a b这么一条线段,在投影到这么一个这个一个平面上之后,它就变得不再和这个之前平行,当然之前平行的线,现在看上去也不会暂时平行,这个呢,这个大家可以通过这么一个例子来看。
首先呢在这个欧式几何,就是欧几里德规定的几何里面,但要是这个这个定义的清楚,什么是平行线永不相交的两条线对吧,然后那平行线永不相交对吧,这是对的真理对吧,那么在这张照片上大家会发现不对不对啊。
这两条铁轨显然是平行的对吧,而且他们不仅在这张照片上相交,而且我还可以把这个相交的交点指出来,那就是在这儿,对不对,这个这个我们完全可以看得到,轻而易举的看到它确实会相交,在某一个点上。
那这个到底是怎么回事呢,那也就是说啊在同一个平面里面,然后这个两条线段呃,呃两条这个平行线肯定是不会相交的,那么在透视投影的这个情况下吧,这个嗯一个平面,它相当于被投影到了另外一个平面上去。
然后在这种情况下,它就不再是平行线了,这一点就是这个透视投影带给大家的一些,这个不同的地方,这也是为什么大家会觉得,这张图看上去很自然,那如果说真的用正交投影去生成,这么一张图。
那大家就会看到非常不对劲的一个效果,就是这两个这个这个这个这个铁轨,是不是永远不会相交,这样大家反而会觉得别扭对吧,那么呃这里就是这么回事了,就是说欧式的几何,指的是同一个平面内的啊。
那咱们这里是涉及到更多这个不同的平面,不同的角度,那么这个我们在这个,具体说这个事情之前啊,然后这里相对困难,然后我看一下啊,这节课不好意思,要不然的话咱们拿到下节课说,估计又得花更多的时间。
那么这个呃不管怎么样吧,咱们希望把这个事情说清楚好吧,那我们在做这个透视投影的时候啊,有一些这个数学上的基础,我们需要这个再回忆一下,呃什么呢,就是我们之前说的这个齐次坐标,它有一个定义对吧。
就是说我们看啊x y z1 ,它当然表示空间中的点x y z,那么只要我乘以一个4%个数,都乘以任何一个k,只要这个k不等于零,那么我这个k x k y k z k这个表示的点。
它就也是这个三维空间中的xyz这么一个点,没问题,那么这里我们更进一步,那么我们既然可以说,那我乘谁不是乘呢,我我我乘以z好吧,x y z我都还有那个一,我都让它乘以z。
那可不变成了x z y z z平方和z吗,那它表示的点还是这个空间中的x y z点,没有问题对吧好吧,那这个这个当然了对吧,因为z也属于任何一个数,这么一个范畴对吧,所以当然是可以的。
那么我们为什么要着重说这个事情,是因为我们要用到它好吧,然后这个例子当然非常简单,1001和2002,表示的点都是同一个点,并且是100好吧,这个简单但有用,咱们之后就会知道,那么对于这个透视投影来说。
我们怎么样去理解它对吧,我们回到这个透视投影上,我们刚才已经说了啊,这个这个叫什么来着呃,正交投影啊对吧,正交投影这个大家已经知道怎么做了,就是空间中的一个这个长方体对吧,我们规定一个这个呃。
进和远这两个平面没问题,那么同样道理,我们刚才说透视投影怎么来的呀,是从一个这个呃一一个点开始,然后往外延伸出来一个四棱锥对吧,这个点就是我们的这个相机,然后我们现在认为哈。
就是说我们从一个点往一个这个呃,这个方向上去看,然后同样我们定义一个进呃,和远这么两个平面好吧,然后在这里就是反应在左边这么一个东西,上面,这个这个叫做frost好吧,然后然后这么一个形状。
也就是说大家可以对比一下,这个形状和空间中的一个这个呃长方体,它的区别是什么呢,首先都有一个近有一个圆,然后呢但是这个圆的这个平面,这个相对大一些,然后这个这个在这个立方体里面。
这两个平面是一模一样的对吧,那么大家会发现,那这是不是就是它这个这个主要区别对吧,就是说大家可以看这个,透视投影和平行投影的区别,无非就是说这些线大家可以看到啊,这个上面这个这个frost也好。
对右边的这个呃长方体也好,这个他这基本上要做的事情是什么呢,就是说把这个线的右边这头给投影到左边,这头就可以了对吧,我们要做的这个透视投影也是如此,对我们看到后面这些东西,为什么大的东西会变小啊。
因为这些线都在往里收缩嘛对吧,然后它就会变成这上面这么这么几个点,好吧,就是相当于是大家看这几道线就可以看到,那么主要的区别是什么,这一目了然,大家可以看到,那么一个基本的思路就产生了。
那么我们怎么去做这个透视投影,透视投影非常困难对吧,然后我们如果要直接写出来,当然是可以的,而且大家可能会看到很多图形学教材,就是在做这个这个直接写,咱们硬生生把这个呃这,个透视投影的矩阵写出来。
但是我觉得这样不好理解,好理解的做法是什么呢,咱们假设说啊,大家能看到吧,这个我鼠标线的短暂停留一下,这么四个点,咱们把它往里挤,然后他们是这个在同一个高度上,然后就把它给挤成了一个空间,中长方体。
没问题吧对吧,那所以说我们可以看这个呃,我们可以做这么一个操作,那做完这个操作之后怎么办,大家会看到这些线,然后经过,这个正交投影就可以把它给投影到这个,对不对,也就是说我们把这么一个透视投影的过程。
拆成了两半,第一我们先把圆平面,以及它中间的这些位置,比如说像这个终点,它当然也要往里挤,然后这个靠近它的这个点也要往里挤,先把这个frost的形状给挤成这个长方体,然后我们再做一次正交投影。
问题就解决了,那么正交投影我们知道怎么做,那么现在的问题就是,这这不给这个操作怎么做对吧,那呃这个事情呢,首先我们是口语化的定义,但是我们要把这个事情给说清,楚有有几点事情得规定。
那么在挤的这个过程中啊,咱们定义几个事情,或者说规定几个事情,就是说我们对应这四个点,就是说这四个点在这个经过挤压之后,它仍然得是这四个点,它完全不会变化,而且任何一个点,其实这个平面上的任何一个点。
在这步操作下都不会变对吧,那么这可以这么这么理解,那么呃远处的这个平面呢,远处的这个平面,大家可以看到这个它的这个呃z值是f,然后我们还规定一点,它它当它挤了之,后呢它的z值仍然是f。
就是说它的z不会发生变化,它只是说在向向里面收缩好吧,在这个平面内向里收缩好吧,那那这一点我们也规定好,然后呢我们再规定一个事情,大家看这个中心啊,就单讲这个我鼠标线的悬停的这么一个点,那我挤了之后。
这个是不是它还得是中心对吧,然后我认为这个中心点它也不会发生变化,那咱们就说了几个不同的这个,这个这个定义了吧,基本上把这几几个规定都给做到之后,那可能得到的,就是这样一个挤压的做法。
就是一个唯一的一个解法,那么这么做就是有什么好处呢,咱们之后很快就会看到,那咱们再回到这个透视投影上来看啊,我们知道正交投影怎么做,现在的问题就是,如何把frost给挤压成这么一个,这个长方体。
就这么一个事情,然后我们要求这个矩阵,这个矩阵写得清楚,叫做perspective to autographic,就是从透视到正交结束了之后,我再做一遍正交投影就可以做做,做完整个透视投影。
那咱们就现在针对性的做这一步,就是挤压这一步怎么做,那么这里怎么做呢,我们假设说我们,可以从侧面往里面看啊,往这个这个整个一个这个frost上面看,也就是说大家可以看到左边哈,这个点。
这个点呢就是说我这个相机摆放的位置嘛,然后它向上方向是y,他再往复这方向也就是右边看,然后也就是说右边看到的这么一个区域,这块的区域,就是这个我要看到的近和远的一半哈,就是说它其实这个下面这一半。
也是应该画出来,但是只看这一半应该能说明问题,那么我想知道啊,对于任何一个点x y z x y z,假如说它这个呃原本在x y z,那么它经过了这个呃挤压之后,它,会变成什么点对吧。
那么呃这里怎么样去理解呢,大家可以看这里,就是说大家看到这么一个点,这么一个点,这个嗯他会被挤压往下面去,这个点一样,也就是说这个点最终会移到和左边这个点。
x primary primary prime一样的这个高度对吧,没有问题吧,然后然后也就是说大家看到这一个,这是一个侧面的视图,也就是说,我可以找到一个y之间的对应关系,就是说大家看这幅图的时候。
就会发现原本的x y和z别的我不管,我就只盯着y来看,我会看到一个,相似三角形在这里,这里相似三角形怎么形成的呢,我是沿着这个方向往这边看对吧,这这是一条边,我知道是near,然后呢演的这么一个距离。
我知道是是是这个范儿对吧,然后就是说近和远这么这么两个这个距离,我也都知道,那有这个相似三角形我就可以算出来啊,原来我原本的这个y经过挤压之后,会变成y prime。
那么y prime和y之间的关系是什么呢,也就是这么一条线段,和这右边这个长线段之间的关系,那么它们两个的比值根据相似三角,形我们知道一定是等于n和z的比值对吧,就是说它对于任何一个深度的z啊。
不一定是这个范儿,对于任何一个深度的z,然后它和这个n的比值,一定都等于这个任何一个xyz点,它的这个y的高度和y prime的比值对吧,那这样的话我就可以得到y prime,就等于n除以z乘以y。
也就是说什么呢,也就是说任意一个点它的y会被如何挤压,这个事情是相对清楚的,因为其实从这个上面这个也可以看到,这些都是线性的变化的嘛,就是说只要给你任何一个点,你知道它的xy和z,然后你就知。
道他这个被挤压之后,它的y是什么,也就是说对于这个远处来说啊,它这个会被会被挤压的,和那个呃这个呃和这个近的这个点,它的这个y值相同,对不对,然后对于对于这些内部的点,然后它会经过什么样的一种挤压方式。
都可以通过这么一个相似三角形算出来,并且都满足这么一个规律,好吧,那就是就是这里,我们先找到了一个对应关系,就是说经过挤压之后,这些点它们对应的x和y都怎么变,这里是看y那对于x是同样道理。
那就是说我们可以得到啊,任何的这个呃呃给你x,y z经过了这么个挤压之后,用n除以z乘以它对应的x或者y,就可以得到它的新的坐标,x prime和y prime对,然后呢这里就是已经告诉大家很多信息了。
为什么这么这么说呢,大家可以想,原本给你任何一个x y z这么一个点,你会把它变成这么一个x变成这么一个y,而且z我不知道对吧,就是说我知道这个经过变换之后,x和y都怎么变,z不知道没关系。
然后我就写hno,我就是不知道,然后反正他是一个点,它最后肯定是一,那么我给你x y z1 ,我左边乘上我们需要的那个那个挤压,的那么一个矩阵之后,一定可以得到这么一个值,现在这就是要用。
我们刚才给大家说的这个事情了,就说这不是表示一个点吗,其次坐标表示一个点,那我把xyz和这个一,我都乘以某一个这个这个固定的一个数,得到的一定是同一个点,那咱们就把它都给乘以一个z。
那大家看到这四个项我都乘以一个z,那n x除以z,也就是它新的x乘以一个z变成了n x,然后ny除以z乘以z之后就会变成ny,但不知道不知道,乘以z之后还是不知道,然后呢这个这个一乘以z那就是z哎。
也就是,说根据我们刚才这个对于任何一个点,我们知道它xy也就是上下这个如何挤压,就不涉及到前后如何移动,咱们不管就是上下如何挤压,我们就已经可以得到好x y z,一会被映射到右边缘这么一个向量诶。
那也就是说现在就是这么个事情了啊,我希望算出来它左边的这个矩阵是什么,它4x4的矩阵,它乘以这么一个向量之后,有三个数我都已经知道了,那么我是不是就已经能够填上这个向量里。
面若干的这个这个这个这个值了呢,答案是可以的啊,然后呢这个大家可以看到这个,我们左边的有一个4x4的这个这个矩阵,乘以x y z1 ,得到这么些东西,那么回忆一下咱们矩阵成怎么做呀,对吧,咱们看右边啊。
四行一列,那么第一行第一列从哪儿来,从这个矩阵取第一行,从这个向量取第一列,也就是说有一个向量呃,四个数点成x y z1 ,一定得等于n n x那那这个向量是什么呢,这个向量就已经非常明了了。
只能是n000 ,为什么呢,n乘以x的n x后面的零乘以y得零,然后零乘z得零,0x1也得零,ok没有问题对吧,这样一来呢,就是说这个通过这一个数,我就可以看出来啊,第一行是n000 。
那么通过第二个数n y,我就可以知道这个矩阵左边这个矩阵,它的第二行一定是0n00 ,同样的道理对吧,因为这个大家可以试点乘一下啊,0000点成x y z1 ,得到的结果就是ny。
然后第三行我不知道对吧,不知道没关系,那第三行不知道,我放在这儿,然后第四行我知道第三行我怎么知道呢,就是说什么向量点乘x y z1 ,可以得到z呢,那就是0010,对不对,也就是说啊。
我们根据这个任意的一个x y z,他们的x和y如何变化,我们就,已经能够推出那么多个,这个这个矩阵中那么多元素了对吧,那就只剩一行了,只剩一行嘛,咱们把这一行给填完,任务结束对吧。
那么这一行大家可以看到,那势必要跟z有关系,那么我们我们刚才的这个这个推导,上来看哈,我们只知道说根据相似三角形,他这个原本的这个y和x都应该变成什么,新的y跟x,那我们可不知道它z会怎么变。
我们我们也从来没有规定说它的z不变,好吧,它们的z不变,而这也就够了,这就是我们现在需要的这么,这么两两个这个呃小的观察啊,虽然很小,但很有用,然后呢呃大家看这两个观察是什么呢,第一任何一个点。
也就是说这个矩阵它对于任何的x y n1 ,这样的点,为什么x y n一呢,对于任何的x y n1 ,然后运算完了之后,一定还得到的是同一个点xyn没有问题,然后呢圆的平面两个平面。
虽然它的x y会往里挤啊,但是它的z没有变化对吧,这也是咱们刚才规定的远处的这,个平面上,它的z经过变换之后也不会发生变化,那咱们把这两点给利用起来,那么怎么把它利用起来呢,啊大家可以看到这里。
我我说如果说这个左边,这是一个这个通用的这个写法啊,那我把z认为是n,也就是说对于这个xyn 1,他永远会被映射回他自己,xy n一就乘上这个矩阵之后,一定等于他自己等于他自己这事儿,可可是这没5万哈。
就是说我只说他会表示相同的这个这个啊,相同的三维空间中的点,可是没说在齐次坐标下的表示一定得一样,对吧,那他自己xy n1 ,那也可以写成什么呢,也可以写成n x n y n平方和n没问题吧。
就是我把四个数都乘以n,那我表示的点当然还是他自己x y n,没有问题,所以把这一个向量是可以通过这个矩阵乘,映射成右边这么一个向量的,而这四个这这个向量,它们它们两个向量表示的都是同一个点。
x y n,所以没问题,那么咱们现在再看这个信息,可以告诉我们什么呢,这个信息可以告诉我们哦,这个unknown这个数,现在它现在我们知道啊,对于一个这个呃给定的这个呃深度n,那么呃我们。
可以知道呃得出来的结果,左边就是这个向量xy n1 ,左边乘以m之后,它的这个第三个数是n平方,那么我们可以把它写出来对吧,矩阵的第三行呃,四个数,这四个数乘以这么一个矩阵,得到的是这第三个数n平方。
那么呃我们想象一下啊,这个n平方显然和x和y都没有关系,所以如果一个向量点乘这么一个向量,可以得到n平方的话,那么我前两个数必然得是零,它不能是任何的,比如说零点多少x加多少y,它跟xy一定都没有关系。
零零后面两个数我不知道,有同学说了,那后面两,个数会不会是n和一啊,因为n乘n得的平方一啊,不n和零哈,就是说0x1得得零,n乘n的n平方加起来是n平方,可是这个事情说不准,为什么呢,你可以a等于零。
a等于零,零乘n等于零,然后b等于n平方,n平方乘以一也可以得到n平方,所以说呃通过这这个一个性质啊,还不够还不够啊,就是说我们的第三行大家还记得吗,刚才这个矩阵缺第三行,通过这个方法。
我们已经可以把它的前两个数都填成零了,那么现在就只有说这个这个a和b,这两个数我不知道,但是没关系,我,知道这么一个式子了,已经就是零零ab乘以x y n一等于n平方,那咱们现在只用了一个性质。
然后呃任意一个点,我们都可以通过他们这个在变换之后,不变这么一个属性,然后来这个推出这个两个数,那么别忘了咱们还有另外的两个数对吧,另外不是另外两个数,另外一个观察到的现象。
仍然是这个满足这么一个性质的什么呢,并且咱们就取一个点,什么点呢,那,咱们先回到前面的这几页上面去啊,这个大家还记得吗,我们刚才说啊,经过挤压之后,但是有一个点很特殊,在这个中间的这个点上。
它的x y都是零,经过挤压之后,它不仅他还在这个x y z上,x y f上,它位置也没有发生变化,它仍然是00f对吧,所以00f这个点经过这个变换之后,挤压之后,它仍然是这个面的中心点。
所以咱们再回到这一页上来看,00f这么一个点,经过变换仍然等于00f,并且呢咱们还回到,刚才这个式子上来看,大家看到x y y z,一会被映射到这个最后一个数,得是z来看啊,这个这个数等于是z。
所以所以说咱们同样道理,00f一映射回00f一之后,但不够,我们希望最后一个数是f,那么就把所有东西都乘以f,00f1 ,跟00f平方f表示的完全是同一个点,00f没问题。
所以呢咱们现在就看这个零零ab这个向量,也就是原本的这个啊,矩阵的第三行乘以这么一列,得到的结果应该是这么一个结果,那咱们可以把它展开,咱们也可以,把它给这个展开,那么我们就得到了两个式子啊。
我们得到了一个式子跟ab有关,我们得到了另外一个式子,这个式子呢也是也也是跟ab有关,那么把这两个式子放在一块儿,我发现啊,近和远我们都知道那两个式子,两个变量我们当然可以解除,a跟b都是什么。
好到此为止,咱们终于把这个矩阵给填完了,哪个矩阵,这个perspective to orthographic,也就是说,我们把这个这个这个,这个从透视投影的这么一个frost。
我先把它给挤成了一个这个长方体好,那么,我们把这部分完成了,完成的时候怎么办呀,还要继续做正交投影对吗,这也就是说我们先把这个矩阵呃,这个做完再做另外一个正交投影,结束了之后,这两个再合在一块儿。
这就是我们要的透视投影,我们最终就可以把一个任何一个远处的,是什么点被投影到一个这个这个上面嗯,好,到此为止,咱们的这个这个呃透视投影,咱们就已经这个说完了,我这个给大家留下一个问题。
而这个问题绝对不容易,那咱们这个,嗯还是这么来看啊,就是说呃我们在这里呢,这个这个呃做了这么一个挤压的,这么一个过程中啊,我们一直在考虑说啊,对于普通的点x y z啊,它的x跟y要怎么变。
它的z不变没错,那么我现在的问题就是说,对于中间的任何一个z,比如说在n加f除以二,这个中间这个位置上啊,对于中间的任何一个点啊,然后呢对对于对于中间任何一点x y,然后某一个z然后经过变换之后。
然后它的z会变小还是会变大,还是会不变o所以是这么一个问题啊,它的z经过变换,经过挤压之后都没有发生变化,但是我的问题是对于中间的某一个点,然后他这个呃,经过这个挤压的这个变换之后。
它的z到底会变小还是变大还是会不变呢,然后另外一点是这样,就是说涉及到小跟大这么个关系了,因为我们涉及到这个这个呃,往负z方向看啊,所以这个n其实其实这个呃小于啊,呃其实大于f哈对吧。
所以这样比较容易混乱,那我问一个更直观的问题,就直接这么直接这么看,就是说当你的任何一个点x y,然后z等,于二分之n加f就是在这个正中间的时候,然后经过这个挤压之后,还是会被推向圆的平面。
大家回去可以思考这么一个问题,好吧,呃当然这个其实这么一说呢,就已经帮大家排除了这个点不动的可能性,哈哈哈哈啊对吧,我说z方向z方向不动的可能性,然后这个听上去有点不可思议对吧,我做这个挤压。
为什么还会让这个中间的点,他们的z向前或者向后移动对吧,所以这个呃是大家之后可以思考的问题,大家可以把这个z显示的写出来,然后大家就可,以看到这个这到底会发生什么变化,是会变得更像f还是更像呃好吧。
那咱们这个今天咱们就说到这,感谢大家这个持续的支持啊,咱们推了这么困难的一个,这个这个这个呃矩阵啊,当然如果大家能够理解这个那就太好了,没有任何问题,就是说这应该就是这么一个呃,我们前几节课。
或者说整个一节课涉及到最复杂的推导了,很可能就是这个好吧,如果大家觉得有什么难度,没什么问题好吧,那么呃再重申一下作业零呢,咱们今天会这个这个放出来,然后我们的助教同学还在这个努,力的这个工作中好吗。
然然后这个呃其他还有什么呢,我这样,我之后关注一下这个大家论坛上面,问题或者干什么,如果大家这节课有各种各样的疑问,欢迎提出,然后我和助教们都会这个,想办法来给大家讲解,那咱们今天就说到这儿啊。
大家这个抓紧去吃饭啊,嘿嘿嘿嘿嘿啊。
ok那咱们下期再见啊。