GAMES 图形学系列笔记(三十)

GAMES103-基于物理的计算机动画入门 - P8:Lecture 08 Finite Element Method II (Lab 3) - GAMES-Webinar - BV12Q4y1S73g

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

可以啊好吧,咱们就准时开始吧,呃呃今天事情还是比较多的,有好几个东西要讲,所以说我估计我到时候也讲不完,所以说啊我反正尽量能讲的就讲啊,但是有的地方我会尽量节奏放慢一点,然后帮助大家。

而有些知识要理解消化一下,然后有些东西可能来不及讲,那么就反正ppt在那里,然后大家有时间的话就把ppt看一下,然后啊对有一些东西了解一下啊,先讲一下作业,作业的话其实已经发给大家了。

呃如果你拿到手的话,会是这么一个东西啊,跟之前一样,是一个一个代码,然后呢你做完作业之后运行了之后呢,他会我有一段代码,它会从文件里面去读取,读取一个四面体网格,叫做house啊,然后呢你运行了之后呢。

你会看到你会有一个小房子,它会掉到地上,然后它会弹起来啊,你可以改视角,你可以看到这个小房子是这样子的啊,然后你按空格空格的意思就是可以给这个小房子一个初速度,你可以把这个小房子抬起来。

然后你再把他摔下来,嗯嗯基本上就是差不多这么一个动画效果啊,是用我们这个有限元的方式去模拟的啊,然后呢我们用的这个模型叫做我们课上也谈过,叫做s t v k,主要的原因是因为这个模型它比较简单啊。

所以说大家写这个程序的时候会稍微方便一点,但这个s t v k它有一个问题,就是如果说四面体反转了,它比如说翻过去了以后,他是没有办法把这个四面体再翻回来的,他有这么一个问题存在。

所以说大家到时候抬的时候不要抬太狠,比如说大家如果太太狠,你会看到他这个小房子的下面这几条腿啊,下面的这些四面体它都被压压塌掉了,压塌掉了以后他就翻不回来了啊,然后因为咱们这个作业是用显示积分模拟的。

没有用影视积分啊,所以说大家也知道会有一个不稳定的问题吗,如果说你这个弹得太狠啊,它掉下来它就会炸掉,你看他一下就炸掉了啊,所以说就是利用这个作业给大家啊,主要就是了解一下这些呃有限元的这个方法啊。

怎么计算力,然后啊怎么把力去更新未知速度这些东西啊,这个就是比较简单的东西了,呃主要的难点在于怎么利用这个有限元去计算力啊,然后这个作业其实跟其他几个作业比起来的话,其实这个编程的代码量可能是最短的。

最简单的啊,但是呢这个只是编程上简单啊,如果说你要去读懂怎么样去做这个作业的话,你还是要花时间去读ppt的,所以说他写的东西简单,可能几行代码,几十行代码就把这个作业写完了,但是如果说你要明白怎么写。

这个是需要花时间的,好不好,有没有什么问题,关于这个作业,这个unity脚本比较慢哦,我以前在cpu上写的时候,用用open gl写的时候比这个跑的要快多了,但是unity脚本比较慢。

所以说它没有那么流畅,啊没什么问题的话,咱们就咱们就讲今天的这个有限元的东西啊。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

看一下,就其实咱们上节课其实讲了有限元嘛,finite element method嘛,然后我们也讲了,说呃我们去定义一个能量,然后呢呃根据咱们以往的套路,用能量去对位置求导,我就可以得到力啊。

然后有了力之后呢,我们就可以把它当做一个粒子系统对吧,我可以啊,模拟这个四面体的各种形变,产生动画效果,就不是从有限元的角度,final element的角度,而是从final volume的角度。

然后这个叫做有限体积的方法,其实对于四面体,对于三角形这种简单的线性的这种呃这种element而言呢,你会发现这两种方法其实是等价的,这就是为什么我要谈这个方法的原因,因为这两个方式本质上是等价的。

而fined volume method在推导上,在他的这个数学表述上呢,要比find element method要更清晰一点,所以说我想重点的来讲这个方法。

而这个方法其实也在咱们图形学里面也是用的很多的一个方法,很多时候大家写paper,基本上是遵循了这种final volume method的这个formulation来写的。

但是这两种方法其实刚才也说了,其实本质上是等价的,那么它这个final volume method,它本质上就是基于说这个力是从何而来的这么一个思想,假如说我有两个东西啊,假如说我有两个弹性体对吧。

被一个界面背一条面,被一个某一个界面分割成上下两个部分,像这个样子,那么我其实就可以呃计算出这个两个物体之间,上下这个界面上的这个力来,这个力是什么呢,这个力我可以计算一个单位面积或者单位长度上的力。

我把它叫做t叫做traction,我把它这个单位长度或者单位面积上的力叫做traction,那么我的这个总的在这个表面上产生的力,就是这个traction在这条曲线上的积分,对不对。

如果说我认为利呃是作用在这一个表面上的,或者是这条曲线上的,那么单位面积或者单位体积的力啊,单位面积或者单位长度的力叫做traction,叫做t的话,那么我的合力总的这个表面上的这个力。

就是这个traction的这个积分了,那么怎么得到traction呢,我需要引入一个新的概念,叫做stress stress te,我们上节课讲到stress这个东西。

它本质上是一个跟利益相关的东西嘛对吧,那么这个东西怎么跟力相关的,这个stress它本质上是其实咱们在数学里面把它写出一个矩阵啊,那这个矩阵怎么样能够跟力相关呢,其实它就是做了一个矩阵跟向量之间的乘法。

我的沉的是什么,我乘的是这个表面的这个法向量,比如说我在这个点上,假如说我在这一点上,啊我想要得到这一点的traction是什么对吧,那么在这一点上,我的这个法向量是normal方向嘛对吧。

那么我只要把这个矩阵跟normal相乘,我就得到了我的traction,其实就是利用矩阵跟向量的乘法,我做了一个normal到traction之间的转化,我做了一个映射。

从normal detraction的映射,利用这个stress te,这个是我关于traction跟stress的定义,我们在物理上我们是这么定义的,那么有了这个定义之后呢。

我也就知道了咱们的利益实际上就是stress乘以normal的积分嘛,对于这个总长度的积分嘛对吧,traction是单位面积或者单位长度的力,所以说我根据这个长度记下分,我就可以得到力了。

那么这是咱们一个呃比较简单的情况,那么我们回到我们之前讨论三角形的情况,三角形的情况是怎么样子的呢,我考虑咱们的顶点啊,考虑这个x0 这个顶点,我假设这个x0 它代表的不是一个单纯的点。

它代表的是一个区域啊,这整个区域我假设都是通过x0 去代表的,在整个这个啊整个表面上,我这个区域是由我这个x0 代表的,那么这个x0 得到的这个力是什么。

是不是就是这这个区域的这个外轮廓的这个上面的traction的积分啊,对不对,因为这个表面里面它其实的内力是不产生这个作用,在这个整个物体上的嘛,这是内力嘛,真正对于这一个区域的产生作用的这个合力。

这个力实际上是表面的这个总的力的积分,那么总的力实际上就是traction嘛,所以说我是对traction在整个这一圈上的这个总的积分,这个是我真正的力,那么具体到这个三角形而言呢。

因为咱们有很多三角形,那么具体到这个三角形而言呢,就是这一段我把这个绿颜色的这个呃这个虚线,就是这个三角形对于这个顶这个这个区域这个顶点的力的这个贡献量,我把它叫做f0 对吧。

f0 就等于这个呃stress就是三角形的stress乘以normal,乘以这个曲面上的这个normal,然后再对于这条曲面曲线做一个积分,那么有同学就可能问了说诶这个曲线到底怎么定义啊,对不对。

因为这个曲线我我事先并不知道嘛,他可能歪歪扭扭的嘛,他可能嗯你怎么定义都可以嘛,对不对,那我首先做一个假设,我首先假设说这个曲线它必然是穿过x0 跟x1 ,还有x0 跟x2 这两个边的中点的。

它必然是穿过这两个中点,这是我的一个假设啊,不管它里面这条曲线怎么样,它的两个端点始终是这两条边的终点,那我为什么要做这个假设啊,我做这个假设的原因是。

因为我接下来我可以对这一个封闭的这条曲线做一个积分,啊这条封闭的曲线呢是由l,l10 ,还有l20 所构成的这三段所构成的,然后因为我们的stress这个西格玛这个东西啊,它其实是一个常数。

因为我假设这整个三角形它内部的形变,它其实都是均匀的嘛,这就是其实咱们说有限元做linear element,这意思就是我其实假设这是个三角形内部,在这个有这个element内部,它的这个形变。

它的stress都是常数,都是都是一样的,那么也就是意味着说这个stress本身这个东西是常数,都是常数,那么因为这个是常数,那么也就意味着我这一个积分实际上就是对于法向量。

在这一条封闭曲线上的积分了对吧,因为这个东西本质上就等于sigma乘以这个东西对于n的积分,那对于一个封闭的一个曲线而言,如果说你对法向量做积分,它就是零啊,因为你绕了一圈。

你把这个normal绕了一圈,然后做一个积分,他最后得到的是零,我们这个我们学过这个数学分析或者微积分类,大家应该听过这个叫做divergence theory。

就是说你把这个normal在某一个区封闭的曲线或者曲面上做一个一圈,一整圈积分,它应该得到设置,那换句话说呢,想要计算这个东西,这个是咱们的这个力的贡献量吗,我可以。

通过负的l0 跟l10 跟l20 上的积分来得到对吧,那么怎么计算这两个东西呢,诶我就可以我知道sigma是什么,假如说我知道sigma是什么啊。

然后呢我实际上就是分别对n normal 20跟normal 10做个积分了,对吧,那么normal 20是这个东西,normal 10做积分是这个东西对吧,这两个normal。

因为这两条线这两条边它都是直线嘛对吧,所以说他们的normal都是一样的,在这条边上它这个normal都是一样的,那我对它做积分,实际上也就是把这个normal乘以这条边的长度。

那这条边的长度呢是整条边的1/2啊,因为我假设这个端点是在这个中点上,所以说这就是x20 的长度除以二,x10 的长度除以二,这个就是咱们这个公式的由来,也就是说我这个三角形。

这个三角形对于x0 的贡献,实际上就是这个东西啊,除了这里除了咱们sigma还不知道以外,其他的都很简单,都可以根据这些normal啊,这些东西算出来,这里大家有没有什么问题。

其实这个东西其实跟你看这个呃,跟咱们之前上一节课讲有限元的不一样,因为咱们之前讲有限元的时候都是求导求导求导各种求导嘛对吧,这里的话他不求导它算积分,而算积分呢它又搞得更简单一点。

就直接把两条边上去做积分,你对两条边上做积分,因为normal是一样的,那么我就可以直接用长度来得到呃,有同学问为什么是终点呃,取终点的原因呢,是因为我假设这个力的贡献啊,对于三个顶点都是平均的嘛。

所以说我到时候计算的时候其实还是假,还假设这里还有可能还有个界面,对不对,那么这一块相当于是对x0 的贡献量,然后这一块呢又是对x一的x2 的贡献量,这一块是x一的贡献量。

然后取中点的原因就是为了相当于我希望它这个三角形产生的力啊,对于这三个顶点它是平均的,所以说这就是为什么咱们取中点的原因呃,三位上是不是面积分,有同学问对的,如果是三位上的话。

就变成了对于三角形的四面体的四个面的那个积分了,所以说其实只要把这个转化到面的影响就行了,所以最后所有三角形对x0 的合力不也是零了吗,啊不会是零,不会是零啊。

因为因为每一个三角形它的它的stress都不一样,你们注意到它的stress都是不一样的,它的sigma都是不一样的,如果说sigma都是一样的话,它的合力确实为零。

但是每个三角形它的stress不一样,所以说你这样子积分积出来它就不一样了,好吧那没有问题,咱们接着往下讲,咱们时间有限啊,啊这个就是回到刚才有个同学的提问了,就说如果是三维的情况是怎么样。

如果是三维的情况,就是就是面了,就是做面积分了,那面积分呢其实有对于一个三角形的一个四面体的顶点而言,它会有三个面对吧,因为每一个顶点都相邻三个面嘛啊我这里画的就比较简单,我这里没法画背后那个面。

所以我就直接画,只画了两个面,分别是呃012还有023构成的面,背面还有一个031构成的面,我这里就不画了啊,然后总的力呢总的力呢呃跟刚才很像。

就是stress乘以normal在三三这个这个叫什么这个界面上的积分,而这个界面上的积分呢实际上就是对这三个面的积分吗,为什么面积除以1/3啊,其实一样。

就是我希望把这个每一个面上的贡献都均匀地分布到这三个顶点上,所以说我就出1/3,这样子的话x0 能分到1/3,x一也能分到1/3,x2 也能分到1/3对吧,然后乘以这个normal方向啊,因为有三个面。

所以说我就做三次啊,分别把它给加起来,我就得到最后的结果了,那么这个公式咱们可以给它稍微整理一下啊,因为这个公式还稍微复杂了一点,所以咱们可以先也不算整理吧,就是把它展开一下啊。

首先对于a0 a1012 而言,就是012这个三角形,这个三角形啊,它的面积等于两条边的crosser duck除以二,对不对,这个咱们之前最早最早的时候讲这个三角形面积的时候。

讲过两条边的这个cross product的反the normal除以二,就得到了这个三角形的面积了。

然后三角形的normal是cross product除以它cross product自己的magnitude对吧,所以说这个也抵消掉了,你会发现这边就抵消掉了,同样的道理,对于第二个三角形。

还有第三个三角形而言,他们也都可以互相抵消掉,所以最后整理一下,我就得到负的六分之stress乘以这三个cross product,三个三条边的cross product。

然后这个就是啊我们finite element method在四面体上的这个效果,那么我们现在把这个formula有了现在的唯一的问题,咱们没有讨论的问题,就是这个stress怎么来计算了对吧。

我怎么得到这个stress,那么因为咱们第一节课的时候讲有限元的时候讲到了一个stress嘛,然后有同学就会想说,这个stress跟咱们上一节课讲的stress是不是一个stress,答案是否定的。

为什么呢,因为stress这个定义啊,它很特殊,我们刚才讲了这个stress是个什么玩意儿啊,这个stress,它实际上是在做一个映射,对不对。

他是要把这个normal这个表面的这个normal啊映射到这个traction上去,而这个normal跟这个traction它其实都可以有两种形式,有两个空间来描述,分别是它这个静止的状态。

我在静止的状态下,我可以描述一个表面,the normal,我也可以有一个描述一个traction的一个产生的另一个力的方向,而在形变的这个空间下,发生形变的这个当前的状态下,我也会有一个normal。

我也会有一个stress,所以说我这个解释就会很不一样了,那我们前一节课我们在讨论有限元的时候,我们定义的一个能量密度,我们这个能量密度呢是定义在reference状态下的,如果大家还记得话。

我们是定义了一个reference状态的能量密度,然后我们这个能量密度乘以reference的面积,乘以reference的体积,我得到了总能量,我们是这么算的,对不对。

换句话说我这个能量密度实际上是关于reference的能量密度,那么因为此呢我这个能量密度算出来的这个stress啊,我们上一节课我们用s s去表示这个stress呢。

它是把normal跟traction都假设是在这个reference状态下的,这个是我们上节课算出来的stress,都是关于reference状态的stress。

而这节课我们在讲有限有限体积的这个方式的时候呢,我们呢是假设有一个normal,然后呢我把这个normal转成了这个traction,转到traction之后呢。

我直接就可以把这个traction拿来算力了对吧,我假设这个力就是我们直接模拟里面所需要的力,换句话说我这里其实假设我的那个normal,还有这个traction啊,它都是在形变空间下的。

都是已经形变过后的这个normal and trans,也就是说我这个stress我们咱们这节课讲的stress,跟我们上节课讲的stress,它不是同一个stress,虽然说他们都是同一个目的。

都是想把normal转成traction对,都是要做这么个映射关系,但是因为我们用的normal跟用的traction它的定义不一样,我们这两个stress它也不一样,这就是有区别,那么也正因为此。

我们数学家他就搞了各种各样的这种描述这个stress的这个形式啊,他总共搞了四种可能性,因为我们有两种组合嘛,normal有可能是两种对吧,normal可以是在reference状态下。

也可以在形变状态下,我的traction可以是reference状态下,也可以是在当前的这个形变状态下啊,所以说我们就有三种事上常用的是三种啊,这个咱们就不考虑了,我不知道这个有没有这样的定义啊。

反正我们我是没见过我们有这三种不同的stress,分别呢叫做second piero kership of stress,first piloker of stress,还有柯西stress。

分别是三种,然后我们上节课说的呢实际上就是这个second peer pressure of stress啊,他假设normal contraction都是在reference状态下的。

而柯西stress呢是咱们这节课啊,我们刚才所说的想要的是normal跟traction都是在形变状态下的,当然还有另外一种比较怪的叫first pr,可stress。

他是假设normal是reference attraction呢,又是形变过后的,所以说有各种各样不同的形式,那么问题来了,我们想要的是coach stress对吧,我们想要coach stress。

我们其实不知道怎么算,但是咱们上节课已经讲到这个3d皮了,科学stress了,这个咱们可以通过这个d w d g,不知道大家记不记得把这个能量密度对于green rain,我求个导。

我其实就可以把这个second pierlock of stress给他算出来了,这个我其实可以算这玩意儿可以算啊,那么我现在就是说我怎么样把这个东西转成我的科西stress的问题了,对吧。

我如果能把这个东西转成科西stress,那么我也就可以计算科学ss,我有了科技dress,我回到我们前面这个p p t里面,这个东西我其实就可以把例算出来了,我这个问题就解决了嘛,那怎么做转化呢。

首先我会发现我的这个p啊,这个first pl跟second pl所有他的关系非常简单,为什么非常简单,因为我这个s这个second pl cos它其实得到的是reference traction对吧。

那么first他得到的是deformed traction,那么对于deform traction而言,我只要把reference traction乘以一个ation gradient。

我其实就可以得到deform traction,因为他俩的关系啊,他俩的关系其实就是一个deformation gredient的关系,因为not因为traction是一个矢量,对于一个矢量而言。

我乘以defamation gradient,我就可以从reference状态变到形变状态,咱们之前讲过什么是definition gradient。

他其实就做了一个呃从reference到形变的这个转化,所以说如果说给了我这个second plecs stress,我称一个definition规定的,我就可以得到first pl cos。

这俩关系是比较简单的,那么这两个人的关系是什么关系呢,我实际上需要得到normal和normal之间的关系啊,我需要知道reference。

一个reference的normal跟一个形变了以后的normal,他俩的关系是什么样子的,那这里我就想啊,我就想把这个跳过了,我就讲讲的比较简单了,大家有空的话可以把这个推导过程给他看一下。

但是我这里想省点时间,我就先跳过了,我就直接把结论告诉大家,但是大家有空有时间的话,可以看一下这个推导过程啊,结论是什么呢。

结论就是说这个coach stress啊是defamation gradient,determinant,分之一,陈以first plos of dress乘以formation gradient。

the transport,这个东西其实是它的定义,就根据咱们前面这个啊,我省略过的这几个p p t推出来的,省略过的这两个ppp推出来的,但是反正就是大家相信这个推导过程是正确的啊。

最后就可以得到这个东西,那么有了这个cos stress之后呢,我就可以构造这两个东西的关系了嘛对吧,因为我知道p是f乘以s对吧,那么我把这个p用f乘以s替代掉,我就可以得到口水stress。

最后我得到的cos stress就是有这个公式得到的,ok那么我们现在就把这个东西替换到我们刚才这个啊,这个公式里面去啊,因为咱们已经有这个计算公式了,有这个计算stress的公式了。

科西stress的公式了,我就可以替换一下了啊,咱们刚才说这个力1号顶点,这个力是这个公式算出来的吗,对吧,然后咱们也知道这个cos stress是刚才这个玩意儿,那么我就可以把它替换掉了。

那么首先咱们怎么替换呢,咱们首先这里做一个比较简单的替换啊,首先我把这个sigma用p给它替换掉,那这个替换我其实没有用刚才这个公式啊,因为这个公式跟这个公式不一样对吧。

大家有没有注意到这个公式跟这个公式不一样啊,为什么,因为这个stress这个柯西stress是把形变过以后的normal,变成形变过以后的力,这个是咱们柯西stress的attraction啊。

同最后得到力,这个是咱们科技stress的定义对吧,那么这个stress是什么stress呢,这个stress是,first plos of stress。

它跟可喜stress的唯一区别就是说我用的normal不一样,我柯西stress用的是形变的normal。

我first plocation of stress用的是眉形变的normal是reference的normal对吧,那么这里因为咱们这里,其实本质上这边右边的这一项其实就是normal嘛。

其实就是cross product normal,那么我这里其实只要把这个东西用没有形变的那个顶点来计算就行了,其实这里咱们就是用了一个小窍门啊。

没有用刚才那么复杂的这个呃这个这个stress之间的转化公式,咱们这里用了一个非常简单的小窍门,这个窍门的这个点在哪里呢,就是说因为这个东西是跟normal有关的对吧,因为本质上就是在算normal。

那么原来我们是用形变过后的normal来计算,形变过后的形变过后的顶点来计算这个东西,那么我用没有形变过后的没有形变的这些顶点来计算这个cross product。

我就可以用first pre stress,因为它俩的区别就是说我们的输入是什么输入,一个是形变的,一个是没形变的,那么做这个事情的一个好处是什么呀,好处在于这括号里面这个方框这里面的这些东西啊。

它是常数,因为这些顶点这些大x都是没有形变的,顶点位置它是没有形变的矢量,没有形变的向量,那没有形变的reference的状态它永远都是固定的嘛,对不对。

他的reference它的静止状态永远都只有一个,也就意味着咱们可以把这个方框里面的东西全都给他事先算好,我不需要我模拟的时候,我去啊去实际的去实时的去计算这个括号里的东西,因为这都是关于静止状态的。

我都可以事先计算出来,这是一个咱们做的一个简化,我们就把这个stress做了一个替换,我用first pure cos of stress替换掉这个科系stress就是咱们做的第一步。

然后咱们做的第二步呢,就是利用这个first pleasure of stress跟second pleasure of之间的差别,我把这个p用fs给它替换掉。

因为咱们之前讲了first和second之间的最大的差别,就是中间有个deformation gradi,所以我把这个替换掉,我就得到了负的六分之f乘以s再乘以b1 ,然后咱这个b一呀。

就是我假设只有这个东西,我给大家取个名字啊,因为这个写写一长串比较复杂,所以说我给它取了个名字叫做b1 ,然后这是一个常数常数向量,我可以把它事先算出来,然后second pre cos怎么算呢。

我们之前做有限元的时候计算过,就是啊就是dw d g嘛,这个能量密度对green rain求导,我就可以把它算出来了,这个就是咱们实际计算的一个方式,好吧,这里同学们有没有什么问题啊,我想听一下。

这里主要做的一个事情,就是咱们把之前用的这个柯西stress做了一些变化,变化完了之后我就可以用一个相对比较简单的方式来计算这个力了,然后这个string呢。

这个stress呢也可以根据咱们上一节课所讲到的计算方式来进行计算,对可能就是说大家如果没有之前没有学过一些这些力学的话,可能会就是因为第一次接触可能会有点陌生了。

但是公式基本上就是摆在这里给大家就是看一下,就基本上就是这个是咱们前面的这个公式啊对吧,然后呢是一个stress,然后呢对于这个stress而言,我根据他的这些定义出发。

我可以逐步逐步的一步一步的把它最终可以替换掉,然后f是这个大,f是deformation gradient,这个咱们上节课嗯,应该是讲过的,就是我是往前翻吧,我也不想往前翻了。

就是就是可以利用这些编的那个矩阵,可以把这个大f给它计算出来,就是我再往前翻一翻看看,the formation gradient,但方面是规定是在是在这计算的,大家如果还记得的话。

就是你有你有两个三角形吗,有两个形变状态吗,然后两个三角形分别有两条边嘛对吧,然后然后你把这两条边构成两个矩阵,一个是,一个是一个是形变过后的编矩阵,然后一个是没有新编的变矩阵。

然后它的逆这样乘一乘就是,对就是说这三个就是这三个方法其实是等价的啊,你其实其实这几个方法全是等价的,都是同一个方法在用不同的方式去解释,就是你这首先这三个公式是等价的吗,就这三个公式是等价的吗。

这三个公式分别对应了三种不同的stress对吧,柯西stress,second pierre科学of stress,还有second pre科学stress跟first pular of stress。

然后呢我利用这三种不同的stress,我都可以算出力了,就算出来力其实是一样的,其实对,其实其实就是其实就是不同的这个stress,不同的这个定义之间的转化。

然后我们最后呢是转化到一个呃对咱们的计算最友好的一个方式上去,然后最后就是咱们选择这个方式来做最后的模拟的计算,p表达的力为什么是一样的啊,因为我们这里是不一样的,因为我们后面的部分是不一样的。

就是这个力这个后面的部分啊,就科西stress用到的后面的右边的这个部分,用的是形变之后的四面体算出来的,右边的部分,然后p算出来的这个东西呢用到的这个右边的部分呢是没有形变的。

静止状态下的顶点的位置算出来的这个东西,cross product就这俩的区别就是在于右边的部分不一样,然后这个为什么咱们采用不同的右边的部分不一样,就能让它最后算出来的力量呢。

是因为他俩的定义所产生的,就是他俩这个stress它本质上就是做一个映射,就是把normal映射到立上去,然后柯西stress是把形变过后的normal映射到立上去。

而这个first pilot of stress p映射的呢是没有形变的力啊,没有形变的normal映射到形变过后的立上去,所以说以此根据这个定义呢,我只要把这个右边这个力啊,而右边这个normal啊。

因为右边这个本质上就是在说normal,我只要把这个normal从形变的顶点算出来的normal,变成没有形变的顶点算出来的normal。

那我也很自然的我就可以把这个stress用另一个stress给它替换掉了,其实就是做了一个不同的形式的之间的这么一个转化,大家反正如果说以前没有学过力学的话,我觉得肯定是这里会要稍微稍微要想一想啊。

稍微要想一想,但是其实其实你仔细的想,其实本质上就是它的映射会有把这个normal跟lee之间要做一个映射,然后这个normal跟li呢,它又分别又可以用形变跟没形变的两种方式去描述啊。

因为这个产生了一个差异,这个差异导致的我有不同的这个stress的定义,然后最后咱们选择了一个最符合我们这个设想的这个定义方式,就得到了这个东西,那么好,我现在就是可以在对。

咱们可以再对这个东西做一个呃简化,咱们就先首先就假设这个就是呃就这么回事了啊,就假如说大家不懂材料力学的话,反正就也先放一放,就是先来先默默的接受这个事实好吧,那么我们再接着往下走,我们接下来怎么走呢。

就是我们要讨论这个右边这个这个东西啊,这个b一啊,就是这个括号里面这个方框,这个里面这个东西它到底是一个什么东西,对不对,因为这个东西其实写的还是挺复杂的,虽然说我们都会算cross product。

知道怎么算cross product,但是这个cross product还挺复杂的,所以说我们想要再往深处走一走,看看这个coser到底算了个什么玩意儿,那么首先我们来想讨论一下b1 。

就是关于这个x1 ,我需要用这个b一来计算那个b一呢,就是这个东西,这个就是b一啊,那么首先我们来看看这个b一跟x10 做一个dot product会发生什么,假如说我这个b一根x10 啊。

就这条边我做一个dot product,这个就是transport乘以一个向量,这就是dot product,本质上,那么我会发现首先这里有一零的存在嘛,因为这里有0101就是一零的负的嘛对吧。

那么你一零跟一零跟另一个东西做cross的话,这个就抵消掉了,为什么呀,因为你做完cross product,你的结果你这个绿颜色的这个部分肯定是跟一零垂直的,你一个东西跟它垂直。

你去跟他做dot product就等于零嘛对吧,两个垂直的向量都dota product等于零,所以说它就抵消掉了,那么其次你橙色的这个部分它也有一零对吧,只不过是零一是负的。

所以说这玩意儿它也会抵消掉,它也是跟伊林垂直的都抵消掉,所以你得到的就是x10 跟x21 跟x31 做dot product,那么我这里可以把我这些顶点的顺序给它稍微调整一下。

这里反正就大家相信我这里正负号没有搞错啊,反正就把这个一零改成写成零一,然后二一写成二一保留,三一保留,然后但是他的前后顺序给它改一改,改成这个这么一个顺序,然后这个玩意儿是什么样。

大家如果还记得咱们第二节课的时候讲四面积的体积的话,这个其实就是六倍的四面积的体积嘛,对不对,因为我们之前算体积的时候,我们是写成16/6分之一的这个东西。

所以说这个东西你反过来这个就是六倍的四面体体积,首先这是第一个结论,然后另一个结论呢,你如果把这个x20 跟b一做点击啊,做点乘,做内积会发生什么,这条边跟他做内地会发生什么,啊不对,我是不好意思。

我这里写错了,应该是还能把它擦掉,应该是这条边对吧,就是这条底边,这条底边你去跟他做内积,你会发现呃呃做做做个点乘的,你会发现,首先我可以把这个蓝颜色跟橙色的这两个东西,做一个加法,做一个加法呢。

因为这里有三一吗,这里也有三一吗,对吧,他俩都有三一,那么我把这个后面的东西做一个前后顺序倒倒换一下,就变成了x21 减x01 ,那么x21 减x01 就得到x20 。

然后最后cross product x31 ,跟x20 做点乘呢都等于零,因为它也有x20 ,它也有x20 都等于零,所以说最后就玩就是等于零吗,对吧,然后以此类推,x30 也应该等于零,为什么。

因为它就是另一条底边,只只不过换了一条底边,但是反正换一条底边不影响跟这个x20 ,它其实对称的,所以说它也等于零,所以说我就会发现这三条边啊,它跟这个我们这个b一啊,她有这三个关系。

那么我为什么要做这个事情,因为我可以把这个东西写成这么一个形式啊,x10 x20 x30 ,我假如说它是一个矩阵的话,它的transpose乘以b一就等于六value。

然后零零这个其实就是咱们前面那一页的这个结论,我给她做了一些调整,那么同样的我对b2 相乘积x2 这个顶点,它也会有一个第二的这个向量用来算力的向量对吧,它相乘就会得到零六倍的ume,然后乘以零。

然后得到零,然后对b3 就会得到006倍的,所以说b1 b2 b3 也就是六倍的volume乘以它的逆了,就是这么一个形式,最后得到这么一个形式,然后换句话说呢,换句话说呢,我这个b1 b2 b3 呢。

也就是这个东西,这是什么东西啊,这个东西其实就是六倍的volume,只不过呢我是用这个这个逆矩阵的determinant分之一来描述的,这个东西其实就是determinant,x10 x20 x30 。

只不过我是因为我们我们可能在数据结构里面,我们并不保存这个东西啊,因为这个东西其实就是volume,就是这个四面体的体积吗,只不过我数据结构里面并不保存这个东西,所以说我用它的逆。

我先把这个determine算出来,然后做分之一,我就可以得到六倍的爆率,然后右边呢就是我们刚才这个编矩阵的这个分之一了,这个其实就是我整个呃推导过程。

我可以我可以发现我可以利用这个咱们前面推推出来的这些定义啊,我可以对这个东西做一个简化,然后咱们这个有限元的这个式子就可以这么写,我们的seo code是这样子的。

首先我的dm我把它叫做就是这个编矩阵啊,我把它叫做dm,我先把这个dm给它算出来,然后当然事实上我们在这个代码里面,我可以把它事先保存下来哦,因为这个东西是个常数矩阵嘛,我可以事先把它我给它保存下来。

我不需要每次都对它做计算,然后这个东西呢分之一乘以这个当前的编曲阵,这是形变,就是没有形变的reference的变矩阵,这个是形变过后的变矩阵,我可以得到defamation gradient对吧。

这是我第一步,然后第二步呢我可以得到green rain,我可以利用这个deformation gradient,我这样子乘一下,我可以最后得到这个green rain。

然后呢我可以利用这个我们的这个green rain啊,我可以对这个second pierre of stress,我可以计算一个second pure cure stress,哦不对。

这个好像是这个应该叫first pr stress,这里写错了,可以得到我这个p p矩阵,这个配矩阵怎么来的呢,我可以先做d w d g d g对吧,我得到second pre classifs。

我这个deformation规定我就得到了first,得到first,完了之后呢,我就利用我们前面这个公式,我把这个p乘以这个d m d m的food transport,我就可以得到这个东西。

然后乘以乘以这个哎,我这里好像是不是写错了,我看看啊,这里应该是没有六的,可能我这个回头再检查一下吧,这个这个常数这里是不是搞错了,然后最后我就得到了这个哦,这个应该是有六的,因为因为因为这个地方。

因为这个地方没有六,但是我们前面这个地方是有个六的,前面这个地方是有个六的,所以说后面还是有个六的,这个倒是没有错,我注意到我这里好像也写错了,这里应该是负的,transport,公式一多就容易写错了。

这个公式这边这一页应该是对的,大家可以参考一下这一页,然后我当时会把ppt也稍微改一下,然后大家就是以我改过的最新的那个ppt为准了,这个应该是有六的,我把这个六删掉,我把这个把这个叉删掉啊。

然后这个就是得到利了,然后注意啊,这个是一个矩阵,算出来的是一个矩阵,这个最后算出来的是个矩阵,然后这个矩阵我们有三列嘛对吧,那么每一列对应的三个力,然后呢最后我这个x0 这个顶点上的力呢。

我就是根据我们这个牛顿定律,我可以把另外三个力加起来,然后前面加个负号,我得到了f0 ,然后这是呃我比较推荐的一个paper,03年的这个joe tan,还有rptical,他们一起发的paper啊。

to find the volume methods for simulation of skeleton muscles,然后大家有兴趣的话可以读一下这个paper。

基本上就是把我这一页这前面几页ppt给他具体的介绍了一下,大家这里有没有什么问题啊,有问题吗,最后变形的列向量怎么给出来,什么叫做变形后的列向量,第二步,哪一个是这个吗,它这个就是一个边呢。

这是一条边呢,它每一个就是每一个列,就是每就是就是一条边嘛,我们一个四面体,我们一个四面体,它不是有三条边吗,对吧,假如说这是0123,我记得有三条边吗,我就是换个颜色,不就三条边吗。

然后这三条边就对应的这三个向量,三个链向量变形之后的坐标,就是你模拟的时候,你不是会有一个变形之后的状态,然后那个变形之后的状态它就会有三个顶点嘛,三个顶点的位置就是你的当前的这个位置。

因为咱们是影视积分嘛,啊咱们是显示积分嘛,显示分的话就是说当前你有一个位置,然后你想要根据当前的位置计算新的位置,对不对,当前的位置就会呃会有这些顶点的位置。

你就可以根据当前的位置把这个ation鼓一点算出来,然后呢你最后得到力,得到力了之后,你再去用这个力去更新啊,顶点的位置,更新速度,你就得到新的顶点的位置,新的顶点的速度就这么一回事。

然后那个你得到力之后,后面的东西后面的故事就跟咱们正常模拟粒子系统是一样的,就是你用力去更新速度,用速度再去更新力,更新位置,这边是如果是四面体的话,这边就是三维的,就是还是本质上就还是一个粒子系统。

本质上就是一个粒子系统,只不过就是这里面粒子系统的话里里面是有四面体的,然后这四面体的话会是会产生四面体所对应的力量都是三维的,因为咱们顶点是三维的,顶点是三维的,所以说边也是三维的。

然后这个其实都是3x3的矩阵,大家如果仔细观察一下的话,其实都是3x3的矩阵,然后最后得到的是一个四个向量,然后四个向量就是四个力嘛对吧,然后每个力都分别施加在四个顶点上,就这么回事,还有没有什么问题。

对,因为基本上就是除了流体,咱们做那个,其实流体里面其实也有粒子系统,基本上粒子系统这种粒子的这种方式实际上是贯彻所有的模拟的,除非你是做那种欧拉的那种流体以外,其他基本上都是都是由粒子系统,计。

算机四面体对立,对就是我们这里其实就讲因为你这个四面体的有限圆,最后算出来的其实是这个四面体的这个形变嘛,那你如果把这个四面体形变产生的力,你把整个四面体认为是本质上就跟一个弹簧一样嘛。

整个系统它其实总的合力应该是零,因为作用力跟反作用力嘛,它总最后总的合力应该是零,所以说你是四个力,你其实最后加在一起应该是零吗,那你加在一起是零的话,我就可以先把三个力算出来,三个算出来,完了之后呢。

你把这三个力加起来,然后前面加个负号,你就可以得到第四个力了,就跟咱们算弹簧是一样的,咱们算弹簧的时候不是先算一个力吗,顶点的力,一个顶点的力算完之后,然后另一个顶点的力就是前面加个负号,一个道理。

就是为了能量,就是为了动量守恒,其实就是就这么回事,四面体内有个面对点零是加f0 ,也就是traction,什么意思,因为traction假设对零对你对你也可以认为就是说你就是零点。

这个点就是跟另外三个顶点会用一个一个一个一个表面去分割的话,那其实是可以这么理解,模型是四面体构成的吗,对是四面体构成的,我其实是假设是由四面体填充的,它里面其实是有东西的。

你可它是一个实心的一个四面体,它不是一个它不是一个壳,它不是一个就是四个面,它不是只是四个面,它是一个实心的四面体,影视积分的话,我可能今天没有时间讲,但是我ppt做了,就是大家如果有时间的话。

可以去看一下那个ppt,但是我今天可能就暂时不讲了,有些人跟有限体积是同一个方法吗,其实并不是同一个方法,它其实这两个方法是不一样的,一个是积分,一个是微分的,但是只是在这种线性的element。

就是linear element,三角形,还有四面体这种特例的情况下,它俩是一样的,只不过他们在更多的复杂的情况下,他俩是不一样的,然后有同学问为什么不用高斯基点做数据积分,其实是有的。

一般来说我们做那种高阶的高阶的那个叫什么高阶的有限元的时候啊,一般来说是会有这种高斯积分的方法的,不过我们这里就是对于这种简单的就没有必要用高斯积分,因为高斯积分它本质上是要做采样的吗。

四面体可以是不同材料吗,可以啊,这种叫做这种叫做ha genius material,就是就是不均匀的材料,一般来说如果说四面体,一般来说咱们图形学里面用的比较多的是均匀的,就是homogenius。

也有做ho genius material的模拟,可以用不同的,就跟弹簧,你也可以用不同的弹性系数一样,然后咱咱们就先往下走,然后这一篇是有限圆的paper,然后如果大家有兴趣的话,可以去读一下。

不过这篇paper是关于2d的,它主要是讲三角形在衣服上,在cross上的模拟,如果说你想把它扩展到3d上,也是也是可以的,然后还有一点提一下,就是这个公式啊,你读paper的话。

你会发现那些paper都没有用,这个公式,我也不知道为什么,就是我不知道是不是因为他们没有意识到这一点,但是我后来自己推了一下,我发现其实就是可以用这个简化公式,可以自信的把这个力给他算出来。

paper里面一般来说都是直接把这个b1 b2 b3 给他算出来,分别算出来保存下来,然后再做这个计算的,实际上我发现没必要,直接可以利用这个dm来做计算,这算是一个小简化了,最后结果其实都是一样的。

只不过就是计算方式上咱们可以可以省一些,省一些计算量,然后接下来我就想讲讲一些材料了,这个其实跟我们模拟里面的材料很有关系,因为咱们之前做的比较简单,就是这个啊叫做s t b k的这种材料。

s t v k这个材料其实是有很大的缺陷的,最大的缺陷其实咱们作业里面我们可以体现出来,就是他没有办法处理反转,它翻过去了以后,他又转不回来了,其实真正的在材料力学,结构力学,还有在这个工程里面。

其实s t v k是用的很少很少的,而是在图形学里面用的比较多,因为大家有的时候都是想比较偷工减料,都想把这个事情搞得比较简单嘛,所以用的s t b k事实上在工程里面用的不多。

所以说我这里也想讲一下比较通用的啊,有什么样的模型去构造这个啊,计算stress,构造这些string stress的这些关系,我们这种材料就叫做hyper elastic material。

这几个意思呢就是说我这个模型是通过能量密度来推出来的,就是怎么样利用这个能量密度供了一个从,到stress的一个映射,首先我想这里想先跳过吧,因为这个比较复杂,我就我就先讲这个吧。

就是说有一类材料它比较特殊,叫做iso tropic material,tropic的意思就是各项同性,我们在现实生活中可能大家也会碰到,就比如说像我们的橡胶,它是各项同性的,什么叫各项同性呢。

就是这个材料在不同的方向上,你去拉伸它,或者是对它产生形变,其实效果是一样的,你横着压跟你竖着压其实没有区别,我们把它叫做iso tropic material,有的方有的物体。

有的材料它不是各向同性的,它方向是跟方向有关的,比如说你横着压跟竖着压,可能跟斜着压都不一样,那么叫做a s topic material,但咱们就不讨论了。

咱们今天主要就是想说说这种iso topic material,iotropic material,它有一个什么特点呢,他这个特点就是说你可以先假设这个。

大家记不记得这个p叫做first pre stress,我们这模拟计算里面用到的p啊,可以认为是deformation gradient的一个函数。

因为咱们之前的时候我们是说这个东西是根据string算出来的,是根据这个green string,格林string算出来的,string本质上是关于deformation gradient的一个函数。

所以说我本质上我这个i p也可以写成f的一个函数,我这个f如果做一个s v d的话,我可以得到三个部分是两个旋转,大家如果记得的话,你对这个ation gradient做一个s v d。

你可以得到两个旋转,加一个,然后这个d diagonal的里面呢把它叫做principal stretch,本质上就是说你这个defamation gradient,这个线性的形变。

我可以用旋转拉伸跟旋转来表示,我们最早最早的时候,第二节课的时候也讲过这个东西,不知道大家记不记得,就是说一个线性形变transformation,你可以用旋转拉伸旋转来描述。

那么中间这个拉伸的这个量啊,它其实是个对角矩阵嘛对吧,里面的每一个元素呢,它其实就描述了三个方向上的拉伸的量,把它叫做principal stretch,也就是主拉升量。

那么有了这个defamation gradient的s v d之后呢,iso tropic material,你可以发现你其实可以把这个u啊这两个旋转都扣到外面去,然后呢你中间这个。

就单纯的变成了一个principle stretch的一个函数,这句话说我其实可以把这些旋转都问题里面剔除掉,我直接把这个stress,直接把这个p啊跟principle stretch发生关系。

这是其实是他想要做的一个最主要的目的,就是不不管你这个形变,不管你这个ation gradient,这个linear transformation有多复杂,归根结底。

我只需要知道我最里面的这个拉伸的这个矩阵啊是什么样子的,然后我根据这几个拉伸的量,主方向上的拉伸量可以构造一个构造一个stress出来,然后两边乘以rotation matrix,我就可以了。

常呢在很多paper里面呢,大家喜欢把这个p呢用三个变量中间变量去描述,这三个中间变量我们叫做principal invariance。

然后呢第一个呢是就是三个principal stretch的平方和,第二个呢是四次方和,然后第三个呢是啊平方的两个平方的乘积分别的加起来,然后反正大家这个呃了解一下就就可以了。

倒也不用特意的去啊记他这个反正就是跟跟材料,跟跟这个数学他们相关的一些知识吧,相当于也是给大家科普一下,就有一些公式了,就比如说s t v k就是这么一个公式,who can。

这个是其实是在我个人觉得是材料力学里面,大家其实用的更常见的一个模型叫做你hook更标准的模型,然后其实你可以看到这个名字,new new就是新,who can,就是胡克胡克定律的胡克嘛对吧。

相当于就是一个新胡克的一个定律,新胡克的一个公式,这两个东西呢其实有两项,这两项分别是什么意思啊,一项呢是抵抗拉伸的一个物体,你可以去拉伸它对吧,朝不同的方向去拉伸,第一项它主要的目的是为了抵抗拉伸。

第二项是为了阻止以积或者面积的改变,大家有没有注意到,就是说咱们现实生活中,比如说你一个橡胶去拉一块橡皮,橡胶当你这样子拉的时候,中间它会缩短,它会试图会保持体积,是那么保持体积的。

这个也本质上也就是你洗希望它这个体积不发生改变吗,所以说这个东西也就是为了阻止阻止这个体积的改变,有同学问sharing不是剪切吗,对sharing的字面意思是剪切。

但是这里的话它其实就是各种各样的拉伸,其实都是在这个sharing里面的,其实你这个拉伸其实也是一种sharing,就是不同方向上的sharing,还有一种叫做moon revenue。

其实是一个new hoan的一个增强版,还有放mod,这些都是比较常见的,就是拿来模拟,就是描述橡胶,还有模描述这个放一般来说是模拟这些人体组织,一般来说是用这种模型,就是这里就是给大家科普一下啊。

我们想要利用这个是嘛对吧,我们想要计算这个first plos of stress对吧,算了我就用dw d这几个东西算了,wd这个lambda算了,然后这些是principal struts。

我知道这个w是这么一个公式对吧,然后这个i c和2c啊,分别是前面这几个东西,这个定义利用这个公式其实就可以把这些把这些东西给它推出来,我就想把这个东西留给大家一个作业啊来做了,这里我就不细讲了。

反正就是大家回头做作业的时候啊,作为附加题啊,然后看一下怎么样去把这个东西给它算出来,然后有了这个东西之后呢,我就我这个东西就比较简单了。

我就我就把这个之前我我计算second pr课程of stress的时候啊,我之前是用这个p等于f乘以s那么算的嘛,对吧,等于d w d d g吧,我之前是这么算的。

现在我对于这种材料还elastic这种模型,我可以利用这个公式来算,you呢,跟v呢就是它这个对于defamation古一点的s p d这个里面的principle。

stretch呢就是分别对应这些dma dma 2,那么到三,然后这个三项呢可以根据我们前面的这个这公式给它计算出来,然后就可以得到利用这个不同的这个里面的这项啊,我可以不同的w呢。

我可以模拟不同的弹性模型,我可以模拟sd vk,我可以模拟你,who can,还有等等等等各种不同的模型,其实就是对他做了一个改变啊,那跟前面的那个伪代码相比呢,我这里多了一步需要做s v d。

前面不需要做v s t v k,不需要s v d,那这里需要s v d,所以说这里的话会稍微复杂一点啊,然后咱们package我给大家的那个package里面已经有那个s b d的代码了。

所以说大家不需要自己去写s b d代码,直接调用那个函数就可以了,所以说稍微简单一点,所以说这个东西反正就是呃大家课后呃,相当于做一个啊自学的一个小东西吧,给大家一个,反正我这里讲的也比较简单。

可能讲的比较快啊,而且大家要大家就是有一点需要确定的,就是说这两个东西其实算出来结果应该是一样的,把东西算出来的结果应该是一样的啊,对于同样的模型而言,他们算出来的结果是一样的,所以说你做附加题的时候。

你也可以利用我们前面那个计算出来的东西去做一个验证,如果说算出来的不一样,肯定是你哪里写错了,或者你哪里理解的不对啊,所以去看一下我在我的这个我自己的那个学校的官网上,我也我也有开源的代码。

并不是说做这个这么简单的模拟,但是它里面其实也有一部是做这个类似的计算,所以说大家如果是呃没看看明白的话,可以去看一下我那个开源代码,可以去看一下计算过程是什么样子的,作为一个参考吧,然后我们前面讲了。

不是说s b k有一个问题吗,啊这里就是反正就给大家看一下,这个问题是横轴,横轴是形变示例,然后你会发现它这个有什么问题啊,问题就是一的时候零的时候是那时候是没有形变吗,对吧。

你会发现他一开始产生形变之后,哦,不对不对,这个好像有点问题,这里应该是一个你可以把它认为想象是一个弹簧的长度吗,这时候是没有形变,没有形变也就没有利,没问题对吧,一的时候没形变,没力都好。

然后当拉伸的时候没有什么问题,升的越大,你力越大对吧,压缩的时候你开始压缩,然后产生的力也没有问题,s b d k有什么问题啊,就是当你压到一定阶段之后啊,他这个抵抗反而变小了,而不抵抗了。

甚至你当你把所有的点压成零点的时候,就压到零的时候,你反而没有抵抗了,如果说你反方向压,就是你这个四面体如果被反转了以后,这个力也会反转,换句话说,你这个四面体被反转之后不会回到这个状态上去。

这是我们想要的静止状态,它会停留到这个状态上,这个反转的这个状态啊,它会停在这个状态上去,这是sdk的一个很大的一个缺点,四面体或者三角形它被压缩甚至产生反转的时候,它会翻不回去,你who can。

它其实避免了这个问题,就是他当你压缩的时候,它这个力会变得越来越大,越来越大,甚至趋向于无穷大,所以说它就会最终会是这个问题,四面体怎么反转,什么叫四面体的反转,就是说比如说我这个四面体是这样子吗。

对吧,四面体是这样子的,反转就意味着这个顶点跑到另一侧去,如果这个顶点跑到另一侧去,它就发生反转了,像一个气球一样,你把它翻过来,它本来一个气球是一个球壳,是这样子的,你把它翻到另一侧去。

它就变成这个音这个状态,是一个四面体的反转,利用咱们之前你可以用咱们之前算体积的方式去验证啊,如果反转的话,它体积会变负的,就会凹进去了,收敛啊,他还是可以模拟成功啊,就是咱们作业里面其实会试嘛。

就是可以模拟成功的,还是可以收敛的,只是会非常的怪异,就就像咱们那个房子的那几个腿一样,让他被压塌掉了以后,他会反反转,完了之后他就会凹进去,凹进去之后你会发现那几个腿都是都是会趴在那里的。

他你你就你就他就回不去了,就是a s t b k的一个问题。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

反正这个东西也可以利用昨夜去验证验证。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这个是我们我之前16年的时候有篇paper吗,就是模拟了不同材料给大家看一下。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

就是同样的一个小房子啊,同样一个小方块,一个立方体,然后不同模型去拉伸,它拉伸的时候没什么大问题啊,然后会产生一个模拟效果,大家而且可以注意到这个personratio。

这个叫做persony fect松,效果这个大家听说过这个名字吗,这个破松effect就是说当你去拉这个东西的时候,当你往这个方向去拉这个东西的时候,会凹进去,这两边会凹进去,这个也是的。

当你这样子拉的时候,这边两侧会凹进去,这个就叫做破松effect,为什么会产生破送一发给的本质上就是因为它需要保体积,除了体积,当你一端变长的时候,那么势必其他方向就会变小,这个例子为什么比较弱。

是因为系数的原因吧,是因为我这里用的弹性系数不一样,也是某种程度上也是因为这个s b d s t v k不太稳定,所以说我不敢用太大的力量拉它,我怕我太大力拉它,它会炸掉。

所以说我这里用的系数也比较小嗯。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

然后然后简单的总结一下啊,我们有限元的方式呢是通过能量密度的导数去计算力的,有限体积的方式是通过traction的积分来得到力的,这种方式其实最终的结果都是一样的,只不过它提供了不同的表达式。

它提供了不同的这个描述方式啊,当然这个有个前提条件,就是说我们是在linear fm linear element的前提下,说你用别的方式的话是不一样的。

那我happy astic model呢是一个比较通用的描述这个力跟形变之间的关系,的一个表达式表表达模型,它这个本质上呢就是定义了一个能量密度函数,这个能量密度函数呢对于iotropic材料而言呢。

各项同性的材料而言呢,我可以用principle stretch来写,怎么不stretch,它就是definition规定的一个特征值,对于iso trafic material呢,我可以通过计算。

按对这个stress进行对角化,我可以计算它的方式,这个其实就是我们有些圆的这一块,当然这个东西其实咱们图形学里面其实还是比较简单的,相对于材料力学啊,相对于结构力学啊。

相对于啊学啊计算数学里面还是相对比较简单的,反正这个也是给大家相当于啊简单的啊描述一下,然后一方面也是把整个流程告介绍给大家啊,最简单的层次就是说我们了解这个计算过程,我们可以自己写代码。

可以自即把它用到不同的模拟引擎上,这是一个最低的要求,第二个要求就是说你要理解这个代码的含义是什么,然后能够举一反三,三个层次就是跳出图形学去看到图形学外面大家是怎么做的,然后反正不同的层次。

反正就是希望大家啊通过昨夜可以能不能达到第二个层次,然后如果说咱们以后未来有高级课程,可以也可以往更高的层次上去走,有同学问图形学模拟的方式跟传统力学的差别其实是没有差别的,咱们用的这个方式啊。

这些formulation其实在就是计算物理啊,材料力学里面其实都是有的,都是一模一样的,然后土星学其实研究的主要主要倒不是说这个本身的数学模型,咱们图形学里面研究的是怎么样算得快。

怎么样去优化这些问题,怎么样快速的去呃计算这些东西,比如说我们做游戏对吧,游戏肯定就不可能有很大的计算开销,不可能说给你几千几万甚至几百万个四面体来模拟了。

我们有里面可能就只能用十几20个四面体去做一个很快速的模拟,怎么样做这种快速的模拟啊,这是我们图形学比较关心的问题,然后我这里想接下来想稍微简单呢,以下,有限元的一个高级的东西,我看一下。

有同学说学历学的是不是就是学图形学更容易,其实也不见得,因为学力学的同学,他可能对这些概念很了解,就像学物理的,他可能对物理概念很了解,但是呢我们做图形学里面最重要的就是说你不光是有这些概念。

而第二点就是说你怎么样,你跑得更快,对不对,是很重要的,因为你很多时候你的一个算法,同样的算法你可能不同的写法都是不一样的,怎么样去优化这些模拟,请,嗯然后影视积分这里我其实呃就我不想讲了,我本来想讲。

但是我们时间肯定不够,所以说我就不想讲了,如果大家感兴趣的话,可以读一读这篇paper,paper是呃比较详细地介绍了,有限就是有限元模拟。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

你怎么样去做影视积分的,这里就不讲了,好吧,大家感兴趣的可以去把这个paper读一下,同学问需不需要专门的去学材料力学吧,就如果说你对,就是专门对这种啊模拟这种弹性体这一块特别特别感兴趣的话。

有可能需要了解的稍微多一点啊,如果说你比如说你做流体啊,如如果说不涉及这些东西,具体的这些呃这种弹性体的话,可能相对来说可以了解的稍微少一点,如果说你做头发模拟,可能就完全没有,或者是刚体模拟。

可能完全就没有必要啊去了解这个东西,因为因为我觉得模拟啊在图形学里面,它跟渲染跟其他方向不一样,一个很大的点就是呃模拟设计的东西很多,就就比如说你做流体吧,你可能做流体的同学。

所以说你很难说就是保证每个方面都精通吗,我这里就先跳过,我现在想跟大家讲一个什么,讲一个非线性优化的一个东西,如果要算得快对吧,计算我个人觉得就是对于cpu跟gpu的优化都要比较了解,我也是比较重要的。

对线性优化我觉得是一个很大的点,因为同样的方对吧,同样的这个优化问题,同样的非线性问题,你怎么样去优化,它其实你做影视积分的时候也会变成一个非线性优化的问题,做有限元的paper。

我个人觉得主要就是在做优化,主要是我自己主要做gpu上的比较多,怎么样在gpu上做实时的模拟,比如说我们前几年做的,就是说几万个顶点,几万个四面体,我们可以在gpu上做实时模拟,做这块。

你光是模型上基本上没有太大的创,没有太多的创新,因为基本上都是力学的,力学的知识,其实有一些其实你会其实我个人觉得就是经常会看到这些paper,就是说他其实就把别的别的方法搬到学里面。

然后发一些paper,这些paper其实嗯早年比如说前10年前20年的时候其实还挺多的啊,但最近几年其实相对来说慢慢慢慢的少起来了,更多的时候大家其实在乎的更多的是一个效率问题。

然后就是说你怎么样做的准确,一个问题被别人搬已经搬完了吗,非线性优化,了解非线性优化吗,我想先问一下,在我讲这个之前,非线性优化吗,就学过有同学不了解了,先讲一个方法,叫做是一个很基本很基本的方法。

叫做gradient descent,这个可能大家可能大家听说过,gradient decent,一个很简单的思路是什么,就是我利用gradient我去做优化,一般来说我们做优化就是想解一个最小化问题。

就是给一个函数,我想要得到x x能够让小,假如说我这个我的解在这里对吧,这是我的这个解,然后呢我这每一圈呢都是一个等位线,分对的,对应的是不同的函数值,那么从里到外就是越来越大,可以想象成一个地形。

如果把这个想象成一个地形的话,这个就是一个坑,然后我这一圈一圈呢,就是相当于是一个呃一个同样高度上的一个一个一个一圈嘛,一个环嘛,然后这是一个坑,然后我就是一圈一圈的从里到外的绕出来对吧。

然后我谢谢非线性优化,我本质上就是想怎么样能够掉到坑里去,我掉到坑里,也就把这个非线性优化问题给解出来了,假如说我当前的位置在在这个x点上,我怎么样从我当前的位置坑里头去呢。

简单的思路就是我可以利用gradient去做,gradient是什么呀,我们的gradient实际上就是最快,我这个函数值的一个方向,也就是一个垂直于我这个等位线的一个方向,它是垂直于等位线的。

因为这是一个最快能够提高函数值的方向,换句话说,我反着这个方向走,我不朝古一点的方向走,是不是也就意味着我能够最快的减少这个函数值的方向啊,对吧,这个规定的定义我不要朝规定方向走,我我反着它走。

那么我也这个方向能够让我的这个函数值最快方式下降,其实就是梯度下降法的这个所在,就是说我反对这个梯度方向,我就可以往下降,大家看到我这个方向事实上并没有办法让我最终到谷底吗,其实中间还要有一步对吧。

我假如说我走到这个地方了,然后我这个地方我再根据我的梯度方向,我再走一步,我可能到某个地方,然后再走一步,然后最终我一步一步一步的迭代的,我从原来的位置,我最终走到我这个谷底,梯度下降法的意思就是。

假如说我有一个初始的位置,我每次都朝这个负的拐点的这个方向,我往前走一步,我可以收敛到我的这个思路线上去,录下降法,那么这个梯度下降法虽然说很简单,但是这里面有一个问题在什么问题。

就是说我这每一步要走多长多远,我如果走得太远,我肯定不行啊,我肯定走过头了,我走到这里了,不但没下降,反而还上升了,那不对啊,对不对,那我走的小也不行,走的小,我就是浪费我的步数嘛。

我们要得到一个最好的补偿啊,这个其实就是我优化里面其实也需要也是经常讨论的一个问题,这个alpha就是我的不长,我把它叫做step size,要找到step size。

其实对我们优化其实是一个很重要的东西,再说有两种方式去找这个部长,精确法就是说我想要找到一个合适的部长,能够让我这个沿着这个方向能够是最优的,这个叫精确法,另一个方法呢就没那么精确了,另一个进去。

另一个方法呢就是说唉其实咱们也不要求说找到这个最好的补偿,能够让它最小,我只要保证这个步长足够大,我又是能够保证我这个部长能够让我往下走的就够了,我们目的很简单,第一要大,第二我要下降,那怎么保证大呢。

我可以试错嘛,反复试错吗,先有一个初始的状态,我有一个初始的一个不长,这个步长可能比较大,稍微大那么一点,我每次都去测一下,我用这个不长o不ok是不是能够让我的这个函数值下降,可以,那么我就结束。

我就用这个补偿,我说我这个不长,用了以后发现它不他不下降,那么我就把这个步长搞得小一点,我乘一个阿尔法值,这个阿尔法啊,就乘一个贝塔值,这个贝塔通常是一个小的数,比如说0。30。4这么一个数啊。

我让阿尔法减小,然后乘完之后呢再去试,你不断的试,不断的试,直到我这个阿尔法变得足够小,能够让我这个函数值下降为止,就是一个反复试错的一个方法,叫做backtracking line search。

就是一个回溯的这么一个方法,这个条件让他下降的条件我们叫做wolf condition,这个反正我就不细讲了,反正这里也是给大家科普一下,这两种方式有什么优缺点呢,首先正确的方法他肯定收敛的最快嘛对吧。

因为你都已经最优的,对不对,那么我下次肯定也是最优的,我就不断的能够最快的速度下降,它所在的问题是,首先我本来就是要解一个非线性优化问题,你现在再给我搞一个非线性优化问题,我不是裂开了,对不对。

我这个问题太多了,我搞那么复杂,我怎去解这个阿尔法没法解吗,这个方法其实倒不是那么常用,穿蓝色其它的优点在于什么,就是特别简单,它这个成本也比较小,因为它只要去计算一下这个函数值就可以了对吧。

所以说它这个本质上就是一个很简单的一个反复试错的一个方法,所以说我们一般来说模拟的时候,一般来说用的比较多的就是社区居多,这个我们有了这个来search那么重要的就是说我们怎么去决定我这个。

刚才前面讲了,就是说负的gradient是一个下降的方向,我们刚才也说了,这个方向其实并不是最好的最合适的对吧,因为它这个东西其实只是保证跟我这个呃,这个这个这个等位线垂直而已对吧。

跟等位线的这个切方向垂直而已,它也不是一个最合理的方向,比如说这个方向是不是看着更合理一点啊,这个好像会路过我这个谷底,所以说这个方向似乎是更合理一点,大家都在想,可以我们去找一个更合理一点的方向。

找个更合理一点的方向,那么有一个很大的问题,就是说我怎么知道说我这个方向不能收敛,如果随便找一个方向,有可能这个方向你再怎么走,你都不可能下降对吧,那我们模拟里面。

我其实是还是希望我虽然说我不能保证我每一次下降多少,但是我还是总的来说,我还是希望我每次都往下降一点,每次都往下降一点,我最终能够降到谷底,我最终能够收敛了对吧,那假如说你这个方向不能保证下降。

那我可能这部就是完全白走了,我不希望这样,我还是希望能够我整个算法过程中,我永远都是在下降的,怎么样去判断说我这个方向是不是一个下降方向呢,也就是说是不是存在一个不不是不是存在一个不长。

能够让这个函数值下降呢,是我们需要对这个方向做一个定义的问题了,如果大家看这张图会发现,这条线假如说这条线是切线啊,接线是垂直于这个法这个规定的负的规定方向的对吧对,其实大家可以注意到。

倒是跟这个负的gradient的方向,处在同伴侧的方向都是一个可以下合理下降的方式,在这同样的半侧的方向都是合理下的方向对吧,反方向呢这侧的方向呢就是不合理的方向。

我的条件就可以利用是否在同侧来进行一个判断,那判断它跟负的规定的方向是不是在同侧呢,我只要做一个dot product,如果说大于零,那么保证我这个方向跟这个方向负的规定的方向在同侧。

那么它就是一个梯度下降的方向,不是梯度下降,合理的下降方向的方向,也就意味着存在一个最小的一个不长,一个小步长,能够让我的函数真的开始下降,其实就是,下降的这么一个概念,这个补偿之后呢。

我可以保证每次都下降嘛,那么我就可以得到x0 x1 x2 x3 ,最终我就可以得到一个结果了,那么我整个算法其实跟之前是一样的,只不过我之前用的是,其实这里应该是加二,因为我这里是d方向的。

我之前用的是负的规定的方向,就用d这个地方向来替代,然后前面乘一个成一个不长,把它叫做下降的方法叫做step descend方法,或者叫做descend方法,什么样的方法可以下降呢,比如说梯度下降。

它肯定是一个第三的方法,为什么方向就是负的梯度嘛,那负的梯度跟它自己相乘肯定是大于零的,因为梯度因为一个向量跟它自己相乘肯定是大于零的嘛,牛顿法也可以是一个第三的方法,如果说永远是镇定的话。

因为牛顿法的这个方向呢是负的,和神inverse乘以梯度,这个东西跟这个相乘的话,如果说这个东西是镇定的话,那么负号和负号相抵消,这是正定的,所以说两边乘以同样的向量,我可以保证它永远是大于零的。

是其实也是关于喝水,就是为什么喝什镇定的另一个原因啊,我们之前讲和神镇定和神正定主要是从有没有一个唯一解除发的,那跟数值计算里面它其实也有关系,数值方法里面也有关系,对于牛顿法而言,如果是镇定的话。

我就可以保证它永远是下降的,最早的牛顿法它是不可以保证他一定是收敛的,大家自己去试一试的话,你会发现牛顿法它有的时候它不见得一定是收敛的,但是像这种情况下,如果说喝神一定是镇定的,我可以啊。

这牛顿法一定能收敛,因为我可以利用这个下降的这个step size,这个玩意儿我可以保证它每次都下降,我可以保证牛顿法收敛,不然呢牛顿法它是有可能不收敛的,此类推。

任何利用一个镇定的矩阵去修改gradient,这种方法是一个下降法,就比如说我这里p是一个矩阵啊,我把它放在这里,然后因为同样的原因,我前面正负号相抵消,负号相抵消。

然后我都可以保证它现在方法为什么我们这个作业里面,我们做衣服模拟影视积分里面,为什么那个方法能够起作用的原因,因为我们其实用到了一个很简单很简单的一个对角矩阵。

我们用一个对角矩阵来作为我们这个p我前面其实也有一个小布长,只不过这个步长我用一个常数来替代了,然后它其实本质上也是这么一个下降方法,所以说它是能够收敛,能够work的啊。

其实大家会发现很多很多方法都有非常非常像的点,你用这么一个公式来啊,应该是乘二都可以用这么一个公式来描述啊,区别是什么呢,唯一的区别就是在于这个p它不一样,取证不一样,第三代而言呢。

我的p是identity,对于牛顿法而言,他的p是喝水,有各种各样不同的p,比如说project yamx用的是一个常数矩阵啊,我之前有一篇论文用的是这个合成的对角,然后还有用合成的下三角的等等等等。

就是采用不同的方法,各种各样不同的非线性优化的方式来,然后利用这种方式呢,我可以在开发我的相对应的这个模拟引擎,然后可以产生不同的效率,所以说一部分模拟引擎的效率取自于你的这个优化优化的这个能力。

然后另一部分呢取决于你这个本身的这个算法,所采用的这些细微这些差别,你想要强调的一点是什么呢,就是说我们总的计算量啊,我们总的这个计算时间等于每一个迭代的时间乘以总的迭代量。

你很多时候你不能说一个方法收敛得快就一定好,我们知道牛顿法它其实收敛的最快的,因为他用的是喝神,他用的是其实是二阶近似嘛,他用的迭代数量其实是最少的,但是为什么大家很多时候不用牛顿法盾法。

它每一次迭代需要解析系统对吧,它的这个成本其实很大,这个其实也是图形学,为什么图形学跟很多啊,工程里面像结构力学,材料力学它们很大的一个区别在于什么,就是我们图形学里面很在乎计算时间,计算量。

因为计算按量计算时间,计算效率就决定了我们的应用场景啊,说你要去解一个工程问题,其实用什么样的方法,其实他不在乎,他只要一个解就可以了,这种情况它其实更多,它会采用牛顿法,比如说牛顿法。

因为牛顿法它其实比较简单啊,同学说是不是可以叫拟牛顿法,我印象我理解中的quest newton,实际上广义上你可以这么理解,但是quest newton义上讲又不太一样。

因为quest newton它是利用一种迭代的方式,它去对和尚做近似的,所以说网易上你可以认为它是这个快速流程,但是狭义上我我还是不建议把这些方法叫做快速流程的,但是你也可以这么想。

就是说其实我们总的就是说怎么样,尽量地想要让我们的这个这个这个举证尽量的能够很和神接近,因为越接近我的收敛越好,但另一方面我又希望我的这个p比较容易被解出来,这样子我能让我的迭代迭代的时间也短。

所以说其实总的计算量我们在图形学里面,我们的总的计算量实际上是这两个的一个平衡,你怎么样找到一个更好的平衡点,你怎么样在不同的硬件上找到一个它的平衡点,这个其实是图形学研究的更多的问题啊,我就不讲了。

这个在作业里面,反正就是大家体会一下,就是迭代,关于这个非线性优化的话,我是建议他我有一篇paper,就是16年那篇paper,大家可以有时间的话可以读一下这篇paper,这个基本上就是我今天想要讲的。

然后呃不知道大家对那个影视积分有限元影视积分感不感兴趣啊,看到有有一个同学自己写了一个影视积分有限元的,一个模拟的一个小程序嘛啊,然后我在想大可能有别的同学也会对这个感兴趣,所以说有的同学对感兴趣的话。

可以去看一下,看一下p p t前面这这个paper其实挺复杂的,我自己也是我,我自己很早以前看过,我自己也写过这个代码,但是很久不看,我大概又有23年没看,我又忘掉了。

然后然后看那个paper又又有点看懵逼,然后又看了一会儿,然后后来才看明白,然后看明白之后完了之后然后再写啊,但是这个反正我就不讲了,因为这个东西比较复杂啊,反正如果说大家对这个感兴趣的话,可以啊。

这个把这个ppt还有这个paper给看一下,这个paper其实写的也挺好的啊,反正我是我的ppt,相当于是对这个paper做了一个总结啊,然后如果说你看paper其实也也挺好的。

我是觉得反正大家可以对这个好吧,课的话先到这里,大家有没有什么问题,我看一下,只算a的逆很慢,你用什么方式去算a的逆了,如果你是用高斯消元的话,也很慢啊,5x5个顶点就是25个顶点。

25个顶点乘三就是75,所以说这个矩阵是75x75的矩阵,75 75的矩阵,它的高斯消元应该是75的三次方,估算一个这样一个计算量吧,75的三次方这个计算量,实现了,其实如果说如果说有一些并行的话。

应该还是还是有效率的,的物理含义就是一个表面上的,在某一个表面上的力的密度密度traction其实你可以这么理解,压强你知道吗,就是我们压强不就是力除以面积吗,它其实traction很像那个压强,密度。

嗯其实最近几年有一些人做了一些工作吧,但是我个人感觉效果并不是特别理想,就只能说就是实验室性质的一些工作啊,因为呃很多大家还是看结果,如果说你的结果不是很好,就是说那证明这个方法其实也并不是很理想。

原因还有一个还有一个比较大的一个挑战,就是因为最近几年的gpu的性能提升的很快,gpu性能其实很快,导致我们整个模拟的这种算法提升也非常快嘛,效率也变得很高,但如果说g p u就已经能够做到这一点了。

是这么觉得的,一块模拟公式上是不是很难有突破了,对我我觉得是啊,就是如果说是模拟的模型上面就是模拟模型应该是固定了的,基本上这个其实大家如果学过渲染直播,那个game 101应该知道,就渲染公式。

渲染公式已经是固定了的,但是呢你为什么还要再研究下去,因为模拟的计算量通常都超级超级大,而且这个东西不像渲染,我们已经有gpu,有rtx了,我实时的光线追踪其实已经可以做得很好了。

模拟这个其实都是没有止境的,因为你的分辨率,你的这个顶点数量可以无限的往上涨,你无限往上涨,也就意味着你的计算量又可以变得超级超级大,那么怎么样你再更快的去解决这个模拟的问题。

这个其实有很多东西我觉得是需要需要解决的,物理效果是咱们自己看看还是怎么样,这个看你的应用啊,我觉得就比如说我比如说我自己这边啊,我我是做这个布料的模,你比较多嘛对吧,布料模拟你的话呃。

如果说游戏做游戏,做数字人,做虚拟人,一般来说他们就看看效果就ok了,因为他只要好看就行了,但是呢我们做数字做这种数字服装,为服装行业做,那么他们就对这种真实的要求会非常高。

他会想要你这个模拟的效果能够跟成衣要接近,所以这种情况往下,其实真实的标准及要求就会很高,这取决于你的应用是什么,比如说你做这个做流体也是一样的。

如果说你是想把这个流体用在一些比较serious的一些应用上,就会比较难,一般来说就是你可以设计一些实验,然后利用这些实验进行一些对比吗指标,然后然后这些参数化这些指标,然后利用这些指标进行一些对比。

我们布料的话一般来说就是会设计一些弯曲实验,还有一些褶皱实验,就是说你把这些布都缝成一件衣服,然后穿在一个比如说一个假人模特身上,然后看这个是不是跟模拟出来的效果是一样的。

我看最近几年有一些衣服模拟的paper,其实也都用到了,这些对比实验,我其实也看到过,有就是他们我记得很早以前吧,我忘了是哪1年了,就是做气泡的模拟,然后他们做一个类似的实验,然后对比这个气泡是对。

这个我课后会会我把这些有些地方错的地方,我把它修改一下之后会上传,嗯对是有模拟毛衣,毛衣其实毛衣其实会有两两种啊,一种是图形学里面的毛衣,然后另一种是我们真正那个工业界用到的数字模拟的毛衣。

然后其实太一样,因为医学里面其实大家可以看最近几年做的一些,比如说基于young base的模拟,还有基于那个基于什么啊,就就就基于简单有些圆的模拟,然后我们就最近做的衣服的模拟。

就是我们发现其实就就其实不用特别管毛衣的材质,直接模拟一下,然后用比如说你用弹簧系统模拟一下,然后你直接把这个渲染搞得像一点,毛衣也可以做得很像,就是模拟的方向是不是都来自工业界,不一定啊,就有的。

其实你看啊,有的有的有的idea,有的课题其实也是拍拍脑袋想出来的啊,其实我后来发现其实好像做的并没有什么太大的价值,但是我觉得模拟跟图形学其他方向相比,这种拍拍脑袋想出来的这种课题会少很多,会少很多。

一般来说用有限元,一般来说就会用有限元,我也不讲这节课,我们的这个课就不讲了,下节课不是想讲那个碰撞吗,然后有点担心我们下节课到底讲不讲得完,因为碰撞它其实东西也挺多的,然后也碰撞也挺复杂的。

那我到时候下节课也会可能也会跳着讲,就是可能把一些基础的东西先讲,然后有时间会讲一些高阶的,如果说没时间,那么就反正就p p t留着给大家,有什么材质是吗,诶这个我好像还真没有印象啊,不可能。

因为金属它的形变一般来说会比较小,它如果形变,一般来说就变成塑性形变了,所以说它那个弹性模型可能还不是很重要,比较简单的模型可能就够了,跟你who can可能差别不是很大,可能会少讲的稍微简单一点。

因为还有一方面原因,也是因为我最近几年都没有怎么做做流体的,流体的做了,所以说流体我可能会找的稍微简单一点,但基本稍微简单一点,其实基本上也是比较基础的流体吧,反正大家基本上我希望就是流体那一块。

基本上听完之后,基本上对流体怎么做基本上都有数了,我暂时还没有计划,因为高阶课我我觉得挺难讲的,挺难上的,就是如果说大家没有基础的话,没有一些基础的概念的话,就高阶课程可能会很难会跟不上。

然后高阶课程它其实也也会很,比如说流体的高阶课程跟啊有限元跟衣服的高级课程可能又都不一样,所以说很难就是用同样的一个一个一个专题啊,把它从头到尾的啊讲道讲到底,就像我们这个课。

其实我们这个基础课其实就已经有点散了,大家有没有发现就是每一个方向,让每一个每一个这个模拟的这个topic,这个方式方法都不太一样,又会又会是另一个东西,又是一个全新的东西,其实我觉得就是优化。

还有这个优化,还有这个呃gp,我觉得是一个蛮好的东西,但是我上这个课可能不合适,因为我gpu这一块其实并不是特别特别专业的,那我们今天就先到这里了,然后我们下节课会讲碰撞,然后大家作业已经。

然后如果大家没做完上个作业的话,就赶紧把这个上个作业给做了啊,然后做完作业的话,可以看一下我们这个新的作业,然后看看啊,这个帮助大家把这个有限元这块好好理解一下,好不好。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

GAMES103-基于物理的计算机动画入门 - P9:Lecture 09 Collision Handling - GAMES-Webinar - BV12Q4y1S73g

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我没有我在我在直播,好那我们就我们就开始吧,嗯因为时间比较有限,嗯就首先我想跟大家说一下,就是我们那个作业的事情啊,因为呃上周布置的作业,我看这个作业可能稍微有那么一点小小的挑战性啊。

嗯然后就是我说一下就是几个嗯作业里面的一个呃一些一些技巧吧,就我给大家的一个那个代码里面是我们有个房子的模型对吧,那个房子模型大概有1000多个四面体,那这1000多个四面体,如果你直接去模拟。

如果你写完代码然后跑模拟,然后就很难debug嘛,因为呃你结果如果不对,你就很难发现问题出在哪里,所以说我给大家的建议就是你可以上来先不要呃去跑这个房子的模型,你可以先试一试。

看看能不能用一个四面体来进行模拟,卡吗,别的同学觉得卡吗,好了好了是吧嗯,就那一个四面体,你怎么测呢,我看看这个网络是应该应该没有什么大问题呃,你那你一个四面体怎么测呢,你首先可以呃把重力关掉。

假设这个四面体在静止的状态下,那如果这个四面体在静止的状态下,他的demation gradient就是identity,因为这个大x和小x是一样的,就是说它这个形变的状态跟参照的状态它是一模一样的啊。

在这种时候,这两个矩阵是一模一样的话,你算出来的这个defamation规一点的就应该是identity,那如果你的deformation规定是identity。

那么你算这个green rain就应该是000对吧,因为这里本质上就是identity,chidentity,你剪出来,但是这个就应该是000,那green rain是000的时候。

你用这个原来的那个公式算算stress也应该是000是一个零矩阵,那零矩阵最后得到的利益,那么也就是零,所以说所有的力都是零,在静止的状态下,这个四面体应该是不发生任何形变的,也没有任何力。

你可以先用这个东西去测试一下,看看你是不是给了你正正常的结果啊,然后如果说这个是ok的话,那么你接下来第二点就是你可以嗯,就是把这个四面体稍微沿某一个方向,比如说你沿x的方向先拉伸一下。

那么我们知道弹性体它永远都是弹性的,力永远都是阻碍形变的,所以说你沿着x方向上拉伸,那么它每个点的力与理论上应该都是想要恢复这个四面体的原来形状,那么视图就是把它缩回去。

你就可以看这几个力是不是方向上是不是有这个趋势,把这个这几个四个顶点都把它缩回去,如果说它不是,那么就说明你的计算有问题,如果是,那么就说明那它的趋势是差差不多是对的啊,然后有同学说这个帧率的问题。

这个其实我我也发现,其实呃unity上跑这个demo其实帧率是比较低的啊,为什么我做这个例子的原因是,因为我以前是用呃,是直接用用用open gl写的,在cpu上写的那个帧率其实很高啊。

但是unity因为它本质是本本身有脚本的问题,所以说他这个帧率帧率相对来说比较低,然后至于有多低,可能取决于你自己的这个电脑的配置,就是我我自己反正总体感觉帧率也不是特别高,呃,远远没有cpu上高。

但是如果说大家以后有机会呃,不用unity写这些模拟引擎的话,你会发现其实效率上可以啊,进一步的提升啊,本身这个呃这个这个这个四面体有限元模拟,它其实也不太适合做游戏开发啊。

或者是就是非常小的分辨率下适合做游戏看法,像1000多个四面体其实可能已经超过啊游戏比较能够处理的范围了,怎么给四面体拉伸,就是顶点啊,就比如说你想象这个四面体有四个顶点嘛对吧。

那么你相当于在x的方向上你缩放一下,其实相当于就是给它拉伸了吗,你就可以给它缩放一下,其实就是给他拉伸一下,这样子就可以给他在在某个特定的方向上做拉伸,嗯然后同学们有什么问题就关于作业,没有问题的话。

没有问题的话,我想呃平滑是怎么做的是吗,嗯其实我上课倒是没有讲,我就是嗯我不知道这个gmc 101有没有讲过这个东西,games 101有讲过这个东西吗,就是做拉普拉斯平滑,放在树嗯都可以吧。

其实就是对速度场做一个平滑,至于说你什么样的时候做平滑,其实都可以,没有1101没有讲过啊,这个怎么讲呢,我我以为101讲过呃,对对一个,比如说你对速度场做平滑,其实很简单,就是你你这么想。

就是每一个点每一个点都有个速度,对不对,那我就对于这个点而言,我就跟他周围的邻居做一个平均值,相当于就是给他做一个平滑,就是我们大家都取平均吗,我跟我的邻居都取平均,那么具体怎么做。

就是我每一个点我都看周围的邻居啊,然后呢我把它们全都和全部周围的邻居的和速度的全都加起来,求和,求完和之后跟自己的速度做一个平均值就可以了,这个有点像咱们之前做那个呃呃做p p t的时候。

大家记不记得我们做p p t的时候,我们每一个点都会有一个速度的,有一个位置的更新嘛,然后我们位置更新把全部都加起来,然后求和是一个一个方式,就是咱们呃先把所有的速度,周围邻居的速度全都加在一起。

加完之后,然后跟自己做一个平均的加权平均就可以了,跟那个跟跟平滑的滤波其实也是一样的,放在之后会崩掉吗,嗯有可能,然后问那个有同学问那个sb d的tv k是不是给错了,我没推过。

因为我这个s d v v k是从我自己的另一篇公式,一篇论文里面抄的,然后我看到那个微信群里面有同学说那个公式他后来推了一下,发现是对的,但是就是前面呃多了个系数还是少了个系数,好像是应该是1/8。

不是1/2,我记得好像大概是这样子,反正就是你做如果做附加题那个作业的话,就就我还是建议就是自己把那个公式先自己推一下,然后确保就是推出来的,理论上应该是一致的,然后再做,好吧。

那你可能平滑的有点过度了,就平滑的目的就是为了让速度均匀比较均匀嘛,但是速度但是它还是会比如说该下落还是会下落,他只是相当于它那个它会平滑一点,作业里的triangular,这我不记得了。

有可能是我之前定义了一个一个三角网格,本来想拿来指示渲染表面,但是我后来好像又没用,可能是那个目的吧,反正如果说没有用的话,就就就忽略它,就不用管它,因为我本来是只想渲染那个,因为它四面体。

然后我直接的每个三角形都是从那个从每个四面体的四个面得到了吗,然后我得到了这四个面之后,每得得到了这些四面体的四的的这四个三角形之后,我就把它搞成一个大数组,然后拿去渲染了。

本身四面体网格它没有那个三角三角形网格可以直接拿来渲染,所以说你需要额外的构造三角形网格去给这个四面体网格做渲染,可能是这个目的吧,好吧,然后今天我们关于有限元啊。

关于弹性体的这个讨论就基本上告一段落了,嗯然后我们今天会讨论一个比较新的话题,然后我们下周开始会讨论流体,所以说我今天想把这个最后一点关于啊这种三角形网格啊,这些模拟的方式给他呃,给大家结束掉呃。

然后我在准备这个ppt之前,其实我想了挺久,就说到底应该怎么来讲这个东西,因为可能就是p p t里面其实会讨论的比较简单,因为嗯碰撞这个东西,它其实很多概念都很简单,但是呢如果说你自己要去做一个碰撞。

想把它做的很好,其实工作量又特别大,因为它里面会有各种各样也需要处理的问题,它不像呃我们写弹簧模拟啊,写有些语言模拟啊,可能理论上会复杂一点,但是只要你懂了之后呃,你写代码相对来说比较容易。

而碰撞呢就是说它可能概念上没有那么复杂,没有那么多很深奥的理论啊,不像这种有限元什么一套一套的,全是公式呃,碰撞碰撞它没有那么多公式,但是他处理起来他的算法复杂度就特别高,特别麻烦。

所以说我今天其实也是嗯想给大家简单的把一些概念嗯给大家呃,先讨论一下,然后相当于大家心里有个数啊,然后以后大家以后如果说碰到有这种开发的需要的时候,会回过头来花时间去读一些其他的论文。

或者是呃或呃或者是自己呃写这方面的代码,就相对来说会好一点,会有一定的基础吧,这是我今天的一个目的,然后我今天会大概分几个方面来讨,来来来说碰撞这个问题啊,首先我会说一下,就是怎么样做碰撞检测。

怎么样去发现碰撞,有没有碰撞,然后呢我会给大家讨论两个方法啊,一个叫做一个叫做内点法啊,一个叫做impact on optimization,我不知道中文怎么说啊,反正就是这两种不同的方法啊。

这两种方法都是我们做连续碰撞处理所需要用到的方法,一般来说大家会用这两种方法比较多,然后我最后呢会给大家说一种就是非连续碰撞呃,就是离散碰撞处理的方法啊,叫做untangling cross。

或者你可以把它简单的认为,如果说不是做衣服的模拟的话,你可以简单的认为就叫做香蕉解除,大家直观的想就是说呃我假如说我这个物体跟其他物体有相交吗,那我怎么样把这个香蕉给它去除掉。

那么就视觉上我就看不出有碰撞的效果来了,所以说就是我们会讨论这么几种方法,然后本来是想把这个东西放在衣服模拟后面讲的,为什么这么做呢,是因为衣服的碰撞,布料的碰撞其实是所有的碰撞处理里面最难最困难的嗯。

如果说你能把衣服的碰撞,布料的碰撞处理好,那么你处理其他碰撞其实也很容易,你可以认为其他碰撞是衣服碰撞的一个简化,所以说我本来是想把它放在衣服碰撞处理后面讲的,但是因为种种原因,我把它挪到最后面啊。

好吧,然后首先我们来讲一下怎么去发现碰撞对吧,我们要处理碰撞,我们要让碰撞消失,那么首先第一点我们得知道有没有碰撞,那么碰撞处碰撞的检测,它其实一般来说会分成两个部分。

第一个部分我们叫做碰撞的calling,叫做broadface,碰撞的calling啊,碰撞的删除,然后第二个部分呢我们叫做narrow face collision。

tt collision test,就是一个是广义的,一个是狭义的,那么什么意思呢,为什么要这么做呢,其实这个想法很简单,就是我们正常时候在模拟的时候,我们想要处理碰撞。

我们可能这个世界里面有很多很多的三角形,有很多很多的物体,有很多很多的例子吧,假如说我这个世界里面有很多很多的元素,比如说有1万个,其实也不算多啊,像我们之前做的那个兔子模型,就已经上万的343角形了。

可能有上万的这种元素,那么如果说我两两之间要做一次碰撞检测的话,它的计算量是很大的,如果说1万,那么你两两做检测就是1万呃,411万乘以差不多1万的平方这么一个数量值嘛对吧。

差不多是几千万的这个凉凉的这个检测你需要去完成,那么如果你这个分辨率更高,你的这个这个三角形更多,比如说几10万几百万,那么你这个两两之间做检测的成本就会更大。

那就是为什么我们需要把碰撞检测分为两部分的原因,因为我们目前的计算能力没有办法去对两两的元素,两两的三角形进行碰撞检测,这个成本太大了,所以我们把它分成两部分,第一个部分呢。

它主要的目的呢就是为了去除一些不可能出现碰撞的peace,我如果有两个三角形,它离得非常远,它没有可能出现碰撞,那我就不考虑嘛对吧,那么如果说我把这些不可能出现的这些呃三角形对或者是点三角形对。

或者是某些元素我不管啊,反正就是一些parts,如果我把这些派去除掉,那么剩下的部分是不是就是有可能出现碰撞的paris对吧,所以说第一个阶段。

我的主要目的就是为了把这些不可能出现碰撞的这些pass给它去除掉,然后我的输出呢就是这些paris candidate,这些呢是我们的呃备选目标,我们不知道他们有没有碰撞,但是他们因为可能离得比较近。

或者是啊他们有一些呃可能出现碰撞的趋势,所以说我们把它呃输出作为我们的输出,这是我们的第一部分,相当于就是把一些呃完全没有可能出现碰撞的,我给它先剔除掉,剔除完了之后呢,我们到了第二个阶段。

第二个阶段呢就是我们要具体做我们的这些碰撞检测了对吧,那么这里呢有两种模式,一种叫做dcd discrete,一种叫做continuous啊,就是根据我们的碰撞处理,我们也会有两种不同的碰撞检测方式。

然后检测完了之后呢,我们会最终知道有哪些tears是真的有碰撞的,然后这个就变成了我们的输出,这个是我们碰撞检测的总的一个流程啊,啊当然检测完了之后呢,我们后面就是我们没有结束嘛。

我们还需要真的去处理这些碰撞,这就是我们走到后面那一步了,但是我们先暂时先不讨论,我们先讨论就是单纯的讨论检测这一块,那么我们首先来看一下这个broadface collision calling。

就是这个碰撞剔除这个第一块板,第一块啊,然后碰撞的这些剔除的它有两种比较常见的套路,在我们图形学里面,一种叫做spatial hash。

然后另一种叫做b b h bounding volume hiarchy,我们首先来看什么叫做spatial harsh,他的意思是什么意思呢,就是我把整个空间,我把整个3d空间划分。

用一个网格给它划分成很多区域,比如说我有这么一个空间对吧,我划成一个4x4乘一个区域,很多这种小区域小格子,然后呢我如果有很多三角形的话,我就把每个三角形都存到这个小格子里面。

根据它们的位置存到这个小格子里面,比如说第0号三角形t0 ,它跟零小格子,0号小格子跟4号小格子,还有跟5号小格子他都有相交吗,所以说t0 它就存在了零四,还有五,同样的t1 ,他跟237有相交。

所以说t一就存到了二七,还有三啊,我当然我这个东西就对每一个三角形都做这样的处理嘛,我就把每个三角形都分别的啊,不一定也不一定是三角形嘛,就是某些物体,反正我就把这些物体都存在。

它们相对应的占有了他们这些空间的这些小格子里面,这是我的第一步啊,就是我做这样的存储,做完存储之后呢,我做相交检测就比较容易了,为什么呀,因为我可以根据这个空间的划分。

我就可以很快的判断出来有哪些三角形是有可能跟我相交的,比如说我想要知道我这个3号三角形t3 ,它跟哪些三角形有可能有相交,那么我只需要检查跟它相交的这些小格子里面还存了什么三角形。

然后我把t3 去跟那些三角形做检测就行了,比如说t3 它占有的格子是五六和九跟十吗对吧,那么如果我检查569 十这些格子,它还存了打c3 角形,我会发现它存了t0 ,他也存了t5 对吧。

因为我看到他这里t0 跟这个第5号小格子,还有t5 跟第十第10号小格子有相交,所以说我知道t3 是跟这些三角形共存在这些小格子里的,那么因此呢我就可以知道说t3 有可能跟t0 ,也有可能跟t5 相交。

那么我就以此我就把这个输出就可以了,我就把t0 t3 ,还有t3 t5 ,我把它作为这个pears的输出,然后呢我让我后面的程序来检测它到底有没有相交,如果说我有其他三角形,我也是同样的操作。

比如说t2 ,那么t2 跟哪些三角形有可能有相交,它跟t0 有可能有相交对吧,因为它跟t0 共存在4号小格子里面,所以说我要跟4号小格子判断出来t0 跟t2 需要做检测啊,所以说就是这么一个套路。

这个就叫做special petition,那么如果说那当然这个情况下是比较简单的了,假如说就是一个三角形,是一个静止的三角形,我需要找到哪些三角形,哪些其他三角形跟这个三角形相交,我可以怎么做。

那如果说三角形在运动怎么办啊,呃也没有什么大问题,我可以把三角形的运动轨迹,把整个东西作为一个物体,比如说t0 对吧,它进行了这么样的一个运动,那么我把整个东西当做一个物体,我给它保存起来就行了。

比如说在这种情况下啊,他原来是比如说045,但是因为它有运动,所以说他跟1号小格子也发生了关系,所以说我对t03 角形而言,我需要保存的格子就是014跟五,只需要把根据它的运动轨迹。

你只需要把它占有的这些小格子的空间给它,稍微进行放大一下就可以了,啊这个就叫做special partitioning,当然说啊这个是比较标准的,比较正常的这么一种regular的这种网格啊。

呃实际操作中的你也可以对这个东西有一定的扩展,比如说你可以考虑就是呃用一些hiit啊来描述,当然我们这里就不进一步的拓展了,就假设是一个比较简单的一种状况,那么这里听着挺简单的。

但是呢我们在实际的操作中呢,你会很快发现一个问题,什么问题呢,就是说对于一个三维的空间,你可能需要非常非常多的小格子来进行这样的存储对吧,因为3d空间,这是2d的情况。

就已经比如说你按1cm来进行定义这么一个小格子,1cm乘1cm,那么假如说你要存1米乘1米的,你就需要100x100的小格子,那么三维的话就是100x100x100,这个这个计算量。

这个存储量一下就下去了,更为严重的是什么呢,更为严重的是,你事先并不知道说你这个小格子里面到底需要存多少三角形,有可能有一个小格子里面存了很多很多三角形对吧,有很多三角形它聚在一起。

而更可能出现的情况是什么,更可能情况出现的是绝大多数的小格子,它里面没有存任何三角形,所以说虽然说你要花很大量的这个内存的存储空间,去定义这么一个格子,然后定义这些小格子里面需要分配的。

这些有可能出现的三角形的这个一个数组来存这些小三角形,但事实上你这个大量的内存的这个存储空间是浪费掉的,因为我们实际上是按可能出现的三角形来进行分配内存,它并不是按需来进行分配内存的。

所以说这就是为什么我们后来就考虑到了一个解决方案啊,就是怎么来解决这个问题,解决的思路呢,就是我可以进行排序,什么意思啊,就是我首先不要去直接的对每一个小格子分配内存,我不不去做这个事情。

这样子分配内存太占内存了,我们换个思路,首先对于t0 而言,我知道它会出现在045这三个小格子里面,所以说我就写成三个,分别写成三个pers对吧,这个每一个前面的这个数字呢表示这个小格子的编号。

后面那个数字表示了这个三角形的编号,所以说这里就是0t04 t0 跟5t0 ,然后t一呢我也做同样的事情,我知道t一它会出现的三角形的小格子是237,所以说我这里就写2t1 ,三体一七题,就以此类推。

那这个操作它其实是相对来说不怎么占内存的,因为这个整个数组的这个序列,基本上就是跟我的这个三角形的数量成正比的对吧,他跟我整个空间其实相对来说没有太大直接的关系。

我哪怕是模拟一个非常非常大的100x100x100的这么空间,我其实里面可能三角形可能只有1万个,那么我只需要跟比如说大概三四万左右的这么一个数组就可以了。

那么首先就是定义这么多这些pass把它全都定义出来,然后完了之后呢,我给他做一个排序,排序的目的是什么,排序的目的其实很简单,就是希望我所有的这些parts都根据这些小格子的编号来进行排列。

那么排列完了之后呢,你就会发现t0 对吧,它首先这个0t0 它是第一个元素,因为为什么他占了t0 嘛,他占了0号小格子吗,然后呢后面一个元素呢是2t1 ,因为1号小格子没有任何三角形,它就直接被忽略了。

因为我之前这个数组里没有存任何三角形,它直接就被忽略了,然后2号小格子存了1号3t1 ,所以说2t一就出现在第二个元素上,然后接下来是3t1 ,然后呢是4t0 跟4t2 对吧。

因为4号小格子出了t0 跟t2 ,然后以此类推,然后经过这个排序之后呢,我就可以很方便地从这个排序以后的数组里面,知道说每一个小格子它里面存了哪些三角形,比如说5号对吧,我想要知道5号三角。

5号小格子他存了什么三角形,我只要去检查这个5号小格子它所对应的啊这个数组的开始,我会我到时候会从一个开始跟结束的位置,对于每一个小格子而言,我都会从一开始到结束的位置。

然后根据t0 这5号小格子的起始位置,我知道t0 跟t3 啊,就是存在5号小格子里面的,那如果我想要得到10号小格子存了什么呢,我就检查10号小格子的初始位置,然后我就知道a分别是t3 跟t5 。

存在了10号小格子里面,啊这就是一个比较节省内存空间的一个方法,因为我并不需要说为这些没有存任何三角形的小格子分配内存了,像比如说1号小格子对吧,还有11号小格子,他们就可以被忽略了。

它不需要从任何人的三角形,我只需要实际的三角形与需要用到哪些小格子,我就根据哪些小格子来进行分配内存,这是一个可以利用排序来节省special positioning内存开销的一个思路。

大家这里有没有什么问题啊,能听明白吗,听明白了吗,可以啊,行,然后呢,大家就想了大家想了这个东西,虽然说我们内存省了对吧,但是我们的内存访问并不是很连续,什么意思,就是大家如果学过计算机体系结构的。

可能知道就是我们在进行内存访问的时候,我们是希望我们的内存访问是比较连续的,所谓的连续内存访问,就是也不是说真的就是按顺序12345这样子访问下来,但是我是希望我访问的时候,我跟上一次访问的地址。

内存地址不要差的太远对吧,我不信,我不希望我内存访问的时候,我是东一枪西一枪的,我希望总归我是在某一个周围进行访问的,那这么做的原因是,因为我们在内存里面我一般是有cash的这么一个呃,一个内存的结构。

缓存的内存结构来优化我的内存访问的,那么如果说我根据我们前面说的这种012345678 90这样子,横着这么一行一行扫过去的话,你会发现虽然说在这个横向上,我内存访问是比较连续的。

但是在纵向上它的内存访问相对来说不是那么连续,比如说我这么一个点,我希望访问这里的邻居的时候,我就跨度就会非常大了,那么更严重的是,如果说你考虑到三维的情况,如果说我三维情况,你是一个三维的网格。

你需要你需要访问垂直于我们屏幕的这么一个方向上,就会就会访问的这个跨度就会内存访问的跨度就会更大,而这个跟我们啊我们这个内存访问的这个这个这个就比较矛盾了对吧。

因为我们访问的时候永远是想访问我们的邻居嘛,但是呢我们只有在横向的邻居,我们会比较访问的比较快,而纵向还有垂直于我们屏幕的这个方向的邻居,我们访问起来就不会有不是很有效率的。

这就是为什么我们科学家后来又发明了一个套路,就是叫做mountain code,modern code,简单的说就是他把内存的这个3d里面的三维空间里面,这个格子的编号顺序啊。

用这种z字型的这种图案来描述,就最开始呢是一个z字形,然后呢你可以对这个z字形进行细分,你怎么细分呢,就是你分别你假设这是一个2x2的这么一个空间嘛对吧,那么也就意味着你先访问这个格子,在访问这个格子。

再访问这个格子,再访问这个格子,那么你对每一个格子呢再做细分,你就变成了这么一个右边这个这么一个图案,这就是一个4x4的格子,那么你对4x4的格子再做细分,你可以得到一个8x8的格子。

那么8x8的格子就是左下这个图,然后以此类推,你可以对整个空间进一步的细分,细分细分你就得到了一个啊访问的一个顺序,大概就是这个样子的啊,这是二维的情况,三维的情况也是一样的啊,只不过稍微复杂一点。

你需要考虑到另一个方向上的这个图案,这个叫做mountain cold啊,具体怎么写,这个mountain cold,反正这个嗯一般来说都有现成的代码,大家可以参考一下,但是简单的思路。

modern code,简单思路就是这么一回事,然后他主要为了达到的目的呢,就是为了能够让我们在访问我们的邻居的时候,可以让我们的这个内存的这个地址会更加接近一点。

嗯然后这是我比较推荐大家如果有时间的话,可以读一下,就是在gpu gm骚,嗯,有一个有一个教程叫做broadfakly with ka,大家可以看一下这个教程看看就是读一下。

就是这个他们这个gpu上主要就是基于这个special positioning,据空间划分的这个思路来进行碰撞检测的,大家大家有时间的话可以看一下这个这个教程。

好了我们刚才讲了special pedition,嗯,然后这个special position呢总的来说它根本思想就是基于空间来划分,对于一个静态的空间我进行划分。

那么第二个思路叫做bounding volume hiit,它就从另一个角度来考虑,就是我不要去对于空间进行划分,我对于物体进行划分,因为很多时候我们的物体它不是一个混乱随机的物体。

它不是一堆毫无毫无规律的点,它实际上是有一定规律的,比如说我的三角形,我的点它一般来说是描述一个物体,比如说一个机器人对吧,比如说一个人体,那么他这些点三角形它其实是有规律的。

我可以根据它这些结构我可以来进行划分,比如说我有个机器人,我可以把这个机器人划分成机器人的身体,划分成几个部分,a b c d e f g对吧,我可以做一些简单的筛选,他俩离得特别远。

那么我就知道说我这个d我这个手臂啊,那肯定不可能就跟这个腿相交嘛,他俩离得这么远,那么它里面的这个所有的一些小色料型啊,不可能跟他相交对吧,所以说我就可以很快的发现,这些不可能永远都不可能。

不是说永远不可能不可能目前不可能出现碰撞的这些元素,那么如果说对这个进行再优化的话,什么叫hay hay,比如说c和d它都属于这个手臂,然后e跟f他属于另一个手臂,我用一个框框给它抱起来。

然后同样的左边这个腿跟右边这个腿我都也用鲍围盒给它抱起来,然后呢我可以再往上推,比如说上面这个身体,就是物体自身的检测啊,举个例子,比如说我这里有一个呃,有一个物体对吧,可能有个球。

我想知道这个球有没有跟这个机器人发生碰撞,那么我可以,那么这个球就必不可能跟这个机器人有相交吗,对吧,那么我接下来再去检查上面的和下面的,看看是不是有橡胶,如果有,那么再往下走,然后如果没有。

那么这个相当于这个呃这个树的这个你可以认为这是一个数码,那么这个数的这个这个便利的这个就结束了,那么我就是朝着这个游客有相交的往下走,直到我达到每一个底层的具体的某一个三角形为止。

这是一个跟外部的物体进行相交检测的一个套路,那么当然说我们事实实际上我们在模拟的过程中啊,这个就是给大家举个例子,就比如说我这个红颜色的三角形,我想知道有没有橡胶嘛,我首先检查跟黄颜色的是不是相交。

然后其次检查橙色的啊,然后直接一个一个便利过来,最后发现他跟b e跟f有相交,但没有相交,那么对于外部物体而言是这么一个套路,那么很多时候我们还需要对自身进行检测。

因为自相交其实也是碰撞检测中很重要的一部分,怎么处理自相交呢,是这么处理的,假如说我当前这是a号节点啊,你可以把它认为这是a,我首先检查每一个a的children,那么他现在有这个a节点,它有两个小孩。

对两个孩子,那么对于这两个孩子而言呢,我都回到这个函数里面,我就递归嘛,我就reaction嘛,我就我就我就回到这个函数,我继续调用这两个孩子而言,我就分别调用这个,重新调用这个函数。

然后检查它有没有自相交就行了,这是递归的部分,因为对于a这个节点而言,自相交有可能在这个左边这个孩子的内侧内部,也有可能发现在右边这个孩子的内部,所以说我就分别对这两个孩子进行一个递归操作。

来检查他们有没有自相交,这是第一个部分啊,这是第一部分,然后第二个部分呢就是说有可能相交会出现在他俩之间,对不对,那么怎么知道他俩之间有没有相交呢,那么它俩也不可能有相交吗。

那么我接下来我要用另一个函数,这个函数是什么呢,这个函数就是检查他们两个的孩子之间有没有相交,那怎么检查呢,对于b的孩子跟对c的孩子,为何有没有想交,如果有相交,那么我递归操作,我回过回过头来。

我继续去检查他们的孩子,这个其实就是我对于bd volume hay,我做橡胶检测或者说自相交检测的一个简单的思路,就是利用我这个树的结构啊,我进行这么一系列的递归操作,进行一些呃递归操作的访问。

然后最终把这个碰撞给他解除出来,我刚刚给大家举了一个比较简单的例子吗,就比如说我这个横向是x,竖向是y嘛,就是它的橡胶检测会比较容易,相交检测,你只需要检查它们分别在x跟y方向有没有相交就可以了。

如果说他在某一个方向上没有相交对吧,你可以检查,比如说这个在x方向上,它其实中间有个缝嘛,那它就不可能有相交,是因为他这种做相交检测会很容易,他不需要做任何的这种数值数值计算,它只需要去做一个比大小。

它比这个比这些香蕉的这个大小就可以了,其他的还有球,如果说你要做线下检测,你就要做一些距离的计算对吧,如果大家记得怎么检测两个球相交,你需要把他们两个的球星算一个距离,然后用这个距离去跟半径的和做比较。

这个计算量就会稍微多那么一点点啊,就是它可以是任意方向的,他不要求就是跟x y对齐的方向,所以说这个实际操作中大家用的也不是很多,就做a b b或者大家以前听说过的话。

这个基本上就是一个bounding volume hacker的操作,然后bonding volume hay,大家其实可以看到,在绝大多数的情况下,能够帮助你剔除相距非常远的区域的一种方式。

比如说我胳膊跟腿嘛,胳膊跟腿他没有可能就是有相交,他们距离很远,那么我一下子就可以把它给踢除掉对吧,它的局限性在哪里,它局限性在对于周遭你是很难有效地剔除的,比如说我有一个三角形吧。

那我这个三角形本来就是处在这个三角形周围的,来很快的帮助我把这个三角形有没有跟周围近邻之间的碰撞,能不能剔除掉,这个就很难了对吧,因为我只有把整个数,我才知道说我这个三角形跟它的近邻之间有没有相交。

呃所以说大家就研究说有没有什么办法来处理这个问题啊,然后有一些的工作吧,啊比如说这篇paper就是叫做energy base self collision carly。

他的一个思路就是说我可以去在对于每一个物,每一个区域,我可以计算出一个能量来,然后我可以根据这个能量的大小,形变能量的大小来判断说有没有可能出现下降,因为大家一个总体思路就是你为什么会有相交。

本质上就是因为你形变过了对吧,假如说它原来的状态是没有任何相交的,原来静止的状态是没有相交的,那么因为你发生形变了,那么就有可能出现相交,形变越大,那么相交的可能性就越大,你形变越小。

相对来说它的可能性就越小,这就是一个思路,就是利用这个定义一个形变的一个能量的一个一个threshold,相当于是一个一个直,然后他利用这个值来决定说这个区域有没有可能出现相交来进行检测。

当然这个方法怎么说呢,就是有些情况还是不太适用的,比如说我们做衣服模拟啊,其实不太适用,因为衣服模拟很多时候它就会出现大型变,大型变,其实它也没有相交,也没有任何的相交,所以说你也没有办法判断出来。

对于衣服而言,这种能量剔除的方式并不是特别有效,对于本身就很少会出现形变的物体而言,这个方法倒是比较有效的,一些弹性体会比较有效一点,可能,好吧,然后反正简单的总结一下。

spatial passions,spiditioning,这种对空间进行划分的方法,它实现起来会比较容易,这个其实我也是比较,如果说大家自己想要写碰撞处理,这是我师比较推荐的。

因为它这个东西特别容易写,然后呢他对gpu上也是特别友好的,你如果要在gpu上写一个special hush也很容易,所以说我们看很多的代码,基本上都是基于这种special hash sp。

它的缺点在于什么,缺点在于它的计算成本会相对来说高一点,因为你需要每次每次物体发生运动,你都需要重新计算这个东西对吧,你需要重新的决定哪些格子存了哪些三角形,存了哪些四面体就需要重新计算。

所以说它重新计算的成本会更大一点,可以把这个成本尽量的减小,这个也是为什么大家依然会考虑使用special peditioning的一个原因,the volume hiking呢。

如果说你自己写这个代码会比较麻烦一点,接下来会挺麻烦的啊,甚至于我自己都从来没有写过这方面的代码,我我我一直以来写的都是special hash,bond volume happy。

gpu上不是很友好啊,因为它整个你需要去构造一个数据结构吧,一个数的一个结构嘛,我们知道树的结构它其实是不太适合gpu进行存储的,gpu是比较喜欢这些简单粗暴的一些结构,结构太复杂了,对于gp而言。

当然也不是不可以做,有很多呃一些一些一些我们一些研究的呃,方向,也也做过一些这方面的研究,但是总的来说跟spatial hush比是不是很gpu友好的,那它的好处在于更新起来会比较简单。

因为你整个树的结构你不需要更新嘛,因为一个机器人的结构,你定你一开始定义好了,你就你就定义好了,你所要更新的是他们的bounding volu volume的。

你可以根据这个数的结构来进行一个便利的一个更新,这个相对来说更新起来会比较方便一点,这是bounding volume hay的一个优点,好了,然后这个反正就是我给大家简单介绍一下。

这两个是两个方不同的方法,然后如果说大家自己想要去实践一下的话啊,就还是需要就是去读一些paper啊,或者是读一些教程啊,然后对这个东西再多聊了解一点,因为我毕竟这个时间也有限。

咱们p p t每个方法差不多也就两三页的ppt嘛,只是把这个思路给到大家,那反正就是这张我们先过啊,好我们接下来我们来讲,假如说我找到这么多的这些对了,这些pe我怎么样进一步的知道有没有碰撞。

这个就是进入我们的narrow face的这么一个环节了,要做实际的碰撞检测了,那么针对于两种不同的碰撞检测方式呢,我的需求是必要的,比如说我连续碰撞,比如说我离散式的碰撞检测。

我需要的是三角形跟边的对,对于连续碰撞,我需要的是点三角形跟边边的对,所以说他们的需求是不一样的,我这个图可能画的有点误解啊。

就是就是这两种spatial passion bonbon还可以都可以作为后面的输入,不是说special passion只能做edge fbi bo,只能说这个continue他们都可以都是可以的。

只不过针对我们后面两种不同的实际检测模式,我的需求会稍微有点不一样,那么我首先说一下什么叫做dcd discrete,它并不能叫city tx,你可以这么认为,它其实并不是tx,它检测的不是碰撞。

它其实检测的是香蕉,它想要知道说我当前这个状态下,我这个物体有没有自相交,或者说我这个物体有没有跟别的物体发生相交,所以说它其实真正检测的是香蕉,并不是碰撞,那么怎么检测相交呢,怎么检测相交。

我可以对于一个三角形网格而言,我可以认为最终我们想要检测的是边跟三角形,对于每一个边跟每个三角形,我可以做一个线条检测,而这个橡胶检测是三角形网格的最最最最基本的一个检测,你你任何的其他的复杂的检测。

你都可以利用这个来进行实现,那怎么检测,那就是我们最最最最早就是第二节课里面我们讨论了很多啊,相交检测方式嘛,这就是其中一种,就首先我对于一个边而言。

我可以把这个边用我这个三角形所在的这个面进行一个橡胶检测,我这样子的话我可以找出啊交的这个时间点来找出这个时间点了,完了之后呢,我就检测说我这个点是不是跟这个点,是不是落在了这个三角形的内部啊。

然后如果是的话,我就知道说我我啊不是时间,不好意思,这个t不代表时间,因为这里没有时间的概念,这个永远都是只有一个状态,是某一个状态下,我想要知道香蕉吗,它没有任何运动的概念,这里面不好意思。

我说你说错了,就是dcd,它其实没有任何运动的概念,它就是在某一个状态下,你想要知道它有没有相交,所以说这个t它实际上不是时间,它这个t代表的意思是这边的这个差值的量就是这条边。

假如说是由两个顶点所构成的,那这个t代表的是相交的位置所需要的这个差值的这个,这所以说先把这个差值的量算出来,算出来完了之后呢,我知道说我这个点这个边上的这个点所在的这个位置了。

然后呢我再检测这个点是不是落在三角形内部,如果是的话,就表示有相交,如果不是的话,就是没有相交,就差不多就这么一个思路,然后这个是一个呃比较简单,比较叫robust的一个方式,对于其他相对来说。

对于连续碰撞而言,为什么,因为我只需要检测,我只需要检测上交就可以了,那么这种检测方式我们刚才说了,它其实并不是真正的检测碰撞,有同学可能就会问说你这个碰撞跟香蕉到底有什么区别啊,这是不是一回事情啊。

事实上并不是,我给大家举个例子啊,假如说我有两个三角形,绿颜色的在上面,蓝颜色的在下面,然后呢我进行一个模拟,我做了一个动画模拟,模拟完了之后呢,蓝颜色的跑到上面去了,六颜色的跑到下面去了。

如果说我进行相交检测,那么我检测的永远都是只检测了这两个状态对吧,进行相关检测,然后呢我回去会发现其实并没有任何相交的时候,他俩是分开来的,t的时候他俩也是分开来的。

所以说我如果光去检测相交这个状态是好的,但是没有相交不代表没有碰撞的,这个就不一定了,对不对,就比如说这两个三角形而言,很有可能这个绿颜色的东西就是绿颜色,那么在中间某一个时刻。

他们是有可能发生了碰撞的,只不过如果说我只是单纯的做相交检测的话,我没有办法去发现这种可能出现的碰撞,这就会导致一个问题,叫做tling effects,就是说物体如果说它运动得特别快的话。

它有可能会穿透另一个物体而没有被检测到,一般来说对于四面体模拟啊,对于钢铁模拟啊,还有对于这种大的物体而言,这种bk的这种比较体积比较大的物体而言的,这种他人fx出现的概率会比较低一点。

因为你一般来说没有办法运动的那么快,一下子就穿到另一侧去了对吧,但如果说这个物体特别的薄,比如说衣服,比如说我们模拟兔子的时候,兔子耳朵特别的薄,特别的细。

那么这种情况下就有可能出现tony artifact,就有可能会会穿透,所以说呃discrete collation detection,它有它的好处,就是它比较高,它比较简单,它比较稳定。

但是呢它也会存在这么一个问题,就是它有可能有他的allig,这个问题不是说不能避免啊,你可以把这个不长时间不长搞得小一点,有可能你会容易发现一点,让它慢一点,也可以发现这个问题,但从根本上呢。

如果说要避免这种他能ing artifacts,那么我们就不应该检测,两个状态的相机我们应该检测碰撞,那么什么是碰撞的,碰撞,就是说,在这两个状态之间有没有相交。

因为离散的检测呢我们检测是这两个状态上有个相交,而连续的碰撞呢,就是说我们检测这两个状态之间只是这两个状态,但是这两个状态之间有没有相交,这个我们把它叫做碰撞,对于一个三角形mah而言。

有两种基本的连续碰撞的元素,一种是点三角形,总是边边,这里给大家举一个点三角形的例子,假如说我有四个点,其中三个构成了一个三角形,每一个点都在运动,你看x0 在运动,它有速度,x一也在运动。

它也有速度x2 x他们都有速,都有自己的速度,每个点都在运动对吧,然后这种情况下,我怎么知道他们有没有相交呢,有没有碰撞的,那么首先我想要知道在什么样的时间,这四个点是在同一个面上的同一个面。

也就意味着这四个点构成的四面体,它的体积为零,然后根据我们之前四面体体积公式啊,我可以得到这么一个式子,30x30 就表示是x3 减x0 吗,然后这个t表示是t时刻的位置。

所以说它是一个关于时间的一个线性函数,同样的x10 就表示x一减x0 ,关于时间的一个函数,然后x2 减x0 是后面的一个,然后每一个都是关于时间的一个函数,然你会注意到它们都是线性函数。

因为我假设啊每一个点的运动都是跟时间的线性关系啊,因为这里我们有三次有两次乘法,一次是一次是点乘,一次是差成,对于线性函数而言,如果说我进行了两次乘法之后,最后得到的会是一个关于t的,关于时间的一个。

一元三次方程,这个t呢是我们的时间变量,时间的未知量,而这个a abcd呢你可以通过我这个公式推导,可以得到,把这个公式展开了之后,你最终就会得到一个关于时间的一元三次方程了。

你就解这个一元三次方程解出来了之后,你就得到了这个相交的时间,然后得到这个香蕉时间之后呢,你就知道相交的位置了啊,然后你就需要检测说这个t3 的这个点是落在了这个三角形的内部,如果是的话。

我就知道这个点的三角形发生相交了,如果不是的话,就没有相交,就大概是这么一个思路吧,具体的公式嗯,大家需要回去自己在呃,但是基本上是这么一个思路,有什么问题吗,有没有什么问题。

可以大家可以看到这个东西会比之前我们dcd就离散的,只是进行这个状态上的检测的,碰撞,相交检测会很多,因为我这里需要解一个一元三次方程,前面我那个t之前以前这个t就比较简单,就是一个线性的关系。

我直接可以通过一个除法就可以得到了,所以需要解一元三次方程我才可以得到,大家会解一元三次方程吗,我问一问,做了点跟三角形的橡胶判断对,因为这个点跟这个三角形都在运动嘛,那么每个点都在运动。

所以说你需要知道这个运动的过程中有没有橡胶,你不需要做三角形跟三角形的判断,你可以把这个三角形跟三角形点个三角形,还有边跟边拆成两个三角形跟边跟边的来做判断,比如说我想要知道三角形和三角形有没有碰撞。

对吧,我首先一个三角形有三个顶点,我把这三个顶点拿去跟另一个三角形做判断,做着做判断,我再把边跟边拿去做判断,这个所谓的basic的意思就是说,如果说如果说你没有检测到这种相交。

那么也就意味着这两个三角形必不可能有相交,然后那个一元三次方程,我不知道大家知不知道一元三次方程和一元二次方程一样,都是有公式解的,三次方一元二次方程,大家的公式解应该都会吧。

这个大家应该应该应该中学里面肯定都学过一元三次方程,它其实也是有公式的解的,这边跟边我等会回家,然后戴士呢,一元三次方程的公式解,我不建议大家用,因为因为三次方程的公式解,他需要开三次方的根号。

开三次方的根号,然后那个开根号大家知道,差会很大,数值误差里面会很大,如果说你开三次方的那个根号,就是那个就是这个,这个数值误差会非常大,大家知道吗,就浮点误差。

大家知道浮点误差大概是一个什么样的数量级吗,用牛顿法,应该用牛顿法,大家尽量用这种数值方法去解,不要用这种,因为求证公式的误差会非常大,对如果是单精度的浮点是1亿的-7次方,如果是一一的单精度。

如果是一的-7次方,你开完这个之后啊,你的数值误差差不多就是这个7÷3,差不多就是1亿的-2,就是1%的数值误差,这1%的数值误差已经相当惊人了,所以说大家所以说我不建议大家用这个,不要用求根公式去解。

尽量尽量用数值方法去解,这个反正如果说你搜一搜的话,你会发现求助公式的,但是我不是很建议大家用,这里给大家看一下边跟边,其实边跟边跟刚才前面那个点三角形非常像啊,就假如说我有两条边,一条边。

然后呢你想要知道有没有香蕉嘛,其实也是一样的套路,就是你首先看一下什么时候什么时候呃,你最后得到的也是一个一元三次方程,解完这个一元三次方程之后,你看一下这两个边是否有相交,如果有相交的话。

你就输出就结束了,三角形非常像,有同学问有没有什么好的库做一元三次方程,我我其实不知道,因为我们一般来说都是自己写的,一般来他说我其实到诶,而且我一般来说不会建议大家用那个牛顿法去解一。

用二分法会比较简单一点,二分法大家知道吗,我以前上过数值分析,数值计算的课,有没有学过二分法,呵简单的说就是说你比如说你想要知道,因为因为我们这里有个特别大的好处在于什么。

最大的好处在于我只需要知道零跟一之间有没有根就可以了,会在零跟一外面的根,我是不需要的,我只需要零跟一之间的根,所以说我假如说我一开始设零跟一,是我的这个段区间,我对它进行二分,首先我给它分成一半。

然后我分别检测这两边有没有跟没有根的意思,就是你判断一下这里是不是比如说都在同一侧,然后中间有没有拐点什么的,然后如果说有根,比如说这个一个点在这个点在这,那么你再对它再做二分。

然后一步一步的这样分下细分下去就可以了,如果需要多个跟多个解怎么处理,我们一般来说会如果说你有多个解的话,你会我们会把所有零跟一之间的解先算出来,然后就是选第一个,第一个,然后看就是一个一个检查。

看看哪一个是满足的,然后找到就是有碰撞的那一个结,这也是做我们做连续碰撞里面一个比较比较麻烦的点,就是这个球根还有处理这些根的问题,然后反正就是给大家简单的,然后我刚说了这个就是c c d这种连续碰撞。

它有浮点精度的问题,这是由于求根公式所导致的,有同学问为什么要做边边,是因为如果说你做点跟三角形的话,呃,会有可能就是两个三角形,它会有边跟边的相交,他点个三角形永远都不发生相交,这是有可能出现的。

这里有个三角形,然后我这里也有一个三角形,这个点往这儿走,这个点往这儿走,这个地方它是不是就发生相交了,但是如果我光是检查点跟三角形,你检测不到,因为它只是在边跟边上发生相交,所以说我既要做点跟三角形。

也要做边跟边,我可以我才可以保证整个三角形是三角形,mash,它是完全没有任何相交的,你就有可能出现这种边跟边发生相交的关系,刚刚说哪儿了,就是我们浮点误差,浮点误差的话呃,有一些解决方式啊。

比如说我一般来说会给一个app solo,就是说比如说我不需要需要严格的保证零跟一,就举个例子,不需要保证零跟我可以说比如说负担absolo到一加absolute之间。

我可以把稍微我可以把我的区间给它放大一下,这样子可以让我的检测会更加稳定一点,但是呢有可能导致false positive,其实并没有任何碰撞,但是我认为他有会有可能有这个问题。

然后游戏里面一般来说用的单精度比较多,所以说这个是大家需要注意的,这个大家都知道吗,就是g p u gpu以单精度为主,说你你在开发的时候,你会你要特别注意这个浮点误差的问题,计算量上来说的话。

它比cd要慢很多,因为你需要做一元二次方,你需要解一元三次方程,你需要做更精细的处理会更慢,当然了,有很多人说就是说其实这种嗯就是这种检测,它其实计算成本并不是很大。

真正的计算的大头在于我们前面的这个剔除的部分,到这里,其实计算成本哪怕你高一点,其实也没什么,因为他这里不是大头,这种观点,ccd呢会比较难以实现一点,而且我自己发现就是我们我自己写也经常有状况。

所以说他是一个比较比较有挑战性的一个事情,就是如果说大家我记得还有个同学不是自己写游戏引擎吗,如果你自己想要写个dcd的话,我是不太建议的,尤其是在对于游戏开发而言。

dc连续dcd离散的这种碰撞检测会相对来说容易很多,这种会比较麻烦,而且而且我自己的经验就是如果说你写这个这种喷撞,分窗处理,一般来说你写一次啊会有一点经验啊,但是呢会有出现各种问题,然后你写第二次。

第三次,第四次,然后你写的多了以后,随着你写的字数慢慢变多,也会变要有经验一点,你写的东西会更好一点,这种东西其实是需要一个积累过程的,为什么我说其实像碰撞,很多时候就是它的概念其实很简单。

但是你要做的好,却没有那么容易,原因,然后关于关于这个连续碰撞,我比较推荐大家读这个论文吧,这是最早的一篇做这种碰撞检测的一篇碰撞处理的一篇论文,02年的一篇paper。

他这个paper比较有意思的特点,就是它模拟倒是很简单,它模拟就做了一个很简单的这种显示积分啊,他很大的精力就花在碰撞处理上,其实也合理,因为如果说你碰撞需要用小布长的话。

那么你模拟本身你处理你的步长大小其实不是特别大,因为你横竖你都还是需要用小步长来进行很精细的碰撞处理的,当年02年的时候的一篇论文,然后接下来我给大家讲一讲,就假如说我们新发现了一堆,碰撞了一堆。

已经发现了一些呃点三角形啊,或者是边边或者是边三角形,反正就我找了一堆pers,有碰撞,有香蕉,我该怎么办,处理这个问题,那么有两个基本的思路啊,叫做interpoint method。

一个叫做impact method,思路是这样子的,就画了一个示意图,你可以认为是我们初始的状态,你可以认为是我们进行了一个dynamics模拟求解之后得到的状态,假如说我初始的时候是没有碰撞的。

可是在这个蓝颜色的区域是安全区域,蓝颜色的下面这个区域就是我们的安全区域,在安全区域,但是我们模拟完了之后呢,我的结果有香蕉,有碰撞,它不安全了,那我应该怎么办,有两种比较标准的思路啊,思路叫做内点法。

所谓的内点法就是从安全的位置出发,一步一步的往前走,给出的位置,我保证我走的过程中,我永远都是在这个安全区域内,直到找到我的最终解啊,我走到我不能再进一步优化我这个位置为止。

那这个位置呢呃理论上也是离我的这个想要这个模拟的结果,最近的这么一个位置,那为什么叫内点法,顾名思义嘛,就是我永远是在我这个安全区域的内部,所以说我叫内点法一种思路,那第二种思路呢就是胆子比较大一点了。

他的意思就是说我其实并不关心我这个过程安不安全吗,我只需要找到我最终的结果就可以了,那怎么找最终结果呢,我就从我这个结果出发,我本来的结果是不安全的啊,不要紧,我他说我本来的结果不安全。

我反复的我优化我优化我这个结果进行一些优化,我进行一些投影的操作,我只要最终我能够回到我这个安全区域就可以了,这个就是一个胆子比较大的方法,就是过程它有可能是不安全的。

但是我只要我保证我的目标能够最终满足我安全的需求就可以了,叫做impact,这两种方法的优缺点有什么呢,大家根据他我这个刚才的这个描述,其实大家可以大概猜得出来他们两个的优缺点是什么。

点法它的缺点在于它慢,它为什么慢啊,因为它需要保证步步安全,对不对,那你要保证步步安全,也就意味着,首先我每每一步很有可能都不能太大,我可能都要很小,都要用小步长来走,很有可能一步就出去了。

第二点他为什么卖,所以我有可能我的这个初始的这个位置跟我这个目标位置非常远,我要走很远很远,我才可以到我最终的目的,到目的地要经历很长的一个过程,它才可以收敛,才可以达到结果,那点反的好处呢也很明显。

就是它永远都是安全的,那么永远都是安全,也就意味着它永远都可以成功,因为我哪怕没有收敛,我只要在中间的位置,我只要结束,可以接受这样的结果,因为我不能结果就是有有碰撞,有相交的结果。

那个是我不能接受的嘛对吧,但反过来说,虽然说我可能没有收敛到位,我可能诶走的比较慢,但是呢我只要中间停下来,那我也可以接受,反正我没有香蕉嘛,我多少没有香蕉,那我反正我可以继续模拟跑下去了。

内点法的一个好处就是他永远都是可以成功的存在,失不失败的问题,那么impact the optimi最大的好处就是在于它比较快,来源于几个方面,首先一般来说,这个点离安全区域都不会特别远。

意味着我可以很快地投影回去,而且呢一般来说一个物体它不可能所有的地方都有碰撞,那样子太糟糕了对吧,一般来说一个物体它只是在某一个小区域上会有碰撞,大多数的地方它都是没有任何橡胶,没有任何碰撞的。

这种投影方式,也就意味着我在进行碰撞优化的时候,我只需要集中优化那一个小区域就可以了,这个名字的由来叫做一tt the operation,什么意思,就是我对对于有碰撞的区域。

我对这个impact的我优化,我其他地方没有碰撞,我就不需要碰一个很大的优点,就是它可以集中我所有的计算力,在这个出问题的区域上,它也可以用很大的补偿,因为反正他胆子大吧。

你只要最终结果能够满足我回到我安全区,我就嗯我就可以,我就接受了,它的坏处在于什么呢,坏处在于它有可能不成功,可能没有办法找到最后的这个安全区域,其实在你不长很大的时候,如果说模拟你时间不长很大。

导致你这个点安全区域特别特别远,那么有可能你就没有办法顺利的回到安全区域,那就这个就没法继续下去了,还有一个缺点,关于一派中的一个缺点,就是它的结果有可能没有办法保证把这个碰撞处理掉,能够回答程序。

那点法一个比较常见的一个例子,就是我们之前呃说过的叫做log barrier function,log barrier那点法就是利用一个log函数你的能量,然后利用log函数的一个能量产生了一个力。

我们来作为一个推迟排斥力,简单的思路就是假如说这个是一个边界的话,这是一个距离的话,那么随着我距离越来越短,我的这个互斥力啊,我这个rog的这个互斥力会变得无穷大,变得无穷大之后呢。

它产生的这个力也会变得无穷大,所以说最终他会把这个物体,只要你采用足够小的步长,它就能够把这个物体给它推出来,但是图形学里面嗯,大家有的时候不太喜欢说你这个互斥力一直都存在。

因为我们原来的log函数是定义到无穷远了,所以说图形学里面就是给可以给他做一个截断,其实在呃最近一些论文里面也用到了这样的方法,就是给它做个截断。

截断的好处在于我可以把它的这个啊log函数的影响力做一个限制,然后怎么实现呢,怎么实现,其实挺简单的,就是啊我可以定义一个优化目标,优化目标就是我想要这个点的位置跟这个目标的位置足够接近对吧。

我需要首先定义一个距离函数,我想减小这个距离,我增加一个log的p t的一个函数,互斥d的这个函数,然后呢我利用比如说梯度下降法或者是别的什么方法,我进行模拟就可以了。

然后那个i p c那个论文我不知道大家有没有听说过啊,就是用不用用这个梯度下,他用别的方法,他用牛顿法这些方法,反正就是各种方法嘛,你用数学方法数值优化的基础的话。

你就可以利用各种数值优化的方法来进行这个模拟,这里面比较关键的一点就是你的时间,你的这个不长,发的这个梯度下降的不长,这个不长,很关键,为什么,因为如果说如果步长太大的话。

你就有可能跑到安全区域外面去了,所以说你在不长,在进行布长的时候,你需要保证都是没有碰撞的,是很重要的,就是你要保证没有碰撞发生,怎么样知道没有碰撞发生呢,你就需要进行碰撞检测了。

所以说啊这种interior point的,它里面的计算量其实也挺大,为什么他每走一次,他每走一步,每走一小步,它都需要反复的进行碰撞检测,所以说它的计算量其实就比较大,复杂我我我不知道怎么讲。

要不就不讲了吧,这个反正比较复杂,就是把它搞成了一个优化问题,跟刚才有点像,但是他他不用能量,他用一个他用一个constraint,然后用这个constraint进行优化。

然后concert优化的话就是有各种套路,比如说有augmented lang langer方法,还有一些各种各样的方法,这个我我我我我就不知道怎么讲了,因为大家如果没有一些呃一些约束优化的基础的话。

这个还是挺比较困难的,但反正就是给大家介绍一下,大家了解一下,就是有有有这么一系列的,有这么一个套路吧,然后这篇paper就是我前面提到的这篇paper,它其实不只是做了,只是做了碰撞,碰撞检测。

它也做了碰撞处理,然后他们里面就用到了一个呃impact operation的一个方法,就是约束来做,然后他们他们的约束就有点像我们之前做p p t的那种约束,就是发现比如说你发现两个物体他很近对吧。

他就给给它一个冲击,把它硬生生地给它呃,拉出一段距离来,差不多是这么一个思路,用这种方式来试图让这个物体没有碰撞,前面说了嘛,就是这种方式就是它使用都是在进行一种尝试。

它不能保证说你最后结果就是真的就是没有碰撞的,它只是根据这种碰撞的趋势,它给这些点啊,这些三角形啊,给给一些施加一些需虚拟的一些冲量,然后试图让这些物体分开,这个这个也过吧,刚才讲了两种方式对吧。

impact mination,还有讲了那个point method,如果说我试了这么多方法之后,我还是搞不定怎么办,是香蕉,我还是有碰撞,我怎么办呢,备选方案就是什么都不做,什么做不做的意思。

不是说我有相交了,什么都不做的,意思是我回到前一帧,就是没有相交的那个状态下,是什么都不做,当我发现有一些物体它有它缠在一起,它有可能有香蕉的时候,我就把这个区域给他冻住了,我把这个去封动起来了之后呢。

这个区域它就没有相对的位置,它没有相对的位移,但是好处在于,因为它整个区域被分动起来了,那也也就意味着它没有办法产生碰撞了,方式叫做rigid impact of method。

就是它把整个区域都当做了一个钢铁,把这个整个区域都给它封印起来了,然后非常简单也非常的安全啊,这个artifect也很明显对吧,因为如果你整个区域给封堵起来了,你就没有相对的运动,对不对。

整个整个区域相当于被锁死了,但是好处在于呃,如果如果说你真的是一点办法都没有,如果说你真的是搞不定这些碰撞,那么这个相当于是你的最后一根稻草,就是你的救命稻草啊,另一种方式,比较现实的一个思路是什么。

就是说我首先做连续碰撞检测,检测完了之后呢,我做impact doination,为什么先做impact of innovation啊,因为这个东西很快,相对来说比较有效率,测完了之后。

然后呢如果说没有碰撞都搞定了,那么就是一个happy ending,我说搞不定怎么办,那么有两种选择,一种选择是我做回到我前面那种方式,我做内点法比较慢,但是比较安全,然后另一种方式。

如果说我计算量不允许我的,虽然条件不允许,那么我就做rigid intel,我就把整个区域,把这个碰撞的这个区域给他锁死掉,然后锁死了之后呢,我碰撞了,这也是一种思路,是关于碰撞的响应的这一块。

碰撞响应呢我给大家再讲一下另一个思路,另一个方法,香蕉解除,解除这个思路就是换了个角度,就是说他不是一个灾难,对不对,虽然说看起来不是很好,但它并不是一个很严重的大灾难,游戏里面更常见一点。

大家可能就经常看到有相交的情况啊,这个很严重的事情,那么如果有香蕉怎么办呢,我只需要把这个香蕉给它去除掉就可以了,我不需要关心关心那么多什么碰撞啊,然后碰撞时间什么解一元三次方程这种东西都太复杂。

对我来说太复杂了,我不了那么多,我只需要关心一件事情,就是我现在这个时刻有没有相交好,我想办法把这个香蕉解除掉,没有香蕉,那么我就ok如果说我有香蕉,我解除了还是没解除干净,不要紧。

我到下一轮我再想办法再解除,这就是一个思路,相交解除,那么它的前提条件就是我不要求一定是没有橡胶的,就可以有相交,但是呢我只要想办法把这个橡胶解除掉就可以了,那个为什么用这个技术,它有很多原因吧。

有的可以有可能是因为本身我前面的这种想要完美的解除相交,完美解除碰撞的这种方案失败了,我这个相当于可以作为一个后续的一个方案,如果说万一我真的是有碰撞,我没办法处理干净,有香蕉,我没有办法处理干净。

这个相当于是一个后续方案,然后另一个另一个原因呢,就是很多时候用户呃,比如说cad设计软件啊,很常见的就是用户它有可能会进行一些非法操作,它可能给你拽着产生相机了,那在这种情况下。

我们需要有这种算法能够帮助我们的这个碰撞给它处理掉,我们来处理这个香蕉呢,嗯,对于volume而言,就是对于有体积的物体而言,这种香蕉处理是这种橡胶处理是比较简单的,怎么说呢。

就只要我们检查一下这个点是不是落在物体的内部,如果是的话,我把它朝着物体的外部推出去就可以了,之前啊做这个模拟,我们这个作业里面做球跟布料的模拟对吧,其实就是利用这个思路,布料也是一样的。

我只要把这个点从物体内部推出去就可以了,那只要对这个物体volume定义一个and distance function,我利用三distance function,我把主体推出去就可以了。

我们之前做的很多碰撞,其实基本上就是基于这种比较简单的橡胶解除的这种思路做的,啊但是如果说是一个布,一块布,它深发生了香蕉或者是两块布之间发生了香蕉。

我就没有办法用三distant function来进行这种处理了,因为它本身并不并封闭的曲面,我没有办法利用封闭曲面来定义一个3d的方式,比如说我给大家举个例子,比如说我有蓝颜色的一块布。

还有绿颜色的一块布,就两块布对吧,怎么样来解除他俩之间的相交呢,没有办法利用3d s function来来推来知道哪边是里面,哪边是外面,因为一个布它的人正反面并不代表里外,所谓的里外这个概念。

在想这个问题,然后巴瑞斯跟韦德,其实我可以利用这个香蕉,我可以对这个布进行一个分段吗,这个蓝颜色这个布它分成了三段对吧,中间然后左右绿颜色的布也分成了三段,其中间,那么我可以利用这个分成的这几段。

我来判断一下,说哪一段大,哪一段小小的那一段,也就意味着是产生相交的那一段,就是这个区域,我这个呃这个区域的大小我来进行一个判断,因为这个区域相对来说跟左边跟右边的区域相对来说都比较小。

所以我就认为中间这个地方是有相交的,那么有碰撞呢,我就想要试图的把绿颜色的点都往下面挪,的点都往上面挪,然后我就可以把这个橡胶给它解除掉了一个思路,当然如果说中间这个区域很大啊。

就有可能是中间这个区域是ok的,而两边是发生相交了对吧,因为你当你发生这个相交的时候,你其实并不知道说到底是这边发生相比较,还是这边左边这个发生相交,还是右边发生相交,其实你是判断不出来来的。

你只能根据这些面积它的大小,你认为面积大的地方就是没有橡胶的,是ok的,是原来的状态,面积小是刚发生,刚刚刚刚发生相交的状态,原来这边paper呢它有个问题,就是他没有办法很好的处理边界内部的香蕉。

它是比较容易处理的,但是它边界上会比较难以处理,1。03年的一篇paper叫做untangling cross,给大家举一个例子,就是他们在pixar他们做的一个动画效果,然后呢他发现了这两个区域。

这两个区域比较小,同时也有相交嘛对吧,所以说他就根据推的方向,他把呃把它推出来,右边的一个可以接受的一个状态,那个方式呢它比较嗯怎么讲它它它它有一些局限性。

他除了那个你需要进行那个他没有办法处理边界以外,它还有一个缺点,就是它比较依赖这个呃,就是这种这种flat field,就是它需要对整个面积进行一个评估,你在gpu上实现。

所以说后来大家又搞了一个另一个方法,另一个方法那就相对来说比较简单了啊,这个这个具体的方式我就不讲了,这个这个图也不是特别直观了,但是大家可以简单地理解成,就是他想要尽量的让这个曲线。

因为当你发现香蕉的时候,你不是会有一条曲线吗,这条曲线是它的这个相交的这个曲线,尽量让这个相交的曲线变短,然后当然如果说这个相交曲线就零了,也就意味着相交解除了,比如说一开始的时候。

比如说曲线是这么一个长度,然后随着曲线越来越短对吧,最终像解除,然后呢嗯就这篇论文他也讨论了,其实可以处理边界的情况,比如说边界上我有我有橡胶,那么通过缩短相交曲线钱的方式。

我也可以把同样这种情况他也可以处理,论文它不是完美的,它有很多呃,它有一些没有办法处理的状态呃,但也需要呃了解,就是这个方法它不是特别完美的,因为它是基于局部观察,局部优化这个曲线的这种方式。

然后这是06年的这篇paper,叫做resuming surface collation,through,infection control lization,它这个标志其实很很明白。

就是他想要他想要让这个相交的这条曲线变短,最小化的这种方式来接触相交,如果对游戏数据gpu上怎么样处理这个衣服的碰撞的话,可以大家可以参考一下这个论文,然后今天差不多到此为止,然后给大家总结一下。

碰撞两个部分构成,分别是碰撞的检测和碰撞的响应,碰撞的处理,这个检测呢又会分成两个阶段,第一个阶段呢是我需要做一些基础的目的,主要是为了提高我的计算效率。

我需要把那些不可能有相交的这些pass给它剔除掉,然后这部分是实实在在地做碰撞的检测,有两种碰撞检测,分别是离散的和连续的,同样的也有两种碰撞响应的方式,叫离散那个连续的。

然后它们的优缺点我们也讨论过了,总而言呢我需要保证,整个状态变成没有碰撞的状态,那么有两种方式,分别是内点法跟impact,还有另一种方式叫做regic impact,肉啊,可以认为是最后一根稻草。

但是它有很多问题,所以说实际操作中,大家啊一些论文他们一般来说用瑞吉林拍动比较多,但是后来近10年近甚至是近20年的论文,大家一般来说很少会采用这样的一种方式,碰撞响应而言呢。

大家的意思就是我只需要把香蕉给它解除掉就可以了,我并不关心有没有碰撞,我只需要把碰撞只需要把香蕉给解除掉就可以了,然后呢甚至于说呢香蕉可以存在我在以后的帧率,我把它解除掉可以了啊。

然后对于呃因为有体积的物体而言啊,这种方是比较合适的,比较简单的,我可以利用我们的sd function来做,但是对于布料的自碰撞啊,这个就会比较麻烦很多啊。

这就是为什么大家又研究了啊啊这些论文在后来处理这些问题,呃然后今天关于碰撞的这个呃话题,我们就先讨论到这儿,然后下周啊,然后后面三周我们会讨论流体啊,也是算是一个全新的一个开始吧,有什么问题。

可以考虑要摩擦,就是一般来说关于摩擦它其实有不同的方式啊,就是比较简单的一种套路,就是把摩擦大家放到后面去做,就是不要在碰撞的响应里面做摩擦,而是把它放到后面去做,就是你先把碰撞全部检测完了。

然后碰撞全部处理完了,然后把摩擦的这个力啊,摩擦的这些东西呢作为后面的一些后处理的一个过程,但这个带来的缺点就是它不都不够精确嗯,然后也有人做,就是把摩擦和碰撞一起进行处理,一起进行优化的那种。

其实优化起来会更麻烦一点,而且一般来说一般来说很少做那种自碰撞的处理,摩擦处理会怎么做,一般来说如果说你跟一些钢铁进行摩碰撞摩擦,一般来说可以相对来说会比较容易一点,的方法是吗。

嗯其实你可以认为就是这些就是这种,因为我们之前谈in pose的时候,并没有谈太多的碰撞检测,症状检测之前很简单,我们就是根据三distance function来做的对吧,事实上对于很多形变体。

你没有办法用3d function,衣服他就没有办法用sdsfunction面料,你没有办法用sdsfunction,症状检测这一块是特殊的,只有三dx function。

一般来说就只有做这种volume的物体,它有体积的物体,它比较容易做pos的这种响应的方式,它其实是一种离散响应的方式,是连续的,就是你可以这么想,就假如说我有一块有个桌子,然后有物体对吧。

他猛地穿过去,他有可能就直接穿到这个桌子的另一侧去了,中间就没有检测到了,那么你用impulse这种方法,你就没有办法处理,本质上就是因为我们用来进行检测,只是检测它这个相交,之前讲的一些方式啊。

碰撞的方式其实都是比较简化的,就是在特殊情况下,我可以用这种方式来做,比如说我这个地面,我这个地面是无限后无限深的嘛,所以说就不存在塔诺尼亚的,不存在穿透的问题,就可以拿来做。

今天的方式你可以认为就是说主要是来嗯自喷状自相交为主的,如果说这个物体不能发生形变,是缸体,或者是比如说地面,或者是比如说我们作业里面签的作业里面的球对吧,球面都是比较简单的,那么他们的碰撞响应。

碰撞处理会容易很多,我说这个物体会发生形变啊,很薄像衣服那样很薄,它这个碰撞处理起来就会很难,会会麻烦很多,我们自己跟我们之前的讨论的这个碰撞的一个比较大的区别,是比较通用的方式。

这个东西我自己感觉就是挺难写的,我自己其实我最早最早开始写这个碰撞的呃,算是大概是在10年左右的时候,然后那个时候写了一版,其实有很多问题,然后后来又写过很多次,然后又推翻再写,推翻再写。

然后后来就慢慢慢就会发现就是有很多坑,你就知道有哪些坑是要尽量避免的,就是有很多时候就是你看别人的论文,你会觉得挺容易的,或者挺简单的,但是你当你实际操作的时候,你就会发现有很多坑在里头。

有限元跟前面的不一样,就是像有限元的话,基本上理论会很复杂,你看我今天给大家的ppt里面都没有什么公式,对不对,为什么没有什么公式,就是因为他们这里面碰撞的这些概念都很容易却很难。

而有限元呢就是概念很难,就听起来学起来很难,但是你自己写代码相对来说就容易很多,这个为什么就是碰撞处理,其实是在我个人觉得是在动画里面最难的一个问题,你看有限元啊,还有衣服的sol。

这些东西其实都是相对来说比较标准的一些套路,都比较标准,所以说这里面其实嗯只要你学明白,数学的基本上都好处理,但是碰撞里面其实就有很多算法的问题,我今天说的这个一元三次方程的坑啊。

就是你们如果没有写过的话,你就会踩到,我说你我我最早就是想1v3 次方程,它是有它是有它是有求根公式的嘛,那为什么不直接用求根公式呢,然后你用你就会发现其实他那个球跟方式的误差会非常大。

不确实是不怎么物理,我说呢这个就是为了这碰撞处理它本身的目的就是为了没有香蕉,没有碰撞,这是他的第一首要目标,物理它其实反而是一个次要的目标,因为如果说你真的要很物理的话,比如说你要真的很物理的话。

理论上你就用很小很小的不长,用很大的repulsion内点法,那样子肯定是很物理,但是那个效率就会非常非常的低了对吧,我们在做,比如说你想写游戏开发,那就没有可能用这样的物理。

没有办法用这样的这种碰撞响应方式吧,用更简单的响应方式,如果大家用过游戏引擎,比如说一个他一般用一个胶囊的形状来实现,车,就用一个一个盒子来说简单的碰撞。

就是图形学就是需要在效果和效率之间尽量保持一个平衡,就是随着我们的硬件能力越来越高啊,这种,效果的要求也会越来越高嘛,那没有别的问题的话,我们就今天就先到这儿吧,我问一下大家有没有以前有没有学过流体。

有没有稍微了解了解一下流体过,这是零基础,因为我们时间比较多,我分三节课讲,所以说我们第一节课讲会讲,然后后面的话会讲两种比较经典的算法,一种是欧拉的那种,欧拉的那这种网格的那种模拟方法。

然后之后s p h就是粒子的那种模拟方法,最后一节课我们会讲例子的模拟方法,记得bullet好像是开源的,我不知道bullet是不是开源的,至于说他写的好不好,我不是很确定啊。

但是我记得好像bullet是开源的,感兴趣可以用一下bullet,但是我不确定他写的好不好,就先到这吧。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

GAMES105-计算机角色动画基础 - P1:Lecture01 Introduction to Character Animation - GAMES-Webinar - BV1GG4y1p7fF

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

好啊,那我看时间也差不多了,那我们就现在开始我们今天的这个课程啊,那首先也是非常啊,欢迎大家来这个参与我们今天games 105的这样一个课程的这个啊,那个当然我们game cn 5。

其实大家在呃可能在我们前面这个宣传上也可以看到了,其实我们这个课的名字叫fundamentals of conomation,计算机角色动画啊基础,但其实也是跟其他的games的课程相类似啊。

是因为我们主要做的部分还是剑姬三维角色动画,而不是这个二维,或者是就是我们会是在可能会涉及二维的内容,但是我们主要的研究对象其实是三维的角色动画,这样一个这样一个呃目的啊。

当然我可以先来简单的简单介绍一下我自己啊,我叫刘立宾啊,现在是北京大学智能学院的助理教授,然后这个是我的个人主页,大家有兴趣可以去这个关注一下,然后这个我其实也很长一段时间都是在做啊。

计算机角色动画这样一个方向,但主要是基于物理的角色动画,其实很长一段时间都是在做这种怎么去控制啊,其实这个是非常困难的一件事情,嗯当我是其实我在北来北大之前,我其实也在迪士尼research啊。

迪士尼幼院待了一段时间,那这个照片实际上是我当年在迪士尼研究院的时候,去这个卢卡斯影业的啊,当然可能有些人,也许有些同学知道这个卢卡斯影业是拍星战的这样一个公司。

然后这个其实这个里边那个那个人物其实是达斯维,达,是那个星战的经典反派,当然我觉得非常有意思,是说在这个在这么一个角度看,他好像在笑,而是一种非常诡异的在笑,所以说我觉得这个还是挺好玩的。

一个一个一个这么一个照片,然后右下角这个二维码是我们啊v cl实验室,就是我们在北大的这样一个可视计算实验室的一个二维,一个公众号的二维码,但是大家有兴趣的也欢迎关注我们的公众号。

我们以后有各种这个啊活动啊,我们也会在公众号上进行啊,向大家发布,嗯,当然这门课其实这个主要的信息我们也都是放在了啊,我们的这个课程的主页上,那我们现在课程主页是现在是放在github上。

有这样一个链接呃,我们上课的时间其实就是从今天晚上开始,每周一的晚上八点到九点啊,大概是半年到九点,因为结束时间可能有些时候早,一些时候晚,取决于我们的这个课程的内容。

那总体来说我们希望这个课程其实也不是很长,大概12个星期的时间,从今天一直到大概12月,12月底应该是1月份之前就结束,那总的来说课程前置要求,因为毕竟是一门基础课程。

所以我们就是还是当然也有一些基本的要求,就是说大家还是需要了解线性代数啊,微积分,然后还有一些基本的编程的这种技术技巧啊技术,那当然我们今年我们这门课其实后面有一些作业啊。

其实主要是python基于python来写,其实这个只有我们之前也也讨论过,就是到底用哪一种方式,其实也是有些选择都会觉得可能python是最比较合适的,因为这个我们也不会讲非常复杂的这些啊。

不会社交非常复杂和非常具体到这个生产环境的一些技术,所以说我们居然还是用python,我们到时候会提供一些简单的这个框架来让大家来使用,然后我们现在cold base也在github上。

但是现在大家去看的话,现在是空的,上面什么都没有啊,当然我们从后面开始留都留作业的时候,我们会把一些这个代码框架放在这个这个地方,但是这个地方大概只有只有只有这个克隆的权限,就是大家交作业的时候。

这个我们还是按照我们以前其他的games的这个课程的要求,我们会有一个交作业的网站啊,大家可能有就可以去这个注册一下,然后我们这个课程本身有一个邀请码,就是现在是写在这个屏幕上。

然后另外我们课程有一个有一个微信群啊,不是微信群,不好意思,首先这个人数是基本是没有上限的,其次是这个二维码是不过期的,所以说这个还是挺不错的,我其实看了看,我觉得现在这是关注这个方三人还是相当多的。

其实我现在那个群里面在潜水,大家可以猜一猜哪一个数,哈哈啊,当然这个这个当然你要猜对了呢,这个我也不会承认的,就是这样一个群,这样一个这样一个基础课程的基本信息。

那当然这个既然我们这门课叫计算机学的动画,那么其实第一个问题就是什么是计算机角色动画,或者是我们关注的是计算机角色动画里面的哪些内容,其实我一说计算机角色动画,大家可能想的都是动画嘛,动画电影。

就是大家都做的非常,大家可能都,这个这个zofia这个疯狂动物城,然后像是这个coco,那我觉得coco这个电影当时还是拍的相当不错的,当然还有一些其他的,我这就没有放了。

比如说我那个学了3年动画的同学,然后做了一系列的东西,其实都是动画电影的东西,那当然其实虽然说动画电影是动画的,就是这些组合动画的这么一个非常重要的一个一个motivation,或者一个应用领域。

但实际上角色计算决算角色动画里边的这些技术,在电影里边的所占的比例是非常非常小的,其实可能只是我们今天讲的大部分内容,其实至少在目前的电影里是没有出现过。

但是未来我们相信其实随着我们现在这种ai生成的技术的这个提高,我其实觉得可能在电影这方面还是会有更多的这种应用的,那要说到角色动画技术,其实应用最多的在很长一段时间里,大量的应用的范围其实是游戏。

因为为什么,因为游戏我们是需要根据用户的输入去不断地生成新的,这种可交互的这样一些内容,这个其实跟电影是不一样,电影基本就是一次性的,而在这个里边,其实角色动画大部分技术是有这样的。

这个就是它是直接直接去推动了我们角色动画技术的这个这个,这个进步和发展,因为这个是因为这是一个真正落地的一个一个一个方向,那其实随着这2年我们也看到很多新的这种,其实也就是也不一定是新的了。

但是一些这个变得越来越啊多的一些应用,比如说这个现在这种虚拟的虚拟的偶像,虚拟的主播,这里边其实肯定有一些动画呃,这个决策化的技术,就数字人我们大部分大部分时间看的都是比较让我们惊艳的。

是这种比如说它的外表,这种渲染技术建模技术现在做得非常好,但是从我们这种其实大家自己可以仔细看一看,因为就是从动作的角度讲,这个它的成熟度还是非常之低的,另外还有像比如说我们vr的社交,vr的应用。

vr的游戏,当然还有一些稍微严肃一点,比如说像是这种呃大场景里的这种人群的这种仿真,但人群仿真其实赛事相关的方向,但是也不是完全的一致,因为他们关注的可能更多的是一些啊一些这些。

比如粗粒度的这样一些动作,但是从细度的角度讲,我其实觉得动画还是会有一些相应,有些应用的这个这个相关的地方嗯,其实也是计算机图形学的这样的一个一个这样的组成部分,好多不同。

这个主要的这种这种这种topic,那其实里边我们知道,如果我想把一个比如电影里面看到一个一个一个一个角色,他在运动,那这里面其实涉及至少有三个领域的啊,内容一个领域是建模,一个领域是动画。

另外一个是渲染,虽然跟建模主要还是涉及是一些静态的,或者说我可以是固定在某一帧上,怎么把它去啊,外观给表现出来,怎么把这个外观给渲染出来,可以展示出来,那动画其实是解决的是什么问题呢。

解决的是说我在这个每相邻帧之间的,或者说每一帧下一帧是该怎么生成的这样的一个关系,所以它他是去建模的,是一个时序上的这么一个规律,所以这是计算机动画跟其他的这个卷机,其中一个方向是物理仿真。

就是大家讲的非常好的一些一些这个这个入门的一些基础知识啊,打通这个仿真来说啊,其实就是仿真跟动画其实有很大的一点,就是跟角色动画其实有很大的不同点,仿真通常来讲我们是目标是一些物理的客观的物理现象。

比如说呃比如说这种缸体的仿真,比如说这些这种软体或者流体水流这样的仿真,还有烟呀或者是火呀,这些这些仿真,它其实主要是一些自然规律的一些这个这个这种这个时间演变的,这个推演。

那角色动画其实是更加关注于行为上的一些啊建模,比如说人的动作,动物的动作,比如说一些比如说一些虚拟角色,或者说比如说这个侏侏罗纪公园,这个恐龙该怎么动,其实都是一些行为上的这个这个这个啊展示。

当然这两个之间其实比如仿真和动画其实还是有些联系的,这些联系是什么呢,但这是我自己的一些一一个看法,就是说实际上仿真加上一些控制,就是动画,因为纯粹的物理仿真,它是一个完全的一个被动的东西啊。

现在没有声音吗,ok我看一下,应该是我这边是可以的,好ok对,那就是说我们的一个物理仿真,一个纯粹的东西加上一些控制,那就产生了相对的行为,那这里控制其实带来了什么呢。

其实在我看来可能带来的是一些主观的一些啊,就是就是这个主观的意愿上的一些一些一些东西,当然这个跟物理仿真其实有很大的不同,点在于什么呢,就是说物理仿真是纯粹的客观的,而且实际上物理仿真我们大部分情况下。

我们是有一些非常精确的数据的描述,然后我们可以完全按照这个数学描述,把这个仿真的现象给给给建立起来,那当然我当然这个描述本身可能是有些不精确的地方,但是总体来说它是一个可描述的东西。

但是对于法这个动作来说,对于行来说相对来说是就这个东西很难,你通过一个数学建模的方式,就是比如说我可以用这个数学公式,用原方程把它给给给算出来,很多时候我们的使用方法其实还是通过大量的这种大量的观察。

来进行一个统计上的一个建模,所以说实际上其实很长一段时间我们当然都是找各种统计的方法,可能是把这个模型给建出来,其实为什么,其实它带来一种新的这种对这些非常复杂的数据进行建模的方法。

他其实也是反过来也是进一步的,也不是反过来,其实正向的也推动了我们今年角色动画在很多方向上的,一个一个一个扩展,那当然从角色动画的角度讲来说,其实其实可能跟物理仿真还是有很大的不同。

点在于角色动画他所关注的对象是一个角色,一般来说我们看到的角色,因为像人,其实人的关节处是没有那么多的,然后我们大,部分的角色其实可能关节数也就是几12 30的这样一个关键数。

整体上来说可能到50~100个,这样的参数听起来好像很多,但其实也没有非常多,或者是其实理论上就是或者再进一步说,我们能看到的,我们能想到的绝大部分的动作,我们都可以找动画师来k出来。

就他可以一帧一帧的把这个pose给做出来,然后实现一个非常好的动画,其实大部分就使用这样的技术,因为就是我就要非常好的结果,我就是要当我可以投入很多的人,很多人很多,的这个人力去做这件事情。

那当然其实这也是从某种角度来说,是把这个角色动画变成了一个劳动密集型的这么一个这么一个技术,那当然这个特别是对我们有些游戏啊,这些方面我们需要做interaction,需要做交互的这样场景里边。

这种方式其实是不适合的,那这段就觉得动画其实我们研究的对象其实并不是说我们去怎么去把,怎么去用手去调这些参数,我们其实是想要去理解我们人和动物在做这些动作的时候,我们到底发生了什么事情。

然后希望能够把这件事情给建模出来,这个一,方面能够帮助我们提供一些更加更加更加smart,就更加更加便利的这种编辑动画的一些工具,另外方面其实也是允许我们可以根据我们的需要。

生成一些无中生有的生成一些新的动作,或者再具体一点,我觉得其实我们计算机学的动画研究的目的,就目标就是说把一个劳动密集型的一个民工活,变成一个这个计算密集型的。

这样的一个让计算机干活的这样一个这样一个方向,这是一个计算机的动画的,我自己写这方面的一些想法,那当然具体来说,或者说我们这门课会涉及到的内,容其实主其实这张图其实呃是描述的比较完整的啊。

就说我们一般来说我们怎么来生成一段动画,或者怎么怎么让一个虚拟形象动起来,那首先我们要有一个虚拟形象的,那这部分是主要是关于几何建模的那边的啊,一些技术,那比如说我我确实比如说可以让动画师。

让建模师给我雕刻出一个三维模型,当然我们现在有很多技术,我们可以通过三维扫描,把我一个人把我自己的形象扫描进来,但是我拿到这样一个模型之后,我首先要做的一件事情,就是要把这个模型给绑定到一个。

骨骼上这个绑定其实涉及两个部分,一个是怎么去设置这个骨骼,另外一个是怎么去计算这个我的这个模型蒙皮跟这个骨骼的相对关系,那这其实是也是一个非常非常重要的一个一个研究方向。

那另外一个方向其实也是我们这门课会主要着重关注的一个方向,就是说等我绑定完骨骼之后,那么这个骨骼本身的运动,就会带动着外面这个模型或者皮套去进行这个形变,去进行这个运动,那这个骨骼本身它到底应该怎么动。

我们该怎么去生成它的运动,这其实是我们角色动画会主,要研究的内容,那当然实际上我们可以想象一下啊,就是我们一般这个呃真实世界里边,比如说我去做一个动作是怎么做的,那首先我大脑其实有些想法。

ok我要是伸手了,我把手伸出来了,那这个大脑这个想法会变成一系列的神经信号,然后这些神经信号会变成我的肌肉的一些这个这个肌肉的脉冲,肌肉的信号,然后肌肉信号呢又导致我肌肉的这个纤维的收缩。

然后最终给我的啊肌肉骨骼系统上面增加了一些这个力和力矩啊,这样的一个这个一些这个外力,然后在一个物理的这,样一个机制之下,我们知道牛顿这个我们的世界本身其实是要符合物理规律的。

然后最终这些立刻例举来推动我的身体来产生运动,那当然这里其实有一部分是我们无法人工干预,就是这个物理,所以说实际上我们可以根据就是很多计算机学的动画的技术,就是可以根据我是否使用了这个物理。

是否对物理这部分进行建模,来区分我们这些角色动画的方法,那么其实有一类或者我们其实在我们常见的啊,非常非常就是在工业界非常大的应用的一类方法,就是所谓的这个基于运,动学的方法。

或者他其实也是基于关键帧的方法,就这类方法它是不需要经过物理,它是完全的把我这个动作生成过程中上面这一部分给把它隐含掉,所以说并不是说忽略掉,而是把它隐含掉。

那这个时候下我们其实做的事情就是直接去更新每一个角色,他的状态,比如他的姿势,他的速度,这些是可以直接更新的,那就是其实这里另外一个方面就是说我我这个角色他可以做什么事情,他可以做一个,比如说瞬移。

我可以从a的地方,从a位置,从直接瞬移到b位置,那,这是当然这部分其实这不符合物理规律,但是这个只是基于这个啊运动学的决斗动画,它是可以做到这件事情的,那反过来就是另外一个思路。

就是所谓的基于动力学的决策,或是基于物理的角色动画,这个的速,通常来说我们是希望能够完整的复现我们这个真实的这个物理,就是人产生动作这样的一个物理过程,但实际上这个完全复制这个副线其实也是非常困难的。

所以实际上我们大部情况还是会把它简化一点,但是总体来说我们还是最关键的部分,就是我们其实还是会对物,理仿真来进行对物理这个过程来进行建模,通过物理仿真的方式来生成最终的动呃,最终的动作啊,在这个过程中。

我们是不能直接去干预这个角色动作的,角色这个姿态,所以说像比如瞬移这种事情是基本基本来说是呃,虽然说我们可以实现,但这个并不是这个基于物理仿真的方法的一个目标,所以总的来说,我们刚才刚才说的。

我们其实我们角色动画的方法大致可以分为两类,就是刚才说的一类是基于使用物理仿真的,就是叫做基于物理仿真的角色动画,另外一类是不使用物理,仿真的直接改变角色姿态的方法,那就是基于运动学的方法。

或者说基于关键帧的方法,当然从另外一个角度讲,其实我们控制一个角色的这个动作,或者还有角色的姿态,我们其实也是从两种不同的这种这种维度,这种高度来进行控制,一种方式说,比如说像我们做动画师。

可能是他会每一帧每一个姿态去进行调控,比如说我告诉你,你的肩膀需要转多少度,你的手需要转多少度,那这种是一个非常low level的,非常低维的啊,这样一个控制。

那好那好处就是说我们其实可以通过dv的控制精,确的控制动作的每一个细节,那当然缺点就是因为我需要每个细节都要去控制,所以他就非常非常非常的呃,这个低效也非常的好,非常非常的昂贵。

那另外一方面其实也是我们通常想角色动画想要实现的目标,就是我最好是能够给这个虚拟角色一个非常高级的这样一个呃目标,比如说我跟那个角色说,你去那边拿杯水过来,那它会自动的生成,它可以走过去把水拿起来。

然后拿过来,那这样一个完整的过程,当然这是一个总体来说,你这个控制可以,我们可以用很小的一些这个信息,可以可以生成一个很完整的一段动画,但是相对来说的细节来说就不可能去准确的控制。

那这个其实也是说就是理论上我还是可以完全控制,比如说我可以准确的说你去那边拿水,用右手把水杯拿起来,拿多高,然后怎么怎么回事,就这样,其实理论来说。

其实某种生态我觉得这可能跟信息的这个信息熵还是很相关的,就是你要完成你要对这东西定义的资格进去,你还是要提供足够的信息,但不管怎么说,我们总是其实总。

是从这个low level control一直是逐渐的向clevel control去进行过渡啊,这个是我们这样一个过程,那接下来我们稍微简单介绍一下我们这个角色动画。

每一个方向的一些基本的这个这个技术,那么首先还是从这个基于关键帧的,或者是基于这个角色,至于运动学的方法这个角度来进行这个来简要回顾一下,当然说到基于是基于基于关键帧的技术嘛。

那其实关键帧的动画这个其实是应该最最最基本的这个动画的技术,因为其实际上你们知道他其实动画是出现在读书读文学之前的,因为你想想猫,和老鼠是哪1年的黄鹤老鼠大是二几年,一几年,1917年的。

这么这么一个这么一段时间,等会而计算机图形学出现的时候已经很晚了,所以很长一段时间里,经济动画我们其实都是靠动画师一帧一帧的画出来的,那当然这个过程时间动画师他们也也总结了一些很非常有这个哎呀。

不好意思,他们总结出了一些很多的这个这个经验啊,这个是非常有特点的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

就是这个所谓迪士尼的12啊,动画12准则啊,这个具体内容我就不讲了,大家有兴趣可以自己去了解一下,但总体来说就是说实际上我们虽然说没有经过物理过程,就是刚才我们说的,其实基于运动学的方法。

它是把前面的物理过程给给隐藏掉,但实际上这个过程是由动画师本身来完成的,而它就比如说这里的很多准则,一部分是在去模仿真实的物理的过程,另外一部分当然是有些艺术化的这种夸张。

有些可能是跟叙事啊或者表现手法相关的一些一些内容,那在我们到了这个计算机图形学的年代,到了这个三维计算机图形学的年代,那我们其实可以同样的技术可以应用在三维领域。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

那其实是在二维上来说,我们其实是一帧一帧的去把关键帧画出来,那到了三维的情况下,那我们其实是通过一些软件,比如说玛雅,比如说blender,比houdini,还有很多其他的软件,我们其实是一个关键帧。

一个关键帧去调这个角色的姿态,那当我写好了一个姿态之后,我一重放,那么其实就形成了一个完整的这样的一个角色的,这样一个这样一个动画,那这个过程实际上就是比如做电影呢,其实我们需要很多时候要做这件事。

然后另外一方面就是其实他很难,就是你要能做得好,其实也是比较困难的,就我其实也有一个同学之前也有跟一些动画师也有一些合作啊,就是当时我们要做一个武术的动作,这一段太极拳的武术。

实际上他花了大概两个星期的时间,他们调的非常漂亮,我觉得这个其实是也是一个有点像绘画一样,你是需要一些训练的,需要一些技术才能达到这样的效果,那当然这里面从这个技术的角度讲,从这个算法的角度讲。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

其实有两个非常重要的技术,其中一个是这个所谓的前项运动学,就前面的其实非常简单,所以理解啊,简单理解就是说当我可以给出,比如说角色是有很多关节身上,我给出每个关节的旋转的角度。

我需要去计算每个就是末端点,比如说每个骨骼,每个比如说我手的位置,我知道我从我从腰到胳膊到是到到手,每个关节的旋转之后,需要在手的位置,那需要这样一个计算,就是前向运动学,那反过来其实是叫逆向运动学。

因为实际上我们在调整这个角色的姿态的时候,我们直接去控制角色的这个关节旋转是非常不方便的,大家其实可以啊,可以后面试一下,实际大部分情况下,我们是希望能够直接去,比如说我用手让你需要把手往前伸一段距离。

那我希望我的这个角色能够自动去计算,我需要把我身上每个关节它的旋转角度改变多少,那这个计算过程就是所谓的逆向运动学,这也是非常关这个角色动画,那还有一个技术就是说我们在做制作关键帧动画的时候。

时间我们通常只是出于制作一些关键帧,就比如说像这个一个弯腰走路弯腰这样一个状态,我们通常来讲可能只有几个关键帧,然后在这几个关键词基础之上呢,我们是希望通过算法来自动的生成所谓的补间动画。

那其实一些基本的思路就是所谓的差值,我们有很多不同的插值的方法来帮助我们生成比较光滑,比较完整的这些动画,那不管怎么样,我们这个基于关系链的技术,我们知道它是因为我们需要每一帧每一帧去,控制角色的姿态。

它其实是一个非常low level的一个control的一个方法,另外一个刚才就是刚才我们所说,它可以保证所有的细节,但是会非常非常的非常非常慢,非常非常昂贵,所以时间为了解决这些问题。

我想大家都是非常了解的,就是我们现在做电影的时候,一方面是绿幕抠图。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

另一方面就是动捕,其实大量的使用动作捕捉技术来生成一些,比如说长得不是很像人的这些人,他们的这个这个角色,他们的运动是这样突然传来,同样是通过这样方式,实现,但当动捕来说,我们大家也是通常来讲动捕。

如果说我们想要做非常高质量的动捕,我们还是需要一些非常专用的设备,比如说呃这个这个业内非常这个常用的,像是y看啊,像是这个这个caus啊,这些方法都是比如说身上贴上一些这种标记点,反光的标记点。

然后就通过这种啊多视角相机的捕捉的方式来实现对这个动作的捕捉。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

但它实际上现在在直播领域,大家也看到,可能有些很多相对来说比较更加便携的,更加这个亲民,价格比较亲民的这种各种设备,大部分来说可能是通基,于这种惯性动捕的方法,然后通过这种方式。

我们其实就是我们看到看到一些比如说这种虚拟偶像啊,他在表演的时候,其实背后可能是真的是一个对啊,一个一个不知道什么人在穿着这么一套动捕设备,来进行这个来进行表演,当然还有另外一个,其实不管哪一种设备。

我们总是要提供一些要要花一些钱,要花一些这个这个呃要去购买一个专用的设备,但是现在很多的一些研究的方向,其实是想。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

既然这个我我们其实可以很容易用手机,比如说拍一段我自己的动作,那我是不是可以,从这个手机从这段视频里边把这个动作给估计出来,那这其实是所谓基于视频的动物的方法,那这个单虽然说这种方法使用范围比较广泛。

但是这个现在目前来说,这个质量上还是可能很难跟前面几种方式进行就进行比较,但不管哪一种动物,我们其实会面临同一个问题,就是我们需要把动物的这个动作。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

把它给映射到一个具体的虚拟角色身上,那这个角色可能跟我动捕的这个人,那我可能有完全不同的大小,可能完全不同的这个骨骼的数量,或者说我这骨骼的这种这种拓扑结,构可能是不一样的。

比如说这个这个这个这个这个这个腿可能是反着,反关节是这个呀,不好意思,反关节构造的,那这个时候我们就需要一些新的技术,叫做motion retargeting。

这个我是把一个动作给重定向到一个新的一个虚拟角色之上,那这也是一个角色动画里面的一个非常重要的一个技术,那总体来说因为有动捕的动作捕捉的这个技术的出现,但实际上动捕做的事情是什么呢。

本质上还是说我就只是把动作捕捉下来,然后,把它重放一下,那其实并不能产生一些新的动作,那为了能够产生新,特别是在游戏里边,我们该怎么使用这些数据呢,那其实一个很非常容易想到的一个想法,就是所谓的状态机。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

就是说比如说我我采了一些数据,我一些动作是说我是向前跑的一些动作,另外一个动作是说我要攻击敌人的动作,那我其实可以通过一个状态机,比如说用户按了一个按钮,比如说点一下鼠标。

那我会自动切换到一个攻击敌人的这样一个动作上,然后打打完之后,那我再回到正常的走路这样一个一个状态,里面去,这其实我看到大部分这个我们看到其他的这个所有的这种物理引擎,不是物理器,不好意思啊。

游戏引擎其实多多少少都会支持不同种类的装载机的这样一个模型,那当然状态机的这种方法,这个技术其实从学术上来说,我们可以其实可以找到这个02年。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

就是叫motion graph的这样一个一个论文,其实回想一下motion graph那年其实有大概同一年,有三篇论文是大概提出了一个非提出了就是非常类似的同一个方法。

那为什么motion graph大家总是总是拿来提呢,因为他这个名字非常短,所以其实,也是告诉我们这个大家写论文的时候,这个起个名字还是非常非常重要的,那当然莫属古拉,好好多金的一些一些这个技术的细节。

比如说我们怎么给一段任意的动作,我们可以从里边去找呃,能够去构建这个状态机的这个切换的位置的这样一些技术,那这是呃motion graph的这个的一些工作,那当然后面其实很长一段时间。

我们都是在陌生graph的基础上进行进一步的改进。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

比如说我们可以在把很多动作就一个一个节点,一个状态节点,节点可能里边有很多动作,我,们在这些动作之中进行插值,来完成更加精确的一些控制,那这是其实也是一些对陌生国家的改进。

那另外就是说其实motion graph它提供了一个运动的这样一个。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

就是会这个底个底层的运动模型,他可以在这之上我们可以完成一些更加高级的这个控制,比如说我可以训练一个ai,他去使用陌生graph,它在这个graph在这个运动图里边去选择合适的编去进行进行执行。

那它就可以完成,比如说跟人对战,或者说比如说一个一个群体的这样一个仿真这样的一个效果,但总体来说motion graph带来的是什么,呢它带来了一种能够重用已有的运动数据来生成新的运动。

运动的这个就可以在交互的情况下生出新的运动,去完成一些这个下游任务的这样一个技术,当然缺点是什么呢,就是其实陌生古up构造是非常复杂的,特别是状态机就是给我们动作很多的情况下,其实大家可以想一想。

比如说我要我要走。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我大概我一个人可能他会学会,比如我从站立到走,然后到跑,然后再站立,那这里大概会有多少个多少种不同运动,其实最基本的我需要站立是一个动作,从站立到走到启动是一个动作,再走这个走的这个循环是一个动作。

然后从走到跑是一个动作,然后从跑再到站立也是另外一个动作,所以说其实这个复随着我动作增多,会变得这个这个这个动作图会变得更加非常非常复杂,甚至非常非常复杂,其实我都觉得可能有些游戏。

特别是像比如说nba篮球游戏,我觉得这游戏可能它最终它的动作会成动作的图的呈现,可能是非常非常复杂的,而且非常容易出bug,所以后来其实有很多这个有一些新的思想,如果怎么去改进这件事情。

因为动作图本质上还是去在每一个动作,片段这个动作片的本质是一个完整的动作,来对这些完整的动作之间进行切换,那其实一个想法就是说那我是不是可以把这个动作再切片一点。

比如我真的是欺骗到这个每一帧去进行控制的情况,那这个其实技术就是一个就就motion matching,motion matching,时间是啊,应该是玉璧在2016年左右提出的一个技术。

这个就我当时还是跟他们这个人,跟他们组的这些人聊过,那这个技术实际上最早是应用在那个for honor里面,就是啊我不知道中文这个名字叫什么,凡事也是b的一个游戏,然后就是产量比,较比较不错的效果。

但它的基本技术基本思想就是说我我不是去完整的播放一段动作,而是说我可能在更加细腻的,这比如说每一帧结束的时候,我通过一个呃,最近您搜索就找到一个新的姿态。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

然后这个姿态同时满足我要控制的目标,比如说我要不行了,我方向去移动,另外同时也要满足,比如说跟我当前的角色不能状态不能差太远,然后保持这个动作是一个连续性,所以这个工作其实很长。

很大程度上是一个工程上的一个实现,就是说我怎么去设计这样的一个具体函数,怎么去设,计我的这个啊动作的这个库来达到最好的效果,但是但是好处是说这个方法非常简单,而且其实也非常实用。

其实我们也看到近年在很多一些这个游戏引擎上,其实也提供了啊,比如什么是matching类似的这样的一个技术的知识,我觉得其实现在游戏用的也就也开始越来越多了,当然这个其实当时也是他们有一个有一个。

观察吧,就是说虽然这个技术看起来是非常非常好的,非常非常fancy的,但是把这个技术应用到游戏里面,其实阻力是非常大的,为什么,比如说状态机模型这样的这样的papi。

那如果说我们给他一个新的这样一个技术,他们很难去,就是你需要花一点精力,才能把这样的一个新的技术给集成了,那个那个原来的这个这个这个管线里边,这个引擎里面。

所以这个其实也是我们每一个新技术要通过一段时间才能才能进步的,这样一个你这个一个问题,ok那其实motion martin其实也是一定程度上解决了motion graph的这个难点啊。

所以说他在而另外一方面它也可以提供更同样的跟motion graph一样,我们也是允许我们用一些更高level的,更高级的这种运动信号来控制角色的生成,那当然实际上随着就是其实其实我们也提到了。

我们大部分我们其实角色动画的目标是说,我们希望能够对角色本身的它内在的一些规律进行进行理解,进行建模,这样的一个统计规律,其实有很多这种所谓的生车模型,其实也是给计算机学动画带来了非常大的一个进步。

那所谓生成模型是什么呢,就是说我们可以把比如说有很多很多动作,我们把很多很多动作里,那这个网络它可以通过根据用户的这种不同的输入信号,来自动的计算下一帧的这个角色的姿态。

那这个其实有非常有代表性的一类一系列的工作。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

其实是这个就是taco camera,就是他们以前在爱丁堡大学,英国爱丁堡大学,他们是做了一些相对很多的工作,就是说我可以从数据里面去学一些,比如说控制方向这样一个指令,跟我真正做的动作。

他们之间的这个这个关系,当我学好了之后呢,我们其实可以拿到一个新的指令,比如说用用户用摇杆遥感啊,输入一些新的指令,它会输出新的这些动作,但另外一些技术就是我们去真的去学一些生成模型,你知道生成模型。

比如说像是大家常见的像gan,还有像现在非常有名的像是daily to,可能大家有一些东西可能可能了解过,就比如说我可能输入一段文字,我可以自动生成一个一个非常漂亮的图片。

那这个方法时间也可以应用在动作里边,比如说一些早期点的早期一些的工作,比如说我可以训练一个啊v e变分自编码器模型,那后面有一些新的工作,比如比如说用干,比如说用这个呃标标准化流。

但是最新的有些工作也比这2年这个扩散模型很很有效嘛,所以其实有新的新的工作来尝试使用扩散模型来生成动作,但总的来说这种生成模型的技术考试在哪里呢,就是说我们其实不需要去。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们通常来讲对于生成龙的心,我只需要比如说我随便让一个人在场地里去走来走去,大概踩两个一两个小时的动作,然后丢给模型,它是怎么生成的,而以前的技术,比如说魔术graph,他是不能做这件事情。

我必须手工具做这样一个切分,做这样的一个状态机才能实现这件事情,而motion matching时间也是同样的问题,就是说如果动作库很大的情况下,它其实效果也是会变差的。

这是这是这种比较传统的方法的一些局限性,那当然现在还有一些新的一些,因为大家发现啊,我们只是生成动作这件事情本身,这个因为我们最终目标还是希望能够通过一些高阶的这种语,言的这种类似。

比比如说可以通过语言来控制角色的这个动作,随之前现在很多新的新的这些研究方向,都是说我们是不是可以实现这种跨模态的生成,比如说从一段音乐来生成一段这个舞蹈,这是一种非常典型的com它的动作。

然后还有一种比如说我们在数字人里面也经常用到的,就是说我给角色一段,比如说我说一段话,那我其实我希望我的虚拟角色能够做出相应的动作,那这个其实我们今天有一些有一些工作,就是这个我今天发的信息。

i am here with students at wait field high school in arlington virginia。

and we’ve got students tuning in from all across america,from kindergarten through twelfth grade。

and i am just so glad that all could join us today。

and i want to thank wakefield for being such an outstanding host,give yourself a big fat tac。

他们说的前一段演讲来自动生成的,狂魔太深了不,那另外一方面,其实我们有一些新的看到一些新的今年一些新的进展,有点像我们生成这个图片一样,其实我们可以给他一句话,它自动生成跟这句话相对的这样的一个动作。

就比如说这个这个非常典型的一个工作,就是这个motion clip,就是今年年初的时候一个工作,当然今天我也,但是其实这2年我看也看到一些公众号的推送,其实也有一些新的工作,可以动作效果更好一些。

但基本思路其实是一样的,就是说因为我们刚才提到了,我们觉觉,动画我们是学到了动作的一个这样一个统计的一个模型的表示,那我们知道语言其实有类似的问题,就是我们其实语言的这个我们怎么说话。

其实它也是一个统计的模型,我们通过把这个统计模型之间建立一个关系,那我们可以实现这种跨模态的语言的生成,所以实际上对于这个矿工太原来说,实际上我们已经非常接近我们原始的目标。

就是我们希望可以通过一些高high level的这样一个控制,来实现了一些非常复杂的动作,那接下来其实我们还有可能有更多的一些技术,比如说我,们是不是可以给一段剧本,让这个角色自动完成表演。

其实我觉得这个其实是反而会就是跟我们前面提到的角色动画啊,动画电影这个其实是更加相近的一个方向,但是前面说了这么多啊,但是实际上我们说的这个角色啊,基于运动学的方法。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

其实还是有相当大的局限性,其中一个非常重要的局限就是说因为他还是把物理过程给隐藏掉,那其实他就说很多时候我们深空动作是很难去完整的,完全的满足我们的物理的准确性,比如说我们常见的像穿模。

还有比如说这种这种脚上打,滑也就是说非常非常常见的基于运动学方法会出现的问题,那另外一个问题就是说其实运动鞋的方法本质上来说。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们还是一些还是一些这个对现有动作的一个一个重放,或者是一个组合,嗯,但是如果说我们就比如我们环境里有一些新的变化,我们需要跟环境互动,可能产生一些新的状态,比如说像这个人被摔倒了。

或者像这个人他去踢一个狗,但他反而自己掉下去了,这种情况下,我们动作库里边是很难去踩到这样的动作,比如说有些动作可能过于危险了,比如说像成龙的很多,特技动作,比如从这个高楼上跳下来。

那这种动作其实我们是很难采集的,我们其实没有,如果没有采集到的话,我们靠基于运动学的方法是很难去生成这样的动作,而为了解决这些问题呢,实际上我们还是要回到基物理仿真的方法来完成一个啊。

就是更加物理准确的,更加可交互的这样的一个角色,动画的生成,就是刚才我们所提到的,其实我们做所说物理仿真的方法,实际上我们是希望能够完整的把我们真正的这个人再怎么生成,物理的啊。

人再怎么做出动作这样一个完整的过程,能够给在虚拟世界里给凸显出来,当然其实回想一下,我们前面说这个基于运动学的方法,我们是说给一些输出信号,给一些当前角色的这个姿态。

然后我们运动的模型会计算出下一个角色的这个姿态,从而完成这样一个动画,那基于物理方法实际上是稍微多了一步,就说我这个运动模型本身输出的结果并不直接是角色的呃,角色的姿态,而是一些控制控制量,比如说利。

然后这些利益和力矩通过物理仿真才能真正的去改变角色的姿态,实际及物理的方法其实已经其实我们在过去,的这个比如说游戏啊,电影里边可能还是其实已经有一些应用了。

其实最基本的一个应用就说我们可以把控制这件事情给暂时忽略掉,我们就只是考虑这个动作本身这个状态在物理规律下的一个动作,那这个结果就是一个所谓的redm remastation,在哪里。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

常用的就是我们其实很多游戏都会用到的,比如说这个人,他这个这个这个死掉了,那他其实就是身体,就其实他就失去了对身体的控制,而实际上rag doll动作的仿真其实也不局限于这个死掉啊。

或者是失去意识这样的角色。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

实际上我们正常人,比如说人遇到突发事件的时候,比如说你被石头被一个这个门槛绊了一下。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

其实因为人的反应神经是有一个时间的,比如0。2秒左右,在这段时间里,其实你的动作本质上也是一个rap down,所以说就是这个其实rap仿真在一些场景下还是很还是很很现实的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

但是这个问题是什么呢,就是因为我们把控制给完全给关掉了,所以实际上他能做的事情也就只是说生成一些无意识的,或者短时间这个身体无法控制的情况下。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们给我们生成的,动作,而为了实现更有意义的动作。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

然后呢能让我们产生这样的动作,那比如其实这也因其实这个方面也是有一些。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这个我们虽然不是很多吧,但是我们也看到一些这个有意义的尝试,一些非常有意思的游戏,比如说克莱姆斯宁讲,当然其实在前几年,有几年有一段时间还是挺火的,然后他解释主要是一个特点。

就是说这个角色其实有相当一部分动作是基于物理仿真生成的,所以他其实每次你跟他去做交互的时候,这个反应都不完全一样的,然后,这其实国内一家游戏公司做的,好像在steam上排的排名还挺高的。

还有一个特点就是它是其实这个不完全是物理准确,但是至少是物理这个faysical plasible,就是这个物理可行的,就是他是说我其实我可以这个角色之间的互动,并不是预先给定的一些状态记忆。

而是说我真正是根据我当前的这个角色互动啊,这个碰撞啊,产生完全不同的这种这种这种角色,那当然我们自己也我之前在那个我们之前也做过一些实验,就是说我们可以比如在一个a r环境下,其实。

我觉得这种物理仿真的动画,其实对于vr或者a r的这种场景是非常非常合适的,为什么呢,因为像比如说我要是做一个基于手柄的一个格斗游戏,那我其实每一个命理论的时候,我都是可以预先设置的,但是vr环境不同。

比如说我戴一个头盔,我前面一个人,那我比如说我跟他做一个拳击,做一个打击打的这样一个游戏,那我用什么方式,用户用什么方式去击打这个角色,其实这个我们是完全无法控制的。

因为因为我可以从任何方向去打这个角色,那这种情况下时间我们只有通过物,理仿真才能真的是生成完全还原的这个物理物理的动作,当然物理仿真还有一些其他的一些用处,比如说vr的一个社交。

我们知道去年其实也是今年,比如说mata,比如说facebook,他们也出过一些vr社交的一些应用,比如说这个我可以戴上头盔,我可以看到我的一个个人形象出现在虚拟世界里。

但是当时我就觉得当时我看到这个video就觉得特别搞笑,为什么呢,因为它只有上半身,没有下半身,这个其实也是一个非常典型的一个应用,就是说因为vr头盔来说,我们有一个头盔,还有两个手柄,那其。

实我有三个点在这三个,来算出上半身的姿态,但是下半身比如往前移动,我的脚不该怎么移动,这件事情是非常难去从只有这三个信息来来实现,但是如果说我们有了物理仿真,那这件事情就变得可行了。

因为最基本来说我因为我们前面提到物理物理过程,我们在物理仿真里面一个角色他是不能瞬移的,我们只能是从一个地方,为了能从比如说我这个角不我我戴着头盔之后,我这三个点的头盔向前移动。

那我的吸引角色也需要向前移动,然后为了能够实现这个情况,他必须要生成用满足物理规律的这样一个脚步,才能带来这个向前的移动,所以这也从另外一个方向,就是我其实通过这种方式估计出了我的角色该怎么动。

这是一个非常有意思的一个应用,那当然我们其实也可以进一步的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

让这个动作看起来更加真实一点,那另外一个方向就是说,其实物理仿真会可以帮助我们抓住一些非常非常这个细节的,一些一些操作,比如说筷子我们正常做做这个运动学的方法,那可能我这个筷子它怎么动。

就是我可能就直接把这个物体粘在快餐就可以了,但实际上我们知道人家用快的时候,它有一些细节的这个小的一些动作,比如说手指要有一些动作才能把这个筷子给动起来,那我们通过物理仿真的过程。

为了能够实现这样一个这样一个这个这个这个操作,那我们其实必须要产生这样的细节,所以这个也是物理仿真能带来的一些一些这个啊一些情况,那我们接下来其实还提到了。

我前面都是我们在物理仿真的一些物理及物理仿真的举动,画的一些应用啊,其实类我们接下来可能我们会介绍一些关于物理仿真,觉得动画的一些基本技术,当然了,最基本的一个问题就是说我们该如何。

我们该怎么建模我们的角色,其实我们最理想的状态是说我们完整的把一个人建出来,我们建立完整的这样一个神经系统,完整他的肌肉系统,但这个通常是非常困难的,一方面来说这个这个原始的作用机理。

我们其实这个学术上也没有完全搞得很清楚,另外一方面这么建模,比如说肌肉大概有几百条肌肉,上千个自由度,那这种情况下这个仿真的效率也是非常低的,所以实际上大部分呢我们做物理角色动画的时候。

我们还是会把这个角色进行简化掉,我们并不是直接用这样一个肌肉骨骼系统来进行操作,而是通过比如说比如说这个关节力矩来来去驱动这样一个角色做动作,那当然为什么可以用关键词例举呢,其实想一想。

因为人的肌肉本质上来说,我们是肌肉是通过这个基建会连接到骨骼之上,然后其实每一个肌肉都会给我的骨骼,在运动的时候都会给我的对我的骨骼产生一个力,那大家从物理这个大学物理啊,或者高中物理。

其实也知道每一个例都会给我的等价的,在我的这个关节上产生一个力矩,所以实际上我们完全可以通过关节力矩来仿真我们真正的骨骼,肌肉这个过程,但在实际的这样的这个物理仿真里边,就是基于物理学的动画里边。

我们通常是就是有一类方法是非常常用的,就是所谓的pd控制,就比如说我想把我的手从这个高度举到这个高度,那我需要给我的关节上加多少力呢,那我首先知道我这个这个关这个高度是我想要达到的位置。

而这个高度是我现在的位置,那这两个高度就差乘以一个系数,其实就是我需要加的力的这样一个大小,那当这是一个非常粗略的计算,但实际上还是非常有效的,通过这样的计算,好处是什么呢,就是说比如说我想做一个动作。

我其实可以给出一个目标高度的这样一个轨迹,然后采用pd控制,那我就可以生成一个啊对每个关节的这样一个例句,然后他大概能让我产生我想要做的这样一个动作,那他这个其实也是很早,也就是计算机学的。

就是基于物理的动画里边,其实很长一段时间大家使用的这类的方法,其实可以找到这种。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

但这个工作其实就非常早了,这大概是1995年的,我们一般比如说我们做角色动画的paper的时候,大家还是会把这个论文引一下。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

因为这差不多是最早的时刻,其实在可以看到1995年的时候,我们用物理仿真的方法就能做到这样的动作啊,这个这个其实是那个just blog做的功能。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

而是全是为了给亚特兰大奥运会做了一份这个这个应景的中间。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

但是实际上这个技术虽然在那个时候做做到这个程度,但是后面从95年到二零。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

现在到20225年,差不多30年。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们其实还是没有在真的这种游戏里面见到这个事实。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

其实最大的原因是什么,那原因其实控制是非常非常难的,大家可以有,其实这也是一个就是非常有意思的一个游戏,大家有兴趣可以去玩一玩,就是那个叫q w o p这个网站,广告有点多,但是是一个flash小游戏。

这游戏还是挺还是挺有名的,就是你可以通过q w o p这四个键去改变,增加在每个腿上,它主要就是下面下肢每个腿上的失利,然后目标是你希望这个角色能够能够跑1百米。

但实际上当然这个video这个视频其实是一个玩的非常好的人了,如果说你是第一次玩这个游戏的话,那其实你这个角色可能往前一步都走不了,因为这个实际就比我非常简单的一个问题,比如说我要问你,你是怎么走路的。

你其实很难去通过语言进行描述,但这个技术其实你是很难很难去用用这个公式啊,或者去通过一个教学的方法,教另外一个人学会这个动作,当然实际上很之前有一个公司叫叫natural motion。

他们其实就是就觉得这个角色动画基于物理仿真动画,是一个非常好的方向,所以说他们其实在这方面投入了很多的一个努力,因为前面提到了,为了能够实现这样一个为了设计这样一个目标轨迹,我们需要在为了实现一个动作。

我们需要需要去设计这样一个目标轨迹,但是这个木甲鬼应该怎么实现呢,其实他们还是借鉴了一些玛雅,这是这些动画软软件的这个技术,就是我们专门做一个软件,这个软件目标就是设计这样一个控制轨迹。

然后我再用pd控制或者其他类似的控制方式加呃,来计算这个世界带去色散的力,然后用这个力来驱动角色进行运动,那这个人其实做的还是比较看着还是比较不错的,而且这个功能也是比较完整的,但是问题在于哪呢。

在于这个他跟玛雅之类的这种基于关键帧的方法不同点不同,基于观战的方法,比如说我把一个角色设置成某个姿势,那他就是某个姿势,但是基于物理仿真的方法,按照我们刚才其实介绍了。

我们其实是没办法直接去设置这个姿势,我们只能说设了一个姿势之后,我希望他计算的力差好,能差不多能够完成这样的姿势,但实际上这个过程是非常就是这两个并不是完全相同的。

所以说实际上比如动画师做了一段后空翻的动作,他跑一边仿真,发现这个角色做的完全不是后空翻,或者一下就翻,一下就摔倒了,那这个时候你就需要不断的调整,不断的调整。

这个调整的过程是比我们关键帧做动画的时候要要要难很多的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这样一个过程,所以说这个软件,所以说这个虽然说这个natural motion算是这个领域的先驱啊,但是怎么说呢,这个方法这个这个软件其实还是很很少,能够在我们真实的这个场景里能够见到。

但nh motion后来也是也是有一个比较好的一个结结局了,因为他做了一个非常有名的这个游戏,就是我们刚才前面提到的那个肯莱姆森金甲,然后他后来被一个游戏公司收购了,但是也算是这个。

因为克莱斯i大家也看到他其实基于物理仿真的角色动画,所以这也算是他们的老本行,但问怎么说,我们前面提到这种方法就是最基本的一个实现运动控制的方法。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

就是所谓的control控制的一个关键帧技术,那这个比较加引号了,但实际上它并不完全是像角色动画啊,像那个基于关键帧或者基于运动的方法那样,这个这个我们是真的可以控制关键帧的,然后因为这个控制关键帧。

或者是去控制一个角色生成某种动作的这种方法,这样的难度呢,那实际上我们其实后来有很多新的方法。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

比如说我们可以通过优化的方式让这个角色我们去像我手工设置。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

不会这个很难,那么就通过优化,让计算机通过运算的方式来算出比较合适的关这个这个控制的轨迹,那当然这个过程其实我们可以加一些其他的变量,比如说我可以把这个动作去映射到一个新的虚拟角色身上。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

实现这样一个重叠线,因为我们在这,因为整个过程是物理仿真的,所以我们可以保证这个重叠线过程是一个生成动作,还是一个物理准确的,那么他也可以做一些其他的扩展,比如说放在一个不同的环境下,比如放在月亮上。

那他这个在不同重力环境下,他的动作会有相应的变化,那当然这种关键是这个,有基于优化的技术,其实也是允许我们做一些a simple input,this optimization for moniz。

做一些其他的一些这个更高级的这种输入,比如说像这是一个09年的工作,他们当时就是说我其实可以告诉我这个角色,你再比如说你的这个脚的落点是什么样子,那我可以动画的,基于仿真的,也算是基于这个优化的方法。

我们可以自动生成一个合理的动作,它能够满足我对落点脚的这个脚步,落点这样一个这样一个啊输入,其实生成动作还是看起来比较比较不错的,但这类方法其实有一个非常大的问题,就是说实。

际上我们需要解决一个非常高维的,然后他的这个这个这个函数本身就是非常非常非线性的,这样一个优化问题,所以说这个优化是非常难解的,而且非常非常的慢,所以实际上我们能用的范围也是比较比较新。

但总体来说基于呃这个轨迹优化的方法,或者基于时空优化的方法,也是给我们一些新的思路,允许我们提供一些更高维的,更高级的这样的一个输入控制,而不是说我去真的去去调整每一个角色,每一个状态,他应该去怎么动。

他都这样,虽然但是它也本身也是有相当的局限,性的让我们实际上用起来很难去把它给放,换到一些比较比较比较复杂的动作,比较困难的一些场景,那后面其实我们接下来就是说其实我们大家可能有了解到。

比如说这个机器人领域,我知道这个有一个大家可能现在都了解的,比如说boston dynamics,这个不是那动力的这个机器人机器狗,然后其实在在之前,比如说大家可能也知道,也许了解那个宏达。

宏达就是那个本田的阿西莫机器人,就是这一类机器人技术,它其实就是比如说issm是一个非常典型的一个,这个就是用就是它的使用的技术,就是说它是使用一个非常的一个简化的,因为我知道人是非常复杂。

我们身上有很多这个关节,很多很多这个骨骼很多关节,然后我们可以通过一个简化模型来把我们想要做的动作给描述出来,然后利用这个简化模型来指导我们这个角色该怎么控制,那其实是借鉴于这样的思路的话。

使用节奏动画,这边我们其实当时也是有一些呃工作,就是尝试用简化模型来实现非常稳定的,非常这种多种技能能都通用的这样的一个控制策略,但是你看,看是现在f s f u那做了这样一个工作。

其实这个这个角色非常稳定,就是跑起来可以,我们可以甚至可以给他一些这种外力的外地的这种干扰,他依然可以能够走得非常非常稳定,并且能够产生香的这个动作,但是期待是什么呢。

就是这个思路其实是因为它是来自于机器人嘛,所以说他的这个控制是非常非常这个怎么说呢,非常简化了,非常这个是缺少细节,那其实带来很大的问题,就是说他就走路像机器人一样,所以这也是一个问题。

然后后面其实有一些新的一些改进,比如说我,可以用一些非线性的模型。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

比如说刀a版模型来实现一些非常啊鲁棒的,或者可以可以分化的这样一些动作,但是不管哪一种,其实我们常见的这种所谓的简化模型,因为我们很多时候,比如像机器人领域,它是对走路这件事情研究非常久的时间。

所以很多减化模型都是只针对于走路来进行控制的,然后另外一方面就是走路也是一个有一个非常大的特点,就是走路的速度比较慢,在速度比较慢的时候,我们可以很容易地把一些这个问题给线性化。

其实也是让我们的问题变得更加容,易解决,然后当我们如果说更发达运动,比如说我想做一个后空翻,那这种模型就非常难以实现了,当然也是有做的,比如说我们这前2年也还看到一个工作,它是能够实现口供番的。

但是这个整个的这个设计是非常非常复杂的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

就所以说也是非常难的一件事情。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

但是不管怎么样,我们的简化模型的方法给我们提供了一条思路,就是说我可以通过简化模型来实现对一些对一些动作的这个控制,而且这个我们不需要,而且这个过程还是比较鲁棒的,我们可以去控制,比如说允许我去通过。

一些比如说外力啊,然后来产生来跟对这个角色进行进行相应的交互,但总的来说缺点就是很明显,我们只能控制非常只能基本上只能做走路,而做复杂动作基本是做不了,而这个现象这个过程其实也持续了很多年了。

就是说他做的事情有点像,就是我可以我一个角色,我一个这个一个agent,比如说个机器人,它可以不断的跟环境进行交互,比如说我迈左腿,我发现我摔倒,了,那我摔倒了之后呢,环境会告诉我。

你这个地方你迈左腿这件事是不对的,那我下次再卖左腿的时候,我就要考虑考虑,可能就不要卖左腿或者卖左腿的时候要少卖一点或者多卖一点,然后才能保证我不摔倒,他就会通过这种不断的跟环境进行交互。

来更新自己的运动策略的这种方式,来最终学到一个一个一个一个一个动作,或者会学到一种控制的方式,当然这个方向其实火起来是大概哪1年,大概是在这个2015年左右。

当时这个deep mind那会儿还没有被google收购,但是他们出了一,个在nature上发了一个发了一个工作,就是叫human level control,就是他们在一个雅达利的这样一个游戏机。

实现了超过人玩这个游戏时候的那个那个那个这样一个得分,所以这个其实是非常有非常有鼓舞的一件事情,就是其实也是告诉我们,都是一些在一些比较简单的这个toy model,身材是word。

但是后面其实就有很多这个方法来尝试,不断去更改他自己的这样的一个运动策略,比如说我们可以做这种跳舞动作,我们可以做打篮球,还有这个我们可以做更更复杂,其实理论来说,我们任何一段差不多任何一段动作。

只要是我给他一个参考的运动数据,他就可以学到这段动作,其实这个大家非常有名的demimic,那当然就在这样一个基础之上,因为,我们最终学到的还是一个所谓的tracking。

所以一个跟踪控制就是它目标是说我要实现一个在物理仿真的环境下,实现对某一个运动数据的一个完全的复现,那类似于我们其实可以认为这个输出结果就是一段护理的运动数据,那在这基础上,我们其实可以进一步的。

比如说把motion graph给引入进来,使用状态机,用状态机的方式把编码很多,把很多不同的这个运动,它的这个物理控制可以放在同一个,这个用这个状态机协调完成一些更加复杂的动,作啊。

或者说我们其实也可以类似于比如说像类似于motion matching,我们可以把这个控制本身拆成更细的一些一些片段,0。1秒,乃至这个在这个片段之间进行这个切换,那么其实也可以反正一些比较复杂的动作。

比如说像滑板,那比如说碰到这个障碍物之后,它可以去自动地调整自己的平衡,来实现这个更加这个物理准确的这样的滑板的动作,其实给我们角色动画就是基,于物理动画带来很多新的这种啊很好的一个工具。

像是这种啊层级化的这个控制策略,让我们角色能够完成在我们比如说一些高级的指令之下,完成一些更完就是综合的使用这些动作来完成完成某些功能,那接下来其实还是在使用。

随着我们现在可以很容易地被每一个动作去进行控制,在这样一个基础之上呢,其实我们可以回想一下,我们在基于呃运动学或者基于关键帧的方,法那个领域里边,我们其实提出了一个特一个一类方法。

就是所谓的这个运动生成,基于生成模型的方法,去找到它里面内部规内部的规律,然后这样的话我们可以在新的命令之下来生成新的动作,但是在物理仿真的情况下,其实我们可以做同样的事情。

就基本来说我们可以把这个东西叫做什么呢,我们把这东西叫做运动运动啊,控制生成模型,但是跟运动生成模型的不同点在于什么呢,因为控制我们是不能直接去改变,角色的姿态,所以说实际上控制生成模型。

该我去猜测我在这个角色在在做这样大量数据的时候,它有一个什么样的规律,他怎么去控制我的身体,他怎么去输出一个力或者例句来让这个角色能够动起来,那只是运动生成模型,但是这个我们今天今天也是做过一些工作啊。

比如说这个我们可以很容易地学到这个生成模型。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在这个生成模型自己的这个状态空间里边,我们可以做随机的采样,那这个每一个采样都会生成一个不同的这样,一个动作,而同时利用生成模型的这样一个基础,我们也可以很容易地实现更高阶的这样一个控制。

比如说我可以控制它的方向,可以控制角色的这个运动的这个类型,然后同时实际上因为整个整个这个过程是物理仿真的,我们也可以很容易的,比如我对对这个角色,比如扔一个球过去。

或者我在地上放一些这种不同的这个物体,它其实会很明显的影响这个角色的动作,而且角色可以生成准确的合理的这样的反馈,就是这样的,也是有机物理仿真的方法的一个特点,那当然接下来我。

们这基于生成模型其实已经是逐渐的把我们这个整个的角色动画。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

其实物理角动画推向了我们的目标,就是我们目标,还是说我们希望能够通过一个高阶的控制来实现对动作的生成,那接下来我们会做什么事情,其实这里还有其实很多很多,比如说我们从这个基于运动学的方法那边。

我也看了一些一些工作,比如说我刚才说到的,我可以说一段话,通过这段话我来生成合适的这个动作,那当然基于运动学的方法,按照我们其实刚才我们也提到,他很容易生,他很难去完全的去满足一,些物理的约束。

而反过来基于运动学的方法,基于基于物理仿真的方法,其实可以很容易实现这件事情,随着时间,现在我们也可以期待,可能很快就会有一些工作,他能够把语言或者是其他的模态,比如说音乐。

把这些的方法应用到我们这个控制的生产领域,来完成这样的一个运动生成的一个过程,ok那我觉得其实前面我们这整个前面这一个小时,我们主要是大概回顾了一下计算机角色动画这个领域,我们在过去30年。

我们在这个领域的一些主要的研究方向,但是很多时候很多方,向其实我们已经看到了在啊,特别是比如基于运动学的方法的一些新的这些技术,其实我们已经逐渐的发看到他们在真实的这个场景里面落地使用,然后基于物理学。

物理学啊,基于物理动画的方法,其实我们从30年前都一直在说,ok我们物理基于物理动画是有潜力能够替代角色动画的啊,就替代这个基于关键帧的方法的,当然这个是我们说了30年,永远都是有潜力,但是不管怎么。

特别是现在我们最近的一些看到的,一些工作,比如说啊基于生成模型的运动控制,这些工作出现之后,我现在我们现在其实有一个想法,就是说可能现在真的是到了一个这样一个点,我们这个基于物理的方法。

或者我们真正的把一个真正在虚拟世界里还原真实世界,动作产生过程,这样一个方法真的能够把它变成现实,变成真正可用的一个状态,这是我们所说也是角色梦幻,我们现在觉得非常好玩的一个地方。

ok那关于前面的一个介绍,就是大概就讲了这些,那最后还是一点关于我们这个课程的一些一些内容,首先呢,我们其实可能之前也这个我看到微信群啊,有人问我们是会不会讲这个。

比如说这个unreal engine怎么用啊,但我觉得很遗憾的是,就是我们涉及的内容,主要还并不是说我们怎么去用一个具体的软件,比如说怎么用麻呀,怎么去motion,motion builder。

怎么去用用unity啊,怎么去unreal啊,这个其实并不是我们这门课主要的目的,那另外一方面,我们也不是说去教大家怎么去做一个动画师,因为我们主要还是从这个计算机角色动画的一,个学科的这个作为科学。

作为一个技术点方向来进行这个探讨,所以我们主要还是会关注于每一个计算机工具,它后面的方法,它后面的理论,它后面有什么技术,特别是比如说角色的动力学,角色的啊,运动学特这个过程,角色动力学过程。

然后怎么去做物理仿真,怎么在物理仿真下实现对应用的控制等等等等,但最终目标是什么呢,是说大家学完这个专门课之后,能够自己实现一个可交互的虚拟角色,那可能是,一个一个一个游戏里的一个角色。

那我希望这个这门课能够给带来给大家带来足够的知识,能够完成这件事情,那最后再回顾一下,其实我们刚才也提到了,这是我们这个课程的一些基本的安排,然后和这个交流和交作业的这个这个啊网站啊。

总体来说我们是12次课,那今天是第一次课已经完成了,从后面的话我们是从这个基本的数学开始,然后先讲先主要是介绍基于运动学的方法,基于关键帧的方法,然后中间我们也会涉及到一部分。

就是这个因为是跟前面那些相关的,就是蒙皮,就是角色的蒙皮绑定的一些基础基本知识,然后后面就这门课的后面一半,主要是一个关于物理仿真和基于物理的角色动画的一些知识。

总体来说这个啊内容还是比较比较比较丰富的啊,当然这个这个大纲我们也是这个可能后面随着我们的这个课程进展,随着大家的反馈,我们也可能会稍微调整,那总的来说呢,当然具体的信息的话,我们会在那个当。

那我们大概大体上来说,我们会这个课程会有五个小的project,其中有四个是跟是关于这个角色,就是这个关节角色动画的,就是大概是两周到三周这样一个一个一个项目。

然后还有一个是关于我们这个模型绑定的一个小的一个小的一个project,所以这个我们后面会有进一步的这个说明,那总的来说我们这个刚才就像刚才我们说的。

实际上我们所有的这个项目其实主要还是用python来实现,因为后面会是大物理仿真,所以我们会有一些呃,比如说python下面一些物理简单常用的物理引擎去怎么去使用。

然后在这个物理琴物理引擎上实现我们的一些仿真和一些控制,和一些动画的效果,那总的来说我们这门课还是一个105嘛,我们还是个幺的课程,而且是105已经是第五games的第五个这个基础课程。

实际上我们前面有很多,前面已经有四个非常非常好的一个基础课程,但总的来说呢,我其实对这门课的一个想法,而是一个所谓的这个self content,就说我是课程内容还是能够自呃自洽的自融的。

但是也是大家如果有时间有兴趣,当然也是非常建议大家去学前面几门的课程,首先计算机同学入门,因为这个语音系老师他可能是做渲染方向,所以这门课渲染的内容讲的比较多,而这门课比如105这门课。

实验室里边只涉及一点点的这个集资动画的一个晚常大的一个扩展,然后几何与建模处理相对来说给我们稍微远一点,但是呢我们后面会讲到关于差值的部分,其实是跟几何几何建模很相关的,蒙皮绑定。

其实里面有些技术也是来自于几何建模也处理的这这部分内容,然后我们后面其实很长一部分是在讲仿真,当然这个跟前面103的仿真有一点点不同,是103其实很大一个厂部分是在讲,首先它可能讲钢铁的时候。

直接讲单缸体,其次呢就是说它可能很差异很大幅篇幅在关于这个流体和软体的方针,那对于我们来说,实际上我们讲仿真,我们是专注于多缸体仿真,因为人嘛一个角色,我肯定是一个多缸体脚接在一起来实现一个仿真。

所以说这个是我们在跟他们稍微有点不一样的地方,但是总体来说仿真的一个基础是103这门课会提供给大家,另外其实我我其实之前也看了看,104讲游戏引擎其实很很大一个篇幅,就是关于里面的动画。

因为我们知道角色动画其实是所有游戏引擎里非常重要的一部分,所以实际上我们这门课很多很多的这个就是164,其实给我给我们这门课提供了一个非常好的这样一个,就是大概的一个技术的一些一些介绍。

但是我们从这些课本身来说,我们是相希望在每一个点上会把它更加深入的了解,能够把这些事情让大家更加的深入的理解这个这些技术的实现过程,能够真的把这个技术给学到。

ok那我们今天这个主要的介绍部分就就是这些大家有什么问题,当然有什么问题的话,我们可以通过弹幕来进行来我们来交流啊,但另外一个问题就是说实际上我们还是大概有几秒的延迟的,所以说大家如果发完弹幕之后。

看到我没有回答,也不用太着急,我当时看到了就会有机会放啊,这门课实践这门课是没有参考书的,就主要是我的课件,还有大家上课的这个这个这个,就是我们课上的这些这个p p t,还有这个课件。

但如果想要去了解的话,其实我觉得可能有些发现有些领域是很相关的,比如说物理仿真呃,比如说这个前面那个game小量级的腰腰games一的这些课程,比如说可以了解一下,比如机器人领域的一些基本技术。

这些可能都是跟我们相关的,嗯关于python的绑定,我们是不会用玛雅的,我们当时就是一个单独的python环境,但是我们会提供一些基础的代码,有两种方式。

一种方式可能是比如说python其实有一个非常好的游戏引擎,可能有些同学有些人不知道,就是叫panda 3 d,这个其实还是非常非常不错的一个一个信心,所以说我们其实也在考虑是不是可以跟那个戏子做结合。

但是我们在后几周会把这个具体的这个内容给放出来,ok简化模型,这个简化模型其实主要还是呃刚才提到就是我们做减号模型,这个它通常来说是对走路这件事情,就因为走路我们是分析的比较透彻的。

所以说我们其实很多简化模型都是针对于走路进行设计,而且走路也是最常见的一种动作,所以说这个其实也是说我们要学学好这个,做好了自己和魔晶之后,那我们其实就是把至少把移动这件事呢可以至少能够完成。

但是比如说其他的,比如说想做一个空翻红方,其实我是可以理论时,我是有可能做一个假号模型,但是这个研究是非常复杂的,就是我们需要把这个空翻这件事情给分析的很透彻,但总体来说虽然能做。

但是比如说我要再加一个新的动作该怎么办,所以这个其实意思是也是讲模型方法的一个局限性,前置数学我其实前面也提到了,可能我们会问用到的时候,我们会多少会稍微介绍一点内容,我觉得这门课我开始也是想过。

就说是不要求大家能不要求大家有一张非常好的,比如显卡,非常好的机器啊,非常好多的训练就是我们的我们这个实验的设计,其实是可以对我们的所有的所有的作业都是可以通过这种经典的方法。

就是单纯的这个比如说比如说我们前面提,我们后面有一个工作是关于比如说这个简化模型,其实可以通过手调调参数的方式来实现这样的控制,但数据方面其实我刚才也提到了,我们主要是会涉及到这个线性代数。

因为比如说我们后面讲到物理仿真的时候,其实大部分我们会从头给大家讲一遍,这个为什么来的,但如果大家有兴趣的话,可以去了解一些,因为这个多元的仿真是很多概念,就是跟比如说力学。

特别是理论力学这边是直接相关的,因为多巴胺反正我们会涉及到,比如说拉格拉格朗日力学的一些基本基本的一些一些概念,大家如果说有了解的话,可能会那个地方会比较容易过。

我觉得人机交互其实可能是这个更大就是可能不一样的一个领域,人机交互主要是说我通过什么方式,可以更好的让一个机器更好的跟人进行交互,那其实动画是这样,人际交互里边的一个一个手段。

就确实比我觉得其实有一个例子啊,就比如说现在直播带货了,所以这个严格来说不是人机交互吧,但是直播带货就是说你有个人有个人的形象在那里说,其实会给这个你的受众,你的交互的对象会带来完全不同的这个这个感受。

所以说应该说是动画的一部分技术,我们是可以跟在人机交互里使用的,那当然这人机交互,它其实里面其实研究的是另外一个一个一个范畴的问题,所以说虽然说有关系,但不是一个问题。

我觉得动作生成可能短期内还是不可能代代替动物,因为我们现在动作生成还是就是他的这个输入还是来自于动捕数据的,比如说ai作画,ai作画其实也是一个例子。

就是它其实本质上来说它还是只能生成他见过的那些画的风格,那些种类,但你说你要我做一个完全没见过的,这个其实还是挺难的,耳洞的生成其实也一样的,我觉得最终的实现我们其实一直强调物理仿真是future哈哈。

但这个future还是可能还是需要若干年才能实现的,就是如果说我,们真的是把一个人,比如说我的肌肉很准确,它这个响应真的能把它建模出来,那这种情况下。

我可以保证我可以通过另外一些方式生成比较真正合理的动作,那现在其实是不行的,现在因为我们这个模型是简化过的,他比如说他可以跳2米高,这是没有问题的,但是但是生成人是不行的,因为你跟他是简化过的模型。

它的这个约束也是简化过的,所以总体来说我们还是需要一些运动数据来帮助我们去限制,去约束我们能够生成的效果,这个其实短时间还是很难去替代的,哇塞这个现在都是越来越学术的问题,哈哈对动作预测。

其实我觉得这也是一个,因为我觉得其实我们做生成的时候,其实很大程度也是在于做预测嘛,因为因为厕所的事情就是你判断一下我接下来生成的动作是什么,所以说比如说我们用cv应用这个生成模型来做一次。

其实我觉得是问题不大的,但总的来说你肯定是不可能准确的预测下面要做什么事情,因为这个跟我这个做动作的这个人,他的想法是直接相关的,比较炫酷的动作有哪些,动作生成算法,这个我们后面会讲到一些会讲到。

基于这个征程控制模型的一些方法,我觉得都是有可能生成比较羡慕那种动作,但这个还是取决于我们训练的时候,他见过什么样的动作,所以你是想要做胸口的动作,其实你还是需要一些好的动作作为输入的,啊衣服的动态。

我觉得衣服动态其实大部分情况下,我们是把衣服作为所谓的second emotion,就是其实人的动作之后依附有些随动的这样的一个效果,但实际上也是有一部分问题的,就是说实际上比如人的姿势,人的有些动作。

比如说裙子,那其实比如我走路的时候,这个这个脚要移动就受限制,那会带来一些完全不同的这种运动风格,还有另外一种,比如说这个像女士穿高跟鞋,那其实这个这个高跟鞋它所带来的这个对动作的约束。

它也会影响我这个动作的形态,所以这两个其实是互相互相关注的,然后这个但是怎么去生成,我觉得这其实也是一个非常好的问题,但是我们如果有兴趣的话,我们可以进一步到后面探讨,国内做模拟或动画研究组。

那我觉得就是关注我们就好了呀,哈哈哈哈哈,关注这个北京大学可视计算研究室研究实验室,当然国内还有很多的,比如说浙大,还有这个山大,还有这个,当然深圳那边还有清华,其实好多组都是在做相关的内容。

我觉得大家有兴趣可以多关注一下c graf啊,各组化的工作,特别是今年西瓜va我们有两边工作,还是还是做的非常不错的一些作,ok好我觉得这个呃那我们时间关系啊。

我们就这个在课上就我们就不再做更多的讨论了,大家有什么想法有什么意见呢,那最后呢就是送给大家一句话啊,这个常看常新,那这个是来自颜林奇老师的这个这个这个这一段话,但是我觉得确实就是很多时候。

然后他发现有些东西其实也是诶好像有段时间没有见了,都已经经常会遗忘掉,或者有些东西其实,也是第一次,就是可能以前看过,但是再看一次翻,果然还是新的,所以说这个常看常新啊,其实我也学到一个新的词。

abandon,大家都知道abandon是什么,abandon意思就是常看常新,每次我翻g r e的时候都发现哎呀这个词是新的,哈哈哈,ok好的好的,谢谢大家,我们那我们今天的这个课程就到这里。

然后也是希望,然后我们下周再见啊,希望下周还能再跟大家做进一步的交流,那我们下周还是从这个一本基础开始,从我们的这个数学和前向动力学的相关内容,好的那我们今天就到这里。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

GAMES105-计算机角色动画基础 - P10:Lecture09 Actuating Simulated Character - GAMES-Webinar - BV1GG4y1p7fF

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

ok好那我们就开始上课啊,这个非常抱歉啊,因为上周确实这个身体不太舒服啊,我们就又跳过了一周,这样的话实际上我们原计划应该是,今天是这这门课的最后一节课,最后一节课,但是实际上因为我们中间跳过两次课。

所以说我们结束的时间也会相应的延后一下,这个相应的我们的日程上也会有些调整啊,那我们今天的内容其实相对来说会比较简单,因为上节课我们讲的时间比较长,主要是讲了很多仿真相关的东西。

那我们今天其实会继续上节课的内容,但是我们现在在这个仿真之后呢,我们其实还是要讲一讲,我们该如何在仿真的基础之上,能够驱动我们的角色来产生这种动画,因为毕竟我们这门课是这个经济学的动画嘛。

啊那我们今天其实主要还是讲这个如何驱动的,第一个就是最基础的部分,就是我们该如何让这个角色能够动起来,当我们动起来之后呢,那我们后面有几节课啊,其实会讲是更加介绍多一点的。

就是关于我们该如何让这个角色能够,动得更加好一点,更加更加真实,那我们今天是这个game 305的第,应该第十第十次课啊,所以说我们写的是lecture,零九,我们主要是讲讲activating。

simulated character,也就是如何去驱动虚拟角色来产生动作,他们可以先简单回顾一下,我们上节课讲了,不讲了内容啊,我们接着上节课主要是讲的是什么呢,我们如何来进行一个仿真。

如何仿真一个虚拟角色,如何让一个这个缸体,因为我们现在我们角色动画里面,其实我们所处理的这个虚拟角色,大部分其实是这个由刚性的,不会变形的肢体加上关节构成这样的一个系统,那在这个基础之上呢。

我们该如何去嗯,为了让角色动起来呢,我们其实肯定是需要在这个钢铁系统上,那我们如何来计算这样的合力和力矩呢,其实主要是我们控制器需要去完成的内容,好我们今天主要是讲两部分。

一部分是说我们这个控制力是怎么去施加在,这个角色身上的,另外一方面呢,我们讲一讲一个非常简单的这个控,计算控制力的这样的一个模型啊,就所谓的比例微分控制,我们可以简单回顾一下,就是嗯其实我们讲这个仿真。

我们通常来讲是给出了一个比如说一个质点啊,我们一个质点它有一个位置啊,它有一个速度,那在这样的基础之上呢,我们其实可以根据这个速度和它的位置,去不断的更新它的位置,来产生一个这个支点的一个动作。

那这点其实他这个这个因为大家都对这个,牛顿第二定律是非常了解的,那实际上我们如果想让这个质点啊产生,让他产生我们想要的这个运动,我们通常来讲需要在这个支点上加一个,合适的外力啊。

那这个力呢其实会相应的产生加速度,然后这个加速度会进一步的通过积分啊,来更新这个支点的速度以及支点的位置,那最终形成我们的动作,那当然这个其实只是一个支点,支点是在于是一个什么样的。

它是一个非常抽象的一个概念,它只有位置嗯,就是它只有只有方向,只有速度,只有位置,它没有形状,这样的话意味着什么呢,意味着这个支点我不管怎么旋转,它其实这个所代表的这个东西啊,这个状态其实是完全等价的。

但是我们其实在这个动画里边,更关心的是所谓的钢铁,那缸体和质点区别在于哪呢,钢铁之液在于缸体是有形状的,那形状会带来一些什么效果的形状,就是说这个缸体在不同的朝向之下,那它的形状在我们能够观察到的。

这个这个外在的这个这个外观其实是不一样的,从另外一个角度讲说,实际上也是代表了什么,代表了这个缸体它在不同的朝向之下,那其实会代表着不同的状态,这时其实是跟我们讲质点的时候,是完全不一样的。

那这个其实也带来一些什么问题呢,就是朝向或者旋转,那其实是一个非常讨厌的东西啊,它跟我们这个速度啊,这些线性量不一样,它是一个角度的量,而且它是一个非线性的量,那这些其实会带带我们这个我们上节课。

包括我们以前讲各种跟这个关节旋转相关的,这些这些这些操作里边,我们就发现其实这个这个这个非线性啊,其实会带来很麻烦的一些东西,包括比如说i k我们为什么要算jacoby。

因为本质上来说也是因为这个非线性,我们只我们只能通过这种方式来进行处理,那当然这个朝向因为不同的朝向代表了不同的,这个对于钢铁来说,不同的朝向代表不同的姿态,那实际上我们需要去关心手机。

首先我们需要关心它的朝向,其次呢那朝向随着时间,因为它运动过程中,那朝向也会不断的发生变化,那我们知道位置的变化其实带来的是速度,位置的变化率本质上就是速度,那朝向的变化率呢。

我们其实也是提到它本质上就是一个角速度,那其实也是一个速度的衡量,那当然我们其实也是,因为毕竟这是一个非线性的东西啊,所以说实际上r的点比如说是一个旋转矩阵啊,它的这个变化率。

实际上跟我们的角速度还是有一点点区别的,我们上节课其实也讲到了,实际上角速度其实是这个跟跟这个角度啊,就是这个旋转矩阵的这个导数,其实是有一有一个有一个有一个坐标转换的,这么一个关系。

那除了这个速度之外呢,其实我们知道在我们讲质点的时候,质量还是有质量,那质量代表什么,质量其实代表的是一个啊,对于运动的某种程度上,是一个抵抗的这么一个效果,牛顿第一定律说的什么,第一定律说的是。

如果说我们的质量没有变化,哇塞不,如果说我没有任何外力,那其实这个物体会保持当前运动状态,但实际上这个东西保持这种运动状态,的这么一个这么一个趋势,或者这么一个能力,其实代表了这个东西的惯性。

那惯性用什么衡量呢,其实就是质量来衡量它的惯性,那对于角速度来说,对于钢铁来说呢,其实对于限速的,我们是用质量来来去来去衡量它的惯性,那对于这个角色来说,我们其实有一个类似的一个量。

这个量就是所谓的这个惯性张量,那这个惯性张量其实你可以类比于质量,这个变化,就它代表了是,因为质量是代表对于线运动的这样的一个啊,阻碍他改变了这种这种这种能力,而这个转动惯量呢,其实代表的是说。

我去改变一个旋转的这么一个状态啊,然后所需要带来的这个,所需要带来这个这个这种抵抗的一个衡量,当然这样的观念其实跟质量是有很是很相关的,因为本质上来说,它其实是每一个质点的这样一个。

这个每个质点自己的这样的一个角动量的,然后在整个这个缸体啊,它这个上面做了一个积分啊,他最后走体现出来的这么一个整体的,这样的一个效果,才是这个转动惯量,所以实际上一般来说。

这个如果是一个物体的质量更大一点,但通常来讲它的转动惯量也会更大一点,那当然还其实我们上节课,其实这个公式上还是可以比较明确的看到的,实际上转动惯量跟物体的形状,也是有很大的关系的,你看这里。

其实这里这几个球其实质量大小是相同的,但是他们的转动惯量是不一样的,其实一方面是说,如果说这个转动惯量,它这个质量分布的更加接近于这个物体的边缘,那通常来讲它所带来的转动惯量会更大一点。

然后不同的转动惯量,其实它对这个旋转这个角速度变化的,阻碍程度是不一样的,所以说时间可以看到它,就是虽然说我们质量是相同的,我们这个初始状态是相同的,整体运动表现也是可能是完全不一样的。

这其实是一个专栏惯量这样一个过程,那类似的还是我们其实也提到了,对于一个线性,那对于一个质点来说,我们都要加一个力,这个力其实会带来我们的质点的加速度的变化,那同样的。

如果说我们想去带来一个这个角速度的,这个变化,那我们其实需要加一个角,跟角度相关的这么一个力,这个力其实就是力矩,而实际上我们知道力,任何一个外力其实都会有一个力矩的作用。

它的力矩本质上等等价于是这个利弊啊,乘以利差成立啊,得到这个力矩,它其实代表的是一个这个力对这个角度啊,这个物体的旋转上,这个带来的影响,那结合力的这个牛顿第二定律,它其实代表的是这个线性方向上的。

这样的一个力和速度变化的关系,而在角色的方向上,我们也提到了,其实有一相的是欧拉啊运动定律,其实牛顿第二定律也是欧拉运动定律的一个,其中之一啊就是就是欧拉定定律,相当于把这两个定位结合一起。

难道你要嗯欧拉定定牛顿第二定律是说什么呢,是说这个f等于ma啊,或者再进一步的时候,它其实应该是动量的时间变化率啊,等于这个力的大小或者力的大小,带来的这个动量动量的时间变化。

然后对欧拉的这个运动模式来说,实际上是角动量的变化率等于力矩啊,这个其实是这个其实跟牛顿力压力是相似的,但唯一的区别在于呢,就是还是我们这里,其实是要考虑到一个非线性的一个,角度量的变化。

所以说在我们最速度求导,那其实可以直接得到它应该就是这个啊,这个这个就是速度的导数,但如果说我们对角动量求导的话,因为角动量一个这里边这个转动惯量,转动惯量,它是跟物体的形状和物体的朝向同时相关的。

所以说实际上我们的秦老师要稍微复杂一点,这样的话其实可以得到,就像我们这里就出现了这个公式,就除了我们正常的这个角速度的这个加速,角加速之外呢,我们其实当前的角速度也会带来一些额外的,这个力的效应啊。

虽然它是一个它并不是力,但它其实代表了某种程度上一个力的效应,就是我们的差乘,还有我们对这样的一个改一个形式,所以这样那是连在一起啊,首先就是我们的所谓的刚体运动的,这个运动方程。

那我们其实可以把它写成一个矩阵的形式,那我们其实当我们给出了一个外力啊,一个啊这个外力和外力矩之后呢,我们其实可以求解这个运动方程,得到我在这样外力的作用之下,我的这个角速度的加速的变化率。

或者或者角加速度以及我的速度变化率,那通过积分的话,我们可以进一步得到最终的动作,那就是我们这个物体该怎么动,它的速度该怎么变化,它的位置该怎么变化啊,完成这样的一个操作,那这个其实我们是简单回顾了。

上节课,我们讲了这个仿真的这个运动方程的这部分,那实际上这个其实也是告诉我们,比如说我如果说我们需要在一个物理引擎里边,去定义一个一个钢铁,那通常来讲我们需要给出什么样的一个参数呢,就不管什么物理性。

比如说用bullet,用jo或者是用sc或者fsx或者是时间,大家可能就是在游戏见到了一些其他物理,就比如havoc,实际上大同小异,就当我们去定义一个缸体的时候,我们需要给出钢铁的一些参数。

通常来讲我们需要两个有两个参数非常重要的,一个是质量,一个是转动惯量,这个代表了钢铁他的这个这个惯性的部分,那这个其实是不管我怎么动,它都是一个相对来说比较固定的,这样这样一个结,除此之外呢。

作为一个刚体,我们知道它有位置,没有朝向,有速度,有角速度,这个其实代表它的运动的部分,另外一部分呢就是所谓的geimage,就是所谓的缸体的这个形状,就通常来讲,我们知道这个对于游戏引擎。

或者这种这种仿真来说呢,就是钢琴就read about it,通常来讲是,我们可以把它认为是一个,有点类似于一个一个一个一个抽象的,一个一个一个对象,就是它可能本身,我们其实不关心他具体长什么形状。

我们只关心在这样一个这关灯,这样一个质量和战斗惯量之下啊,然后加上一个力之后,它需要它会产生什么样的,这样一个运动上的变化,那相对来说,形状本身其实通常来讲是跟钢铁的定义,独立的一个东西。

那形状带来什么呢,形状带来了两个两三种不同的这种影响啊,一种影响是说外观,那就是我们看到这个物体到底是什么形状呢,它是一个box,是一个sphere,是一个球,或者是一个一个一个立方体等等等等。

或者是我们可能是一个mesh,一个电源啊,或者是一个一个网格,那可能就是一个一个一个人形啊,或者是一个动物啊这些形状,这是其实一方面带来的外观,另一方面带来什么呢,另外带来的是转动惯量。

我们前面提到了这个转灯光亮,其实它的它跟光物理的形状是直接相关的,所以说如果说这是一个bug或者是一个球,或者是一个球壳,或者是一个这个这个时间球,它其实都会带来不同的转观念,另外一方面呢。

其实质量某种程度上也是会跟我的形状相关的,因为人基本来说,比如说我们的这个啊密度,基本都是这个跟水差不多嘛,那实际上你的体积就代表了你的重量,那还有另外一个非常重要的部分。

就是所谓的collision detection,我们的这个碰撞检测,因为我们知道最基本的人能站在地上,那实际上是地面会给人的脚一个支持力,那这个地面应该在什么地方给角的支持力呢。

其实你需要告诉他我这个角的形状是什么,所以说定义一个这样一个这样一个rg的body,通常来讲,我们其实是除了我们的这个,纯粹的物理量之外呢,我们还有相对的这个几何量呢,主要就是这个形状。

这部分不管能有哪一种物理情啊,实际上我们都是要给出像这些这些量啊,这些东西来定义,我们这样一个信这样一个这样钢铁的角色,那咱们只是其实是一个单独的钢铁啊,那对于多个钢铁来说呢。

我们其实上节课讲的部分是说,我们其实可以把多个缸体啊,看成是一系列独立的单独的缸体来进行计算,那在这个过程中呢,因为我们多多样体对一个角色通来讲,我们会有一个关节啊,把这些钢铁给连接起来。

那关节代表什么东西呢,关节其实代表了一种约束,约束是什么呢,就是说比如说我两个物体,它为了在运动过程中不能分开,那这个约束一方面代表了从几何上角度讲,就是说他们俩肯定是要满满足某一个相对关系。

在这过程中不发生变化,另外一方面其实为了能够满足这样的下列关系,我们知道这个像一个关节,比如说抓这个物体往前往这往前扔啊,如果说这个我不想这个物体离手,那我肯定是在运动过程中,要不断给物体加一个力啊。

才能让他不会离开,不会跟我的手分开,那时间关节其实也是一样的,结果这两个两个两个缸体,两个肢体在他们需要分,在他们这个运动过程中,它有分开倾向的时候呢,那这个约束啊它会相应地产生一个约束力。

那这个约束力来保持这个物体能够混合在一起,那如果说我们能够计算出这个约束力之后呢,那实际上这两个缸体其实本质上就是两个,在所有的这些外力之下啊,独立运动的一些钢铁,所以它其实你写成运动方程的话。

本质上它其实就是两个钢铁的相应的部分,然后拼在一起,拼成一个更大的一个方程,那他这个里边我们这个约束,就比如比如说关节约束,其实其实这个方程之外的一个额外的一个,一个方程。

那这个约束力实际上有包邮的约束,这个方程来嗯,来这样的一个给出的,那当然这个方程比较麻烦了,我们其实可以同样把它稍微简化一下,写成一个更加紧凑的一个格式,那本质上来说。

这两个方程这个跟上一个方程其实是一样的,我们只是把这个矩阵用一个简单的符号来代替,那这个包括中间的这个这个求导,得到这个这个差成像,我们其实也是可以用另外一个函数来定义。

本质上来说这俩是同一个同样一个东西,那如果说我们有更多的一个物体啊,就比如说这个正常人,那我们其实可能有十几个不同的关节,不同的钢铁关节组构成,但它本质上来说是一个构成一个更大的,这样的一个系统。

那里边每一个关节带来相应的一行的,这样的一个约束啊,同时也也会相应的产生一个对应的约束力,那整体整个仿真过程呢,实际上就是在构造这样的一个啊运动方程,包括了我们这个每个约束的关节。

约束所带对应的这个约束方程,然后以及我们这个所有的外力和,每一个这个约束力构构成的这样的一个加速度,这样的一个方程哦,就是那最终这个方程去求解,得到我们相应的加速度,那最后通过欧拉积分。

我们可以得到我们这刚体运动这样一个动作,那这个其实我们主要是我们上节课讲的,讲的内容,那同样的我们前面说对定义一个缸体,那我们其实需要给出它的质量,它的位置,它的形状,那如果说我们对一个角色。

通常来讲角色我们知道它是由若干个钢铁啊,然后通过若干个同样数量的这个关节啊,来来连接起来,通常来讲我们讲关节的话,特别是对于一个人形的角色啊,我们通常来讲它的关节总是,每个关节总是连接两个物体。

222个这个缸体,所以说整体来说我们钢铁的数量和关节的数量,是指刚好差一的,就说就是关节的数量,刚好比我们钢铁的数量少一个,因为这样的话可以保证我这样的一个这个连,连接关系,那我们定义一个角色。

那么通常需要d什么呢,首先我们需要定义每个缸体的,它的这个各种属性,包括它的位置啊,朝向啊,转动惯量等等,那另外一方面,我们需要定义这个钢铁本身的这个形状,但通常来讲。

这个形状他可能跟我们这个角色本身的外观,可能不完全一致,因为特别是我们这个角色,大部分情况下,它其实是一个网格啊,比如说一个人形的一个网格,或者说一个比如说一个动物,那我们这个缸体我们在仿真的过程中呢。

通常来讲我们会用更加简单的几何体来代替,比如说有一个capsule,一个胶囊体,或者是一个box,一个企鹅,一个一个立方体,或者一个或者一个这个这个这种这种啊,求这样的之类这样的角色。

为什么我们要做这样的事情呢,其实本质上还是因为我们需要去做,比如说碰撞检测,比如说我需要判断判断检测做的是什么,判断检测做的是说,我们需要判断一下两个几何体,它们之间有没有相交的位置。

然后这个如果有的话,那这个相交的位置在哪里啊,通常来讲,比如说我用碰做一个电源和电源做碰撞检测,这个其实是比较麻烦的,因为这个点位形状不规则,所以说如果说我需要去判断哪两个部分相交。

那我基本来说需要把整个电源去遍历一遍啊,当然我们有些数据结构能够帮助我们去加快啊,加速,那实际上整体来说它是一个比较耗时的,那样一个过程,另外一方面,其实电源其实本质上这个就这个这个网格。

它本质上还是一个比较,是一个比较,可能是一个比较更加复杂的一个东西,的一个近似,那这种情况下,比如说我需要计算我该上哪个方向上去,就是就我这个朝向,他就我这个接触点,我该怎么去把它这个东西分开啊。

在这如果说一个点源的情况下,其实相对来说更加难算一点,因为很多时候比较难判断我这两个相交的时候,哪一个是在物体的这个人的里边,哪一个是物理人的外面,因为我们通常来讲,比如说我要处理这个碰撞的话。

我们是希望他们俩能够分开,而不是能够接进去了,那我希望能够比较准确的判哪里哪是y,那这个其实对于这个对于这个网格来说,通常也是也是一个比较麻烦的一个过程,所以说实际上我们在大门仿真里边呢。

就是这个通常来讲我们还是会用这个,一般来说会用一个简单几何体,给他提高这样的效率,玩实际上这也不绝对了,就是其实很多时候我们也可以用这个,用这个用这个mesh来来完成这样一个工作。

那另外一方面除了我们这钢铁的定义之外呢,我们其实还是要定义相应的这个关节,因为关节本质上,它会变成我们前面运动方程里边的这个约束啊,那其实基本来说我们需要知道什么呢,我们需要知道这个关节在初始化的时候。

它在什么位置,因为我们知道关键,它代表的是说两个这个它所连接的两个物体,在运动过程中,这个是在这个这个这个这个关节的这个位置,是不会分开的,那一,这意味着就是说这个关节的位置。

在第一个物体的这个相对的坐标系下,和在第二个物体的相对坐标系下,他所得这个带来这个嗯,所对应的位置是永远重合的,那这个对应的位置,时间是由最开始这个关节的位置,以及这两个角色这样缸体的位置。

对应的位置所共同定义出来的,那除此之外呢,这个跟这个关节的类型,其实也带来的也会带来更多影响,我们这个运动这个角色的运动,就比如说我们的这个膝盖非常非常典型,它是一个一个自由度单自由度这样的一个关节。

那如果说这个膝盖哎,我突然突然向向向旁边去弯过去的,那这个人多半就是骨折了,那这个肯定是不对的,那这对应不同的这个关节,其实对应的不同的这个约束的方程,比如说一个黑纸状态。

那么除了去那么要求他这个关节不会分开之外,那么其实同样还是要求他在这个hinge冠,就是就是hinge这个自由度之外,另外的自由度,它的旋转应该是两个钢铁的旋转应该是相同的,开机就会带来这样更多的变化。

所以整体来说,比如说我们需要定义一个角色,在一个访整理心里定义这样的一个角色,那么就是首先我们需要定义他每个关节啊,每个缸体的一些性质,以及另一行每一个关节的这样一个性质。

那这样的话我们就可以在一个仿真器里,把这个角色给建立起来,当我们建立这个角色之后呢,其实仿真过程我们大概可以写成这样一个,框图的这样一个形状,因为它整个仿真过程我们最关心的是什么呢。

就是实际上最关心的是每一个在仿真过程中,每一个缸体啊,它的位置朝向速度,角速度等等的变化,这些共同构成了一个缸体的这样一个,整个角色的这样的一个状态,那这里其实有一个问题,就是说为什么我们在这里。

这个关节的位置该怎么处理呢,就是关节的位置,我们其实为什么不考虑其实关节的位置,因为我们前面提到了,它本身是一个约束嘛,它其实代表的是说他总是会满足一个关节,相对于某一个缸体。

它的相对位置的运动公式不会变化的,因为这个约束就决定了这件事情,所以实际上如果说我们知道了钢铁啊,就是每个关节,美国每个这个肢体的这个为这个朝向,这些信息的话,那么其实可以很容易的去计算出。

这个对应的关节,它应该这个相对相关的这些性质,那这个过程中我们其实仿真,我们可以大概的近似的写成的这样的一个,框图的一个形式,那本质上来说,从某一时刻t时刻,我现在知道整个角色他的身体状态。

包括了他的每个关节的每个肢体的位置,每个缸体的位置啊,速度朝向啊,角速度等等这些信息,然后呢我把这些这些信息把它给啊,交给我们的仿真引擎,那这个仿真引擎呢会根据这些信息计算出啊。

或者更新啊这个角色的这个状态,那我们算出下一个t加一时刻的这个每个缸体,它的这个位置速度啊,旋转也还有这个朝向,那这个dynamic simulator,我们这个仿真器啊,他他大概做了什么事情呢。

其实如果说我们把这个整个过程流程,写的更加仔细清楚的话,它大概分成这样几个几个环节啊,首先是说我们需要做这个contact检测,我们需要判断一下哪一个,比如说站在地上,那我需要判断一下我的脚是啊。

哪些部分跟地面是接触的,那地面接触之后呢,我们其实会加上相应的这样的一个呃,这个这个碰撞模型,那我们其实挺讲最简单的碰撞模型,那么就可能是基于这种,所以法向的penalty的这样的这样的模型。

我们可以根据我的跟地面的接触的,这个这个嗯相交的这个程度,不好意思,我们可以相应地计算出计算一个力,这个力可以保证我这个角是用在地面上的,那另外我们其实不能放置模型,其实比如碰撞模型。

他可能是说我可以把这个啊碰撞啊,变成一个额外的一个,类似于关节约束的这样一个约束来实现啊,这个自动的去计算这样的一个力,在我们这个求解的运动方程过程中,那除此除了这些之外呢。

在这个这个碰撞检测完成之后呢,我们其实接下来就是对于关节的约束,的一个建模,以及对于一些其他的这个可能用户,一些其他的一些输入的一些建模,然后把这些共同的变成一个equation motion。

我们的这个运动方程,然后求解运动方程,那给我们是什么,它给我们的是这个加速度,然后对加速度呢我们进行两次的积分啊,这其实是那个这个新欧拉,simpletic欧拉的这个积分方式,首先积分这个啊加速度。

得到我们的速度的这个更新,然后再用速度的更新去更新我们的位置啊,最终生成我们的这个动作,所以通常来讲我们讲仿真,或者我们讲一个物理引擎,它通常来对我们来说是一个黑盒子,那这个黑盒子里边。

实际上它整个的流程大概就是这个样子啊,不管是什么样的物理引擎,大家看到基本来说都是这么一个东西,那当然这在这个过程中,实际上比如说我直接把这个物体,把这个角色建立在我们的这个反弹器里面。

然后哎呦跑一个仿真,那这个我们看到其实只能是这样的一个效果,这是什么效果呢,实际上这个角色他确实在仿真,他这个动作本身是物理真实,它完全满足我们的物理规律,但是这个问题就是说他只会往对象摊在一起。

摊成一堆啊,这个主要是为什么,就是因为我们现在里边实际上没有任何的控制,我们实际上就是让这个角色,单纯的在重力的作用下,它产生这样的动作,那这个就是redmulation啊,其实也是挺常用的。

但我们其实之前也在那个第一节课,我们其实也提过这样的一个概念,我们就说相当于比如说比如说一个角色啊,他如果说被这个失去意识了,那其实他的动作差不多就是这个样子,而实际上这个是其实确实是就是。

哪怕是这个就是真实世界里边,其实我们也知道在人比如被绊倒的那一瞬间啊,实际上就是人,因为人的这个神经的反射是有一定时间的,这个时间大概0。2秒左右,也就是说从我如果说我在这从我被突发事件。

比如说我被绊了一下,然后大概在零点几秒这样一个范围内,我其实是大脑是来不及反应的,那这个时候其实人的动作差不多也是这样的,一个regular仿真,那当然时间不会这么rank的,不会这么完全没有任何理由。

毕竟这病人的肌肉本身还是有一点点,这种这种这种这种反抗的,这个这个这个就所谓的单品啊,然后这种这种弹性的效果它会不会有这么亮,但本质上来说就是在人无法即时反馈的时候,时间大家动作也是。

这也是一个类似这样的一个效果,那当然我们其实主要还是我们其实想要的,如果说只是这样的效果的话,实际上我们这个这个就比较无聊了,因为主要是他不能做出我们想要做的,做出更复杂的动作。

但为了让这个角色或者为了让一个刚体,或者为了让一个物体,它能够让照按照我们想要的方式去移动,那我们通常来讲是需要对它施加一个外力的,就这个实际上说,我们物理仿真跟真。

跟那个前面的关键帧的动画的最大的区别,就是关键帧动画诶,我们想要它能当一个状态,那我们就直接把这个角色的这个状态,它的位置啊,设置成对应的那样一个姿态就可以了,但对于物理仿真的经验来说。

我们通常来讲我们不能直接去做这样的设置,我们只能通过诶我再在每个关节上啊,每一个物体,但这些例和例句,其实会体现在我的运动方程里边啊,它会改变我的这个角色的这个每一个缸体,它的速度,它的加速度。

从而进一步的去影响我这个角色的这个动作,那咱这个力和力矩对于钢铁来说呢,我们通常来讲会把它这个等价的,认为它是加在这个钢铁的质心上的,那不管我就这加了多少力,在钢铁的什么位置加了力。

那最终来说它都会体现成一个再加在质心上的,一个合力,以及在至今啊以执行为轴的这样一个例句,那这样的作用,那当然如果说诶我就是不加在这些上,我就是加在这个钢铁的旁边上,其实也没有问题啊。

唯一的区别就是说实际上这样一个力,它会等价的,带来一个在至新加同样大小的力,的这样的一个效果,同时呢,它会在额外的,在这个至今这个上面产生一个力矩的效果,所以实际上它是等价的。

那另外我们上节课其实也提到了一个现象啊,一个一个情况就说我可能有些时候我没有理,我就单纯只加了个例句,那这个例句其实等价于什么呢,这个例句等价于是说我实际上是加了一对儿啊,大小相大小相反,大小相同。

这个方向相反的力,那这一段力呢因为它大小相同,方向相反,所以他们在质心上的合力是零,也就是它不会产生我至新的这个速度的变化,但是呢它会产生我这个物,让这个物体产生一个旋转的效应。

那这个效应就是力矩的效果,所以本质上我们知道这个如果说我们只加例句,实际就或者再进一步的说,实际上对于一个真实的物体来说,我们是不可能加一个例举上去的,就是例举这个东西。

本质上只是一个数学上的一个一个描述,这所有的力矩本质上都是力力的产生了,这样一个加速度角速度这样一个变化类效果,那我们可以近似的认为例句,它就是一个一对立啊,产生了这样一个这样一个效果。

那当然这是一个单独的缸体了,如果说我们在我们前面下一个角色啊,一个一个人形的角色,那其实有很多钢体,通过我们的这个关节可交叠在一起,那同样的为了能够驱动它的话,我们也可以对每一个缸体。

单独去加相应的力和力矩,那最后整体来说,推动这个就这个这个这个钢铁产生运动,那另外一个角度其实也更加长的方式呢,就是说我为了能够驱动这一个角接的用关节,用关节连接在一起的这样一个一对儿啊。

一个钢铁来运动,我们可以在关节上加一个例子啊,所谓的关节例句,john talk,那这里其实有两个问题啊,就是说虽然说我们通常来讲,很多时候我们会不断提到这个关节力矩,但实际上关节力矩需要搞清楚。

还是需要多讲一句的,就说什么是关节列举,为什么我们要讲,关键是因为为什么我们可以加这个关键位置,另外一个方向就是说这个关节力矩,本质上它是在关节上加一个力矩,而我们运动方程时间里边都没有关节。

关节是时间,只是下面这个就是关于我这个运动的一个约束,它是一个关节,而运动方程里边,实际上我们真正起效果的这些力啊,都是加在缸体上的,也就是说实际上这里有个问题,就是说我说我在一个关节上加了。

比如说一牛米的这样一个例句,那这个例句到底该怎么去加载,它所对应的两个这个物体上,两缸体上,那这其实是另外一个问题,那关于第一个问题,什么是关节力矩啊,这个其实我前面也提到。

它本质上还是一个还是一个近似的,就是说比如说一个机械臂,知道机械臂它其实上面其实是这个运动过程中,实际上我们是有更多的是一些电机,或者是马达啊,他们会驱动这个角色,来这个这个这个机械臂来运动。

那这个一个电机,实际上我们知道它实际上就是基本原理,就是一个一个一个一个电磁铁啊,可以在这样一个这个这个不断变化的,这样一个磁场的,总之下,那个磁场会给我的这个电磁铁,产生一个带来一个力。

然后这个力其实会推动我这个电机旋转,那其实这一对这力,其实本质上来说就是一系列的这个大小相同,方向相反的这个力啊,它它共同的做成共同产生的效应是什么呢,它不会带来这个这个速度的变化。

但是它会带来减速的变化,所以本质上来说它是一个力矩的作用,那所以说实际上当我们想说,ok我在一个关节上加了一个力矩的时候,其实我们可以大概想象出,想象一下,它其实就是一个就是一个电机啊,一个转子在那转。

那个转子它带来一个旋转的效应呢,其实就是力矩,那所以说我们再具体化一点,比如说我这是两个关节,两个缸体啊,两个钢铁中间用一个关节连接它,这个关节我把它放大点了,我们可以想象它其实就是一个电机。

那我们其实知道这个磁场和这个回归,我们这个电机的这样一个这样的一个一个一个,一个一个这样一个电磁铁啊,它是一个线圈,我们会产生一系列的力,那这个力呢,我们之前提到它其实本质上是一个合力等于零。

虽然它在这个力的施加位置是不一样的,但是这个力的大小和方向,当把蓝线零矢量之后,它的和它加在一起的时候应该等于零,然后这样的话,如果说实际上这个力相当于什么呢,我们其实是相当于是其中一个物体啊。

一个钢铁对另外一个缸体所施加的力,它只不过施加的位置是在一系列的这些点上,那所以这所有这些力,每一个力其实都会对这个第一个这样一个缸体,在它的制线上产生一个例句,然后因为我们这个力本身。

它的这个它的大小之和是零,所以说实际上它在这个线上产生的力的,这个这个效应其实也是零,但是列举的下一步是不好意思,但是力矩的效应不吃力啊,我们其实可以很容易计算出来,如果说这个关节相对于第一个物体啊。

第一个缸体它的这个相对位移位移是r1 ,然后我们在这个力上,这个刚关节上这一系列视力点啊,相对于这个关节中心的这个位移是r i,那我们可以很容易算出来,每一个力,比如说fi它相对于这个第一个物体。

它的质心所产生的力矩其实是r一加上ri,x乘以fi这样的形式,那所以说所有这个每个关节上,这些一系列的个例,他们产生了总计局,首先就是每一个力的力矩,这个求和,那我们其实可以把这个物公式稍微整理一下。

因为特别是这个前面,因为r一部分是相同的,我们可以把它提取到外面了,然后再考虑到这个所有的啊求和等于零,所以第一项其实是可以约约掉的,只有第二项是是留下来的,所以这个时候你会发现实际上在这种情况下。

在这种设定之下呢,我这个关节上产生的这些力啊,它所对这个第一个刚体质心产生等效的力矩,实际上跟这个关节的位置,这个是没有关系的,它只会只跟我这个关节内部,这个视力点和这个关节的中心。

这样的一个相对距离产相关,还是说是这样一个作用,那同样呢对于第二个钢铁,我们其实可以做类似的计算,那当然这里其实要注意一个什么事情呢,就是说前面这些力实际上是第二个物体啊,这对第一个物体。

第一个缸体湿的力,那根据牛顿第三定律呢,其实相当于第一个物体也会对第二个物体有一,个相反的这个反作用力,所以实际上对于第二个物体来说,它会产生一个例举,这个例句是什么,这个例句是这些反作用力带来的力矩。

所以实际上你的这个公式,其实我们可以做类似的推导,唯一的区别就是这里的f前面是一个正的,然后在这边的话这个f会变成一个相反力啊,就是反作用力,所以这个负的f最终你会发现。

其实r2 的部分也是可以像r11 样,从这个公式里面被约掉,因为主要是说我们这个咱们的假设,就是所有的这些力的大小车之和是零,所以说实际上最终你会得到一个什么新问题呢,就是说实际上所有的这些力。

它的总和是一个例句,那这个例句其实就是我们讲的是说,在这个关节上施加的力矩,那关节施加的力矩,最终如何去应用到两个物体的两缸体呢,它这个嗯它实际上最终效果等价的效果,就是在其中一个物体上施加了。

比如说关键的就是套,那它实际上相当于在其中一个关节上啊,一个物体上施加了大小为套的这样的一个例句,然后同时他也会在另外一个物体上施加一个,大小为副套啊,的这样一个反作用的这样的一个例句啊。

实际上也就是说,如果说我们说我加了在一个嗯关节上一个角色,那很多关节我说你在你在关节上加了一个例句,那它实际上我是它的效果,就是在这个关节的,比如说在他这个,比如我把关节的远离root那个那个关。

那个对应的那个钢体叫做它的子子啊,child它的这个子节点啊,子子钢体,然后它的这个接近于这个root,这边叫做这个parent的这个副港地,那其实通常来讲我们会子刚提上加一个套,加一个正向的这样例句。

然后在这个副缸体上加一个反向的力矩,所以说随着或者再进一步的时候,当我们说我们加一个力矩的时,候,加一个关节力矩的时候,它实际上是在运动方程里边,对于两个关节啊,对这个关节对应的两个啊。

缸体分别加了一个套和一个副套这样的一个形,构成这样的一个运动方程,ok那这样当然我们前面只是讲了,我们该如何去驱动一个角色啊,驱动一个这个仿真的这样的一个,多缸体的这样一个系统来产生,来来让它运动啊。

我们知道其实很简单的方式,就是说我们可以在每个关节上加一个例句,那个接接下来的问题就说这个例句该怎么加,那我们其实只是我加了一个例句,但是我们其实还没有讲怎么加,那这个怎么加。

这件事情实际上在我们决动画里面,或者是在运动的机器人控制里面,我们会有一个模块来完成这个功能,就是所谓的控制器啊,controller,我们其实可以简单的就是描述啊,什么是控制器呢。

它其实就是这么一个模块,它可以根据我角色当前的性质,比如说我当前它的位置朝向它的速度,角速度等等,加上一些可能一些额外的一些控制信号,比如说我想让他做出什么动作,或者我想他走到什么地方去。

那我根据所有的这些信息,我实时的计算一个关节力矩,对每一个关节计算一些关节力矩,然后把这些关节力矩,教给我们的这个运动方程啊,教给我们的这个反弹器,来,去影响我最终角色这个产生的这个动作的变化。

那这个其实就是我们的这个运动,运动控制的这样的一个一个过程,那么这里其实还有另外一个概念,我们要稍微多讲一点,就是我们一般比如说我们讲到运动方程,但实际上我们前面提到,他其实大概可以啊。

简简单的简化的写成了,一个类似于这样的一个形式啊,这个质量加速度,然后以及右边是力啊,以及这个啊约束力这样的一个方式,那当然这个过程中,那这一部分其实是一个啊速度,带来了一些这个所谓的惯性力吧。

我们可以可以这样理解,那这个是我们的运动方程的运动方程,实际上它代表它是建立对谁跟谁建立联系呢,其实本质上运动方程就是f等于ma嘛,就是速度和加速度和力之间的关系啊,比如像这个方程里面。

v的导数是加速度,然后f是我加的外力,所以它实际上是我的这个加速度啊,加速度和外力之间所建立的连接,那这个过程其实就是两个,就是对于一个运动方程来说,我去一方面我可以给出我家俩所有的外力啊。

比如说关节力矩,或者是这种,比如说重力啊,或者说其他的比如碰撞力啊这些的性质,然后我去计算去求解这里的v这里的加速度,那这个过程呢叫做前项啊,运动前向动力学foredmx,就说我知道的当前的状态。

这是大家总结都是知道的,但是我除此之外呢,我知道我当前加了力之后呢,我去计算我的这个加速度,或者说我给出力之后,我去计算我的啊这个这个motion,我的动作啊,这是前向运动学,那其实想想看。

我们其实其实前面讲i q和f k啊,前向运动学啊,但是就叫前向动力学,我说前向运动学,首先就是说我给出每个关节的旋转,我去计算末端点的位置,那对应的有逆向的运动学,那就说我知道末端点的位置。

我去算每一个关节的长项,所以在我们这里也是类似的,我们知道什么叫前向动力学,就是我知道的每个力我就计算它的加速度,那反过来我们同样的一个问题叫逆向运动学,那逆向运动学做的是什么呢。

就说我知道了一个加速度,我想知道我这个时候我应该加多少力,它能够产生这个加速度啊,这个其实就是逆向动力学,它刚好是跟前线动力学相反的一个过程,但本质上来说,这个不管是前向运动学还是啊。

前向动力学还是逆向运动动力学,它本质上都是运动方程的,就是一个运动方程的两种用法啊,就是说只是说还是一个方程,只不过我给出的我已知量是不同的,我求的,另外我求解另外一辆可也是对应的不同。

所以是这样一个过程,通常来讲我们讲这个屋恋情啊,或者讲这个仿真器,它实际上是一个前向运动学的一个求解过程啊,就是我知道了这个力的大小,我通过求解运动方程得到加速度,那这样就得到速度,进而得到运动。

那反过来呢,这个控制部分我们可以认为某种程度上,它是一个逆向运动学的过程,就是我知道我想要这个角色产生什么样的动作,那我需要去计算出它的力是多少,能够生成这样的动作,但是这些对应是一个逆向运动学的过程。

当然实际上这个更加复杂一点,当然这里还有另外一个概念,就是还是我们这个框图,我们这话筒里面,我们知道我们前面提到这个控制器,它的作用是什么呢,它是根据我当前角色的状态,其实计算。

比如说每个关节需要加多少关节力矩,才让这个角色动起来,那这里边其实我们所计算出来的这个关节力矩,它的总的自由度就是它的这个总的参数的量,跟我这个角色状态,就是定义这个角色的状态,所需要的一个参数量之间。

他们之间会有一个关系,反正都是数量嘛,你可能总有一个大一个小,如果说我们这里的这个驱动力,它的自由度比我的这个关节,整个角色本身的状态的自由度要小,那这个时候系统叫做一个欠驱动的系统啊。

这只是一个概念上的这样一个一个一个,一个一个记录,一个一个描述,比如说再举个具体的例子,什么是一个欠驱动呢,什么是这个good,这个所谓的fully acted,就是完全驱动的,就是通常来讲。

如果说我们驱动力的自由度,比我的这个关节状态自由度要相等或者比较大,那我们其实是一个完全驱动的这个例子,一个非常简单的例子就是机械臂,机械臂是什么,就是说就是我这个当我这个机械臂。

如果它是固定在一个位置上的时候,我通常来讲,我这个关节的每一个自由度,都可以很精确的去控制它啊,当然这里其实有些控制其他控制的问题,但是理论来说,我们是可以精确的去通过这个关键列举。

来控制这个机械臂的这个每一个关节的位置,然后形成一个每一个它生成一系列不同的姿态,但另外一方面,另外一种就是其实人对这样一个人形的角色,是一个非常典型的什么,一个非常典型的这个现驱动系统,为什么呢。

因为主要是这个角色他这根关节是不固定的,不固定的意思是什么呢,就是说我没有办法去直接去更改,根关节的这个性质,我可以通过这一系列的,比如说我们前面提到的,对于这样一个角色。

他的关节的数量比的这个钢铁的数量要少一个,因为每个关节连接个两两个缸体嘛,那在这个过程中,我们知道钢铁它的状态的这个自由度,因为他这个关节的数量少一个嘛,所以说这个关节所能提供的这个驱动的自由度。

一定是比我的这个整体的这样一个啊,钢铁的数量在这状态的自由都要小,那整体来说它是一个欠驱动的这样的一个系统,那这个其实从另外一方面也是什么,就说比如说我们讲一个角色。

我们通常来讲是不能直接去控制这个角色的,全局的姿态,比如说这个人觉得摔倒,比如说我我在地上,就相当于我在水里面游泳的时候,我其实是只能通过或者不是游泳,就比如说像这个大家可能比如说在空间站上。

一个失重的状态,你会发现他这个比如说我们的宇航员,他如果说没有任何的跟这个这个这个太空,空间站这个外壁有任何接触的话,它其实只会在空中漂浮,就虽然说我可以改变我身体的姿态,但是我整体的知心。

那我整体的这个全身的这个位置,他是不会发生变化的,因为这样这个时候我的这个驱动的力,缺少了,对我整个这个全身这个质心这样的一个控制,那这个其实也是一个欠驱动器的一个,非常典型的一个性质,另外一说。

比如说我们在人这个走路啊,通常来讲比如说人在走路的时候,我们其实是要非常小心的去控制什么的,控制地面啊,我给地面一个力,然后我希望地面给我的这个这个反作用力,能够推动我的至心向前移动,同时让我不摔倒。

那我其实这个过程其实也是,因为我是一个欠驱动的一个系统,我不可能直接去控制我的啊,这新的这样一个位置,我只能通过间接的通过对外界加一个影响,然后希望外界能够带来给我们带来一个,反相反的这样一个作用。

所以相对来说呢,一个欠驱动系统的控制,要比一个这个完全系统控制要要难很多,当然这个前面只是一个非常简单的一个描述啊,如果说我们在更加严格一点的说呢,其实就是说对于一个完全驱动的系统。

我们可以对任何一个啊我们的运动目标,比如说一个加速度,我们总是可以去找到一个力,然后使得我这个系统能够产生这样的加速度,那这种情况下,它就是一个完全驱动的一个物体啊,一个一个系统,那另外一方面。

对于我们前面提到这个欠驱动,这样一个这样一个系统,它是对于很多我们需要的加速度来说,我们没有办法找到一组这个力,使得他产生这样的动作,但是这样的它对应的其实就是一个欠驱动。

因为这个我驱动力的自由度是不是不足的,我是无法产生我们所有的想要的,这样想那个力矩的,那这种情况下,对于线性动线驱动这样一个系统的控制,我们本质上来说是希望他不要去落到,我们无法控制的那些状态之下。

因为它总是有些状态我们是可以控制的,那这个其实就是我们这个后面讲到的,比如说我们怎么去保持平衡啊,怎么去走路啊,那我们其实做的主要的目的,就是就是为了能够避免它去掉到一个,我们无法控制的状态。

或者再具体点,比如说我们像人正常走路,我们总是大脑,其实小脑总是会帮助我们保持平衡,其实也是限制我们在这个范围内,能够去始终是可控的,那如果比如说我是被绊了一跤,那为什么会摔倒呢。

因为本质上来说就是我离开了,我能够控制这样一个这样一个状态的范围,那其实除此之外呢,还有另外一个比较重要的概念呢,就是说所谓的这个feforward前向反馈控制,fit forward。

fit forward control,feband control和前向控制和反馈控制啊,只要我们提到了,实际上我们的控制器,我的控制策略他做的事情是什么,它是根据我角色当前的状态。

然后计算出一系列的控制的这样一个信号,比如说这个关键例句等等等等,我们其实可以把这比如我用一个符号来表示,比如说这个肯控制器就是派啊,实际上它是相当于把当前的这个状态,然后以及可能有些时间呢做一个参数。

根据这些参数来计算下意识的力,那这里边其实我以这个控制策略使用哪些信息,其实决定了这个这个控制策略,本身的这样一个性质啊,比如说fit forward的control,在fr forean ro里边。

我们通常是讲这个控制器控制策略,它是没有考虑我们当前的角色状态,他是总是去执行一个预定义好的,这样的一个一个一个控制信号的,这样一个一个一个计划,那这个过程中时间就是所谓的前向控制,那这个过程是说什么。

就说这个计划本身我们可以预先定义的很好的,可以可能我考虑了这个角色的各种状态,我们这个系统的各种状态,但是呢另一方面呢,就是因为他没有考虑当前角色的,这个是真实的状态。

所以实际上如果这个角色这个这个系统,他在某一时刻遇到了一些扰动,这个扰动让它偏离了我原原计划里的那个状态,通常来讲,比如说这个人我就是不停的去向前走,向前迈腿,那玩意儿也没有考虑到我现在是在床上躺着。

那实际上最后产生什么,就我就在床上不断的这个做出卖血的动作,但是但是站不起来,它只能是一个前下控制的一个一个特点,那另外一个非常重要,这个对应的就是所谓的反馈控制,反馈控制其实最基本最大的一个特征。

就是它除了我可能他可能会带有一些时间的,这个嗯这个参参考之外,它最主要的这个特点就是,它会根据我们当前角色的这样一个姿态去计算,去调整我的相应的控制,来使得我不会偏离某一个预定的目标太远。

那这就是一个队员反馈控制,或者实际上在我反应控控制,在这个设计过程中呢,我通常来讲是已经期待,我会遇到一定的这种扰动啊,比如说我可能走路的过程中会被人推了一下,那我其实大概是期待说我可能会被推。

那实际上我在设计过程中就会自动的,根据我被推了之后的这样的一个身体状态,去调整我的这个部位啊,这个步子的大小来保持,我能够保持这样一个平衡啊,所以说这是对应的一个反馈控制。

这样一个这样的一个这样的一个概念,但实际上对我们控制来说,其实很常用的一类控制策略,就是所谓的这个比例微分控制,但本质上来说它是一个反馈控制,但是反应控制前面这个,就实际上这个前面的所谓的这个这个。

前向过程和反控制,实际上在不同的尺度上可能是互相会有啊,就他一个一个控制器,它到底是前向的还是反还是反馈的,这个其实在我们取决于我们的控制目标来说,它可能会有不同的这样的一个,不能不可能不同的结论。

就比如我们这里经常和介绍的这个pd控制,所谓的这个比例微分控制,通常来讲它是一个反馈控制,但实际上呢,我们在用角色动画里使用比例分控制的时候,通常说它它是一个fit forward,就是一个前向控制。

因为他是他所它所反馈的部分,和我们竞争想去控制的部分,其实是不完全一致的,但我们后面会有一个例子会会讲到这件事情,那这里其实说为什么,就是什么是比例比例微分控制,我们其实可以举一个简单的例子啊。

就比如说这是一个这是一个杆,这是个杆,然后上面上面有一个穿了一个珠子,穿了一个物体,那这个物体只能沿着这个杆进行移动,那当然我们是这个杆竖直放置的,所以说它这个物体会受到重力的作用。

如果说我没有任何外力的话,那其实是沿着杆就掉下去了,那在这过程我们希望去设计一个控制器,这个控制器能干什么事情呢,它会计算根据这个这个物体当前的位置和速度,它会计算出一个力,这个力呢。

能够把这个物体拉到我们一个目标的高度,这样一个位置上,那这时候这个力应该是多少,我们该怎么算,当然对于这样一个问题来说,相对来说比较简单的,因为我们可以因为这个我们知道重力啊,我们其实高中高中物理啊。

其实已经算了很多很多很多类似的题啊,我们可以可以可以直接算出一个非常精确的解,但如果说我们这个重力不是一个简单的重力啊,是一个非常复杂的,经常会变化的一个重力,那这个时候其实这个力就不太好算了。

那实际呢这为了解决这个问题呢,我们其实可以有一个更加简单的想法,我们其实压根不用去管这个重力到底是什么,我其实也不,我自己不知道,但是呢我知道这个物体跟我的目标之间差了,有一个偏差。

它不在我的目标位置上,那这个偏差,我可以根据这个偏差乘以一个比例系数,来决定我加该加多少力上去,也就是比如说我现在这个x当前位置,离这个目标位置比较远,那就加一个比较大的力,这个力可以把物理拉了。

拉的更快一些,那如果他俩比较近的话,相当于说我理解放小一点,因为他已经足够好了,那这个东西其实就是一个比例控制啊,这里边其实这个比如x8 ,它是一个我们目标位置,x是当前的位置,他们俩偏差。

代表的时间是我当前位置和目标位置之间,这个这个这个这个这个误差,然后我最终加了力,实际上是这个误差乘上一个比例系数啊,或者叫stiffness,或者这个叫这个像刚度系数啊,来计算出来这样一个力。

那如果说这个物体,比如说它在这个物体的上边,那其实你可以这个这个偏差其实是负值,那其实代表的是一个向下的这个力,也就是说,实际上对于这个非常简单的一个系统来说,我们可以用一个非常简单的比例分控制。

来实现这个物体啊,把这个物体拉到这个点这样一个这样一个功能,但实际上如果说我们就按照这个方式去去控制,这个物体啊,你会发现实际上它不会,这个物体它并不会停在我这个目标高度上,因为主要是说在这个。

比如这个物体在这个摸高度下方的时候,我总是有一个向上的力,那这个向上力总是会对物体进行加速,所以说实际上当物体刚好到达这个高度的时候,它其实是会有速度,达到高度之后呢,因为这个误差是零。

所以说这手没有力的,但它也有速度,他会继续向上方移动,那直到在上方呢,我在上方之后呢,那我其实会加一个相反雷达减速,然后这个过程会不断的重复,所以实际上有这个物体的轨迹。

大概是一个不断的这样一个一个正弦曲线啊,对这样一个类似于这样的一个东西,它会不断的一个震荡的过程,然后为了能够让我们这个物体,停在这样的一个位置,为了能让提灯这个位置。

我们其实是想要把这个节目这个控制加一些改,加一些这个改正啊,改进那个改进是什么呢,就是说实际上因为我们考虑到这个物体,它在向上移动对吧,我们应该对它加一个向上的力,然后来帮助它向上移动。

但是如果说这个物体本身有一个向上的速度,那就表示这个物体我不加力的情况,它也能向上移动,所以相对来说,就是如果说我知道这个物体有向上的速度的话,我这个力应该加的小一点,就可以就可以得到达到同样的效果。

那这个其实表示在公式上就是类似于这种,就是我前面是正常来讲,根据位置算的力,然后利用第二个项呢代表了当前物体的速度,如果这个物体速度已经是在向上的情况下,那我对应的就应该把这个力我需要加大力。

减小一部分,那这个实际上就是一个微分控制,它本质上来说出发点可以想象一下,其实就是因为我希望我这个速度减少,就是当当我这个一体物体,已经有向上移动趋势的时候,那我就不需要加大力了,但从另外一个角度讲呢。

其实这个东西也代表了一种耗散,就说我这个其实相当于,我这个物体本身是受到一些阻力的一些风阻,那这个风阻其实会把我这个物体,它的移动过程会减少它的速度,然后减少减少之后呢。

那我其实可能最终会停在一个这个目标,目标点附近,所以实际上这个就是微分控制这部分,从而我们叫单饼嘛,它本质上是一个等价的,认为它其实是一个阻力,那这个阻力会把我的速度,会把这个能量给耗散掉。

然后最终让这个物体逐渐的可能开始,还是有些震荡,它会逐渐的停在我这个目标位置的附近,所以这两个东西合在一起就是比例微分控制,那其实还是个为什么叫比例微分控制呢,如果说我们把x8 减x就是目标位置。

减去当前位置这个差啊,作为我的控制目标,我们想让它最小,那前面这部分实际上是比例部分,就是e的一个,就是误差的一个正比的这样一个部分,那后面这部分呢实际上是误差的一阶导数,或者误差的微分。

跟这个微分的解结果啊成这样一个正比,所以实际上比例微分控制,本质上来说是前面一项是误差本身的一个比例,后面一项是误差微分的比例,所以比微分控制,当然比微比例微分控制,一个非常重要的一个属性质。

就是实际上你可能这个曲线,我们大概可以也可以看到,就是如果说我这个用这个控制器,我一直加一个力,一直这样的运行下去,你会发现它它最终最终会停在一个位置,但这个位置呢其实并不是在这个目标位置上。

而且是而是这个目标位置稍微偏下一点的位置,它总是有一点点小误差,那这个小误差叫statistic啊,error就是稳定,就是稳态误差,为什么这里会有稳态误差呢,因为主要是在于首先微分控制这部分。

如果说我速度为零,那其实微分部分是零,它是没有任何力的,那比例这部分呢它的大小,它所产生的力的大小其实是由误差来决定的,对于我们这个例子来说,因为我受到一个重力的作用。

所以为了能够让这个物体停在某一个位置,我这个力他一定要跟重力大小相同,才能保证这个物体是停在这里,不然的话它就掉下去了,那为了能够产生跟重力大小相同这样一个力,我这个误差肯定是跟这个重力要满足。

这样一个关系的,所以我们总是会有这么一个这么一个小的偏差,就是特别是在这种情况下,因为我只要需要抵抗重力,当然这个过程中呢,其实大家可以可以看到,因为这个比如像这个重力大小是相同的。

所以这个偏差的大小时间是跟比例tp啊,根据stiffness,参数之间是有这样一个正比关系啊,反比关系有的时候我们可以提高,如果说我们提高这个kp就这steam大小,我们其实是最终会减小。

我们这个静态偏差的这样一个大小,那当然好吃好吃的时候它减小了,我们控制更精确了,但坏处是什么呢,它会让整个这个物体,这个系统表现的非常的坚硬啊,非常的刚性,那另外一方面他会也会带来数值不稳定。

所以通常来讲,这个kp是不可能不可能设的太大的,我们后面会有一个具体的例子,但通常来讲我们设了一个合理的值就可以了,当然还有另外一种方式去减去去掉这个误差,就是所谓我们从小讲堂。

大家很多经常经常听到这样的一个此,就是pad控制比例积分微分控制,那这里面其实这个积分项是我们通常来讲,不会使用的,就是在动画里面,我们通常很少去使用这个积分项,就我们前面提到的比例项目。

是这误差的一个正比关系,微分项是误差的这个导数的一个正比关系,积分项实验室误差对时间的一个积分一个积累,然后对这个这个的一个正比关系,然后因为这个因为这一项这个积累的效应,它其实会带来什么。

就说实际上可以让我最终是没有这样一个,这个这个稳态误差的,但是反过来说,为了能够去记录,实现了一项,因为前面这两项,我其实知道当前时刻的这个误差,以及当前时刻的速度,我就可以直接算出来。

但是最后这个积分项它的历史相关,为了能够计算这个积分项,我其实还要去专门去用一个变量去记录,哎我这我前面这段时间误差到底是多少,我还把它不断的累加起来,那这个其实会带来一些麻烦的问题啊。

从实现上带来的麻烦,另外一方面就是特别是我的这个目标,其实在不断变化过程中的话,那其实这个这一项会带来很多,这个控制上的不稳定的问题,所以实际上对于动画来说,或者对于这个我们常见的这些控制来说。

我们通常是指用会用到这个pd pd的部分,就是比例微分的部分,然后这个积分的部分,我们通常来讲是不会使用的,那回到了这个前面,其实其实是一个非常简单的一个某一个,一个toy model,一个玩具模型。

那对于一个更加这个真实的,比如一个人啊,一个一个物理仿真角色,我们通常来讲呢是通过比例微分控制啊,pd控制去计算我需要在这个角色身上加多少,每个关节上加多少的例句,那在这个过程中,实际上形式上其实就是。

刚才我们这个跟这个这个这个tom猫的,其实是相同的,我目标是计算我的关节力矩,也只是一个关节啊,上面两个两个这个物体,我需要计算这个力矩,使得这个角色的这个这个两个关节之间的夹角。

达到一个目标的这样一个位置,那对应的这个所谓需要的加的关键例句啊,首先就是这个当前的位置和目标位置的差啊,的一个比例,加上当前的速度和目标速度的差,然后乘以一个比例,就是一个比例微分控制。

那当然在这个过程中呢,通常来讲,我们这个目标的速度通常大部分是零啊,虽然是我们的目标速度是零,但是这个运动本身不是零,因为主要是我们的目标是会不断的变化,那所以说通常来讲。

在我们这个角色动画里面用到的这种特别物理,仿真理用的这种比例分控制,其实就是这样的一个形式啊,前面一项是目标减掉当前这个关节的旋转啊,乘以一个比例,然后第二部分是这个一个阻尼项啊。

就是当前这个旋转速度乘以一个比例,然后他们俩之和支和,那其实就是关节力矩,那我们知道算出关节力矩之后呢,我们就可以把关节力矩应用到每一个缸体上,那最后让这个角色产生运动,本来这里是一个例子啊。

就主要是给单代表了,就是我们其实这里有两个参数,一个是这个kp啊,就是stephens就是刚性,这个一这个近代就是这个刚性的参数啊,另外一个是我们的单品就是阻尼的这个参数,这两个参数实际上会对。

我们这个最终的这个动作啊,对这个这个跟踪的这个效果会有很大的影响,比如这类型是一个对比的一个视频啊,比如说最左边这一个它其实是一个,比如说我就随便设了一个比,相对来说比较合理的这样一组啊。

kp和kd steffness和单片的参数,然后我让这个角色他去track,就他去从任何一个状态开始,把这个t pose啊,t pose作为我的一个目标的一个状态,然后他去计算一组合理的这个关啊。

每个关节力力矩,然后把这个关节力矩应用到这个角色身上,可以看到大概是这样的一个效果,但如果说我这个stephen很小,因为stephens很小,它其实大概是什么效果呢,你会发现它其实很难去。

因为我总目标其实还是t boss,但是因为我stephanie不太小,所以它产生的力相对来说也很小,但它其实会带来一个不太容易去达到,我目标位置,这样一个这样一个这样一个效果。

那如果说对应的sten很大,你会发现它其实会非常非常硬啊,就是就表现的非常的一个非常僵硬,他会非常非常快的啊,从一个任何一个姿势,然后谈到我们的这样的一个t pose,这样的一个资质上。

同时整个角色写的非常硬啊,这其实是不同的这个这个stephanie印度系数啊,stephen所带来的这个效果,那另外一个问另外一个参数就是关于这个单品,关于阻尼项啊,当然这个其实跟这个左边这个视频。

其实跟刚才是一样的,我就先调好了一组啊,相对来说比较合理的,这样的一个stiffness和单品的这样一个参数,那如果说我这个单位很小,可以单位很小,你可以发现它会有很明显的这种震动的,这种效果。

因为就相当于这个速度,它这个啊因为本质上来说,我们这个有点像弹簧嘛,我不是正常,如果弹簧我松口的时候,它其实会产生一个震动,那是个近视也类似的,如果说我们这个进度系数比较大,但是我们这个单品比较小。

他这个角色本身,他会在这个跟踪我目标的位置过程中,它会不断的去这个超调,它会不断的去上下震荡,来产生这样的一个效果,那如果说我们对应的,如果说这个单品很大的情况下,单品很大的情况下。

你会发现它其实是还是可以正常的去,正常就跟踪一个姿势,但是呢相对来说,他会花更多的时间才能够到达那个姿势啊,这个其实感觉热爱这个视觉效果,似乎是跟我们前面那个stiffness,小的这个差不多。

但是他跟stephen小的区别在于哪呢,在于stephy小的时候,这个角色是没有办法达到那个姿势,不管我经历多长时间,可能没办法达到,因为他的这个力是不够大的,但是那个单品的情况下呢。

我总我花了很长的时间之后呢,他还是他最终会达到一个t pose的姿势,只不过他这个过程会显得比较慢啊,会显得比较比较这个绵长啊,所以这是一个单品的一个效果。

当然在我们给出了一个pd control之后呢,实际上这里边我们的控制,本质上就变成了去设计这样的一个轨迹啊,设计的我们目标位置这样的一个一个方式,因为我们测算目标位置之后呢。

我们总是可以通过pc control去算出关键力矩,gl是其中一个决策去产生动作,然后对于全身动作来说,前面制止其实是一个关节,我们对一个关节我们可以给出一个轨迹,给出一个目标的轨迹,在每一时刻。

我从这个目标轨迹里拿出一个状态来,然后把这个状态作为我们的目标状态,然后利用这个pd control去算啊,算这个关键例举,那如果是全身的话,比如说我们正常一个人,那我们其实可能身上有十几个关节。

或20几个关节,那么每一个关节,其实都有对应的这样一个目标轨迹,那这个美对应那个空标轨迹,我可以对每个关节要根据对应的目标轨迹,就算出当前时刻我该加多少的这个关节力矩,来驱动这个角色产生动作。

只是一个这一个这个所谓的trickrol,就是这个跟踪控制实验,通常来讲是这样的一个结构,但这跟跟踪控制来说呢,实际上最关键的部分,就是说我该如何去设计一系列这样的轨迹。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

能够让这个角色产生我们想要的动作,那这个其实我们之前在一个在第一节课里,我们其实已经放过这个视频了,这其实是很老的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

95年的一个工作,就是说我可以通过手工设计啊,对每一个动作专门做一个手工设计,让这个角色能够用这个对应的跟踪控制,然后计算器关节列举,让这个角色能够产生这样的动作,那当然我们其实也提到了。

实际上手工设计这件事情是非常麻烦的,特别是对于一个控制来说,因为本质上来说我们施加的控制,我们在这里给画了一个轨迹,虽然说我们目标是,让这个角色能够生成这样的轨迹,能够产生这样的动作,但是因为什么呢。

因为我们的这个pd control本身,它会有这样的一个所谓的steady state,就是稳态误差这样的一个问题,一方面是稳态误差,另外我们另外一方面,当我们用pd控制去跟踪某一个轨迹的时候呢。

我们会发现我们生成这个动作,跟我们目标轨迹大概会差一点点相位,就是比如说这个是我的目标,这个人这个手已经抬起来了,但我这个角色我我我其实还是可能会延迟,大概零点几秒才能把手抬起来。

就是因为这两个控制之间它会有多少有一点点,这个有一个相面的偏差,所以所有的这一切都会导致什么问题呢,就是说比如说我这里设计了一个唉,后宫翻的动作,感觉天看着挺不错的。

但是一旦我用运动这个pd控制去跟踪这个轨迹,他所称的轨,他所成的动作,多半来说他是没办法把这个这个后翻做完的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

那比如说甚至另外。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如果说我们直接用这个音这个动捕数据,那就手工设计很忙,那我们就动补一下吧,但动捕数据其实也是一样的问题,就是说如果说我们直接用pd控制。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

去跟踪一个动捕数据,那你也会发现它其实跟踪的效果是非常差的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

比如说这个角色大体上来说还是在做那个动作,但是呢因为本质上这是一个欠驱动系统,这个如果说我的跟踪稍微有一点点偏差。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

那会到处造造,造成我后面的跟踪无法去准确的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

无法很容易的去修复我们前面这个偏差,因为主要还本质上还是一个欠驱动的问题。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

就是主要是因为如果说比如说我的这个知心啊,偏离我的目标。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我其实没有任何一个办法能够,直接去控制我的知心,把他给拉回来,因为这是一个欠驱动的问题。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

当然前面有提到了,就是我们pd控制,我没说pd控制时间,它是一个反馈控制,为什么呢,因为我们是根据当前角色,因为我们pd控制那个公式嘛,它是根据目标的位置减掉当前的位置。

然后成为一个比例系数得到的这个例句,所以想想诶,这应该是一个反馈控制,但是对于我们这个走路啊,比如像这种内容来说,实际上它这对于这个对于这样一个问目标来说。

它反而是一个啊这个这个fit forward是前向控制,为什么呢,因为反馈部这部分就是反馈控制,时间是对关节本身的力矩,这部分是反馈,但是呢因为我们跟踪的目标这个力呃,这个这个状态。

我们目标状态实际上是从一个轨迹上面,按照时间去拿下来的,那这个我的目标的位置,实际上是跟我的当前的角色的状态,是没有关系的,那这种从这个角度讲呢,其实是一个是一个fforward control。

就是开环控制或者是一个前向控制,呃,这其实是我们讲反馈和这个前向,其实是在我们不同的尺度之下,它其实是这个嗯所指的这个所对应的,这个这个这个这个类型,是这个或者这个啊分类是不一样的,但是前面我们提到了。

实际上为什么这个绝对会摔倒,因为本质上来说是一个欠驱动系统,或者说我们只用关节力矩去控制它的时候,这个我们是没办法控制一些全局的,比如说这个至今的位置或者关节,关节关节在朝向这些全局的信息。

这个在进本质上来说是什么呢,本质上也是因为我们在去施加关键例句的时候,我们总是把其中一个例句加在这个child的关节,然后把一个反向的例句加在这个power的关节,所以总的来说我们所有关节上。

在所有这个这个这个缸体,它所见到的这个力矩的总和其实是零,那这个其实这个总和是零,这件事情的事情就是带来一些效果,就是说我全身整体的这样的一个比如知心啊,或者就是整体这个角色的朝向和位置。

是没有办法做改变的,因为我们整体的这样一个例举例列举的和是零,所以说实际上如果说我们想要最直观的去控制,这样的一个这个整体的朝向,或者整体的这样一个位置,这样一个信息,我们确实是可以加一些额外的力啊。

就所谓的这个root false我们的根啊,根关节的力矩或者力啊,就是它其实跟我们这个普通的关节力矩,不同的地点,在于哪儿呢,就是说我们可以同样的用pd control,比如说我想要我的这个角色。

他的运动过程中,它的根节点始终满足某一个轨迹,那我同样可以从这个轨迹上拿出一个目标点,然后跟跟节点当前的位置做一个pd control,然后算出线的力来说加来进行施加,但是这个力呢对于根节点力来说。

因为根节点它是一个比较特殊的节点,它只有一个子节点,就是根关节,它只有一个子关节,它没有没有没有腹关节,所以实际上在我施加力的时候,相当于什么呢,相当于是我对整个这样一个角色,我加了一个境外力。

境外的意思就是什么,就是这个外力没有失利者,就是不知道什么东西,什么东西加了一个力,这个力在真实世界里是不存在的,他只是在虚拟过程中,虚拟的世界里我们是可以加这个力的,那它的效果就是什么。

它会它会帮助这个根节点,比如帮助这个角色来保持平衡,但是呢它会带来一些额外的效果,就是说你这个力因为没有真正的失利者,它会让这个角色看起来,好像是一个提线木偶一样。

因为本质上提线木偶你其实是人这个表演者,他通过一个一个线来拽了这个木偶移动,也是可以很明显的看出来这个线的这个效果,那这里全是一样,如果说我们在跟你俩加一个力,我们确实可以帮助这个角色保持平衡啊。

所以说我们去跟踪一个运运动轨迹啊,他那个也可以完成一个比较好的一个动作,但是呢通常来讲人你是可以很容易判断出哎呀,这个动作看起来有点不自然,好像被什么拽着一样啊,所以说通常来讲这个东西。

这个方法我们可以叫什么叫hello god,上帝之手,有知音,是一个一个一个一个虚拟的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

一个不存在的一个人在这个阶段施加一个力,那这个时间我们其实第一集我们之前也提到了,就说这种方法,就比如我直接在根节点上加一个力。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

因为比如我可以用pd控制pd control来加这个力。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

那这个其实对应的是一个所谓的fisical,plausible,是不是不是物理准确的,而是物理,可接受的啊,就是这么一种动画,就我们之前看到的一些,比如说物理仿真里边呢就是使用了物理仿真。

大量使用物理仿真的这些游戏啊,比如像这个party animal啊。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

还有这个像这个total accurate啊,bottle simulator,这个其实也是一感觉,就是一些这个效果还是蛮有意思的一些游戏,那他们其实主要仿制这个过程。

都是在这个root上多少会有些控制,那这样可以保证这个角色总体来说是可控的啊,当然是你可以看到明显这个角色,你感觉他运动过程中好像是被谁拽着腰上,有人有人拽着它,让它往前移动。

但本质上来说就是因为我加了一个外力。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

那这个外力时间是没有任何失利者的,它会带来一些物理上的一个。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

感觉上的这样一个一个一个问题,但是我们其实下节课我们会讲到一些技术,这些技术就是我们在没有这些外力的情况下,我们该如何去让这个角色来做出这样的动作,那当然这些最简单。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这种仿真其实也有一些其他的作用,就是最简单的,比如rag doll啊,我们可以可以让这个角色摔倒,但是我可以让他这个这个在仿真的状态下摔倒,那另外那些其实我们也是可以。

比如说我们可以跟这个跟这个普通的啊。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这种居关键帧的技术进行混合啊,其实这也是很老的一些一些一些工作,而且实际上在我们其实很多游戏里面,也很常见了,就比如说像这种我这个出现想做一个拳击,一个击倒的这样一个动作。

那实际上我们可以有一部分是仿真出来,一部分是这个关键帧,关键帧的部分,然后呢我们在这两个之间呢做一个有机的根据,比如说根据我当前的状态进行一个混合,比如像这个状态,就是这个角色被i t的时候。

我切换了一个仿真,一个rag doll仿真,然后我就track一个摔倒的这样一个,轨迹的动作,它会生成一个物理合理的这样一个,一个一个一个仿真的一个动作,那这个仿真动作呢我再去跟一一段关键帧。

比如说站起来啊,比如说前面这种这种这种击打击打,我就把这两个动作进行进行混合,用一个用一个时间参数去控制它,那其实会产生一个就是,同时又有一些物理仿真的反馈,然后又有一些这种可控的这种这种角色的。

这种这个啊阅读学动画的这样的一个效果啊,这其实也是一类另外一种这种所谓的混合的,这个仿真动画的这样的一个一个一个效果。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

所以简单回顾一下,我们今天其实讲的还是比较简单的,主要是我们回顾了一下我们这个物理仿真啊,特别是刚体仿真里的一些基本的,我们的这个公式,我们的运动学,运动学的方程,然后另外呢其实也是稍微讲了一下。

我们在这个对这个角色啊,进行这个控制的过程中,我们可以通过比如说通过pc control比例微分控制啊,去计算相应的关节力矩,然后这个关节力矩啊,其实是如何去加在我们这个角色身上,钢铁啊。

角色的每个钢铁之上,然后产生这样的动作,那当然我们也特别强调是对于一个人形啊,或者一般的这个会动的,除了机械臂之外的所有的这些动这个角色啊,通常来讲它是一个欠驱动的系统,那欠驱动系统来说,我们要不。

或者我们加一些这种这种没有失利者的,这种这种root force,它可以帮助我们去让他去这个帮助这个角色,能够跟踪一个动作,产生一个动作,那当然缺点就是效果会差一点,那另外就是说我们该如何去控制。

我们全身的这样一个力,能够让我们不再额外的外力之下,能够保持平衡,能够做出动作,但这其实是我们下接下来会需要研究的内容。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

ok,那以上就是我们今天主要的这个需要讨论,这个话题,那我们今天的课就到这里。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值