【GAMES101】Lecture 21 动画

本文探讨了关键帧动画的关键概念,物理仿真中的质点弹簧系统,以及运动学中的正逆运动学在游戏设计中的应用,包括Rigging在角色动画中的作用。通过实例解析了如何利用这些技术来模拟物理效果和创建动态角色行为。
摘要由CSDN通过智能技术生成

目录

关键帧(Keyframe animation)

物理仿真(Physical simulation)

质点弹簧系统

粒子系统

运动学(Kinematics)

正运动学(Forward Kinematics)

逆运动学(Inverse Kinematics)

Rigging


关键帧(Keyframe animation)

我们知道动画是由一帧一帧的图像连续播放形成,一般电影是一秒放24帧,也就是24fps,然后一般的视频是30fps的,虚拟现实要求达到90fps,那么关键帧就是指动画序列中的重要帧或关键时刻,用于定义动画中物体的位置、姿态、形状等

关键帧之间的帧称为"间隔帧"或"过渡帧",它们是通过插值方法补充关键帧之间的动画过渡效果,当然不是简单的线性插值,像我们之前的贝塞尔曲线,估计也有点关系

物理仿真(Physical simulation)

质点弹簧系统

假设有这么一个理想化的弹簧系统牵着两个质点,这个弹簧没有原长度,那么根据这个胡克定律,这个系统产生的弹力就等于两个质点的位移差乘以劲度系数,当然a和b受到的弹力大小相等方向相反

那实际上弹簧是有原长的,那就需要将拉神量减去弹簧的原本长度,同时乘以一个单位方向向量

用这个x来表示位移的话,那么\dot{x}就表示x的一阶导数就是速度,\ddot{x}表示二阶导数就是加速度

但是刚刚的质点弹簧系统还有一点问题,就是这个系统不会停下来,这个时候就需要引入摩擦力,考虑到要让它停下来那么它速度越大我这个摩擦力应该越大,摩擦力大小就等于质点速度再乘以一个抑制系数,方向和速度方向相反

但是还有一点问题,就是就是这两个质点只有在弹簧的方向上有速度才需要有这个摩擦力,如果质点在弹簧的垂直方向上有速度就不应该有这个摩擦力,因此刚刚单纯的乘以质点的速度就需要换成速度在弹簧方向上的投影

这样一个比较好的质点弹簧系统就好了,我们可以用它来组成其他的东西,比如布料,但是如果我从这个斜对角线的方向上去拉扯这个布料,这个结构不会产生弹力来抵抗我这个拉扯,因为我没有改变这个弹簧的拉伸,那这就不对

所以就在这个结构的对角线上加上弹簧,这样在对角线方向上的拉扯就会产生弹力来抵抗,但是这个结构依然没有办法抵抗水平和垂直方向的折叠,这种折叠同样不会改变目前结构的弹簧拉伸量

解决办法就是在间隔一个质点之间加上弹簧,这样当发生水平或者垂直方向上的折叠时,新加的弹簧会被压缩产生弹力来抵抗折叠

粒子系统

粒子系统本质上是想定义个体和群体的运动行为,那怎么做呢,这节课先简单说一下,对于动画里面的每一帧,根据需要选择创建新的粒子,然后计算每个粒子受到的力,更新每个粒子的速度和位置,如果有必要选择销毁某些粒子,最后进行渲染

粒子系统作用力广泛存在于吸引力和排斥力、重力、电磁力…、弹簧、推进力…阻尼力、摩擦力、空气阻力、粘度…碰撞、墙壁、容器、固定物体…、动态物体、角色身体部位等等,例如粒子系统应用于鸟群,对于一只鸟而言,它会有向鸟群靠近的这个吸引力,但是同时会有和其他鸟保持一定距离的排斥力,并且它飞行的方向是和鸟群的飞行方向一致

运动学(Kinematics)

正运动学(Forward Kinematics)

比如说我们要做一个骨架的运动,如何保证这个骨架它在运动的过程中骨架的各个部分之间的连接关系和几何关系能够保持,这就是运动学的内容

把这个关节的连接类型分成三种,一个是Pin,只能在某个平面上做旋转,一个是Ball,可以往各个方向转,还有一个是移动关节,就是可以伸缩的

正运动学就是每个关节旋转多少,然后找这个移动的位置

逆运动学(Inverse Kinematics)

逆运动学就是我想要移动到某个位置,我怎么旋转每个关节才能实现,这个就很难

这个问题有可能是无解的,也有可能是多解的,那一般怎么做的呢?先有一个初始的位置,然后定义这个误差的度量(比如目标和当前位置距离的平方和),计算误差的梯度,使用梯度下降法求解

Rigging

所谓rigging就是操作这个人物如何运动,像这个王者荣耀里面元歌操纵傀儡那样

对应的就会有这个操作点,也就是关键点,那么在关键帧之间的过渡帧就可以通过这些关键点的插值来实现

因此我们可以通过动作捕捉在真人上检测关键点的移动来反应到动画人物上的关键点移动

在动画制作过程中,动画人物建模完成上纹理后就通过rigging产生动作后再渲染

在这部分的课程中,我们将专注于使用光线追踪来渲染图像。在光线追踪中 最重要的操作之一就是找到光线与物体的交点。一旦找到光线与物体的交点,就 可以执行着色并返回像素颜色。在这次作业中,我们需要实现两个部分:光线的 生成和光线与三角的相交。本次代码框架的工作流程为: 1. 从 main 函数开始。我们定义场景的参数,添加物体(球体或三角形)到场景 中,并设置其材质,然后将光源添加到场景中。 2. 调用 Render(scene) 函数。在遍历所有像素的循环里,生成对应的光线并将 返回的颜色保存在帧缓冲区(framebuffer)中。在渲染过程结束后,帧缓冲 区中的信息将被保存为图像。 3. 在生成像素对应的光线后,我们调用 CastRay 函数,该函数调用 trace 来 查询光线与场景中最近的对象的交点。 4. 然后,我们在此交点执行着色。我们设置了三种不同的着色情况,并且已经 为你提供了代码。 你需要修改的函数是: • Renderer.cpp 中的 Render():这里你需要为每个像素生成一条对应的光 线,然后调用函数 castRay() 来得到颜色,最后将颜色存储在帧缓冲区的相 应像素中。 • Triangle.hpp 中的 rayTriangleIntersect(): v0, v1, v2 是三角形的三个 顶点, orig 是光线的起点, dir 是光线单位化的方向向量。 tnear, u, v 是你需 要使用我们课上推导的 Moller-Trumbore 算法来更新的参数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MaolinYe(叶茂林)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值