【GAMES103学习笔记】刚体(Rigid Body)

  • 0 什么是刚体及刚体模拟
  • 1 平移
    • 1.1 平移运动
      • 1.1.1 速度
      • 1.1.2 位置
    • 1.2 时间积分
    • 1.3 半隐式欧拉
    • 1.4 力的分类
  • 2. 旋转
    • 2.1 采用什么状态参数描述旋转
    • 2.2 四元数
      • 2.2.1 什么是四元数
      • 2.2.2 四元数与旋转
    • 2.3 旋转运动
      • 2.3.1 角速度
        • 2.3.1.1 力矩
        • 2.3.1.2 惯量
        • 2.3.1.3 小结
      • 2.3.2 四元数
  • 3 刚体运动小结

小破站链接:https://www.bilibili.com/video/BV12Q4y1S73g?p=3
课程主页:http://games-cn.org/games103/

0 什么是刚体及刚体模拟

我们生活的空间中,存在着非常多的不会轻易变形的物体,在计算机图形学中,被称为刚体(Rigid Body)。

刚体模拟(Rigid Body Simulation)的核心目标,就是给定了物体初始状态后,根据时间的变化,求得物体的新状态。

我们这里定义的刚体物体不会形变,所以刚体运动(Rigid Body Motion)只允许做平移旋转运动。

1 平移

1.1 平移运动

平移运动(Translation Motion)的状态变量包含物体的速度 v \bold v v和物体的位置 x = [ x , y , z ] \bold x = [x, y, z] x=[x,y,z]。

1.1.1 速度

上图公式的第一行描述了速度如何随着时间的变化而变化。

t [ 1 ] t^{[1]} t[1]时刻的新的速度 v \bold v v等于 t [ 0 ] t^{[0]} t[0]时刻的速度 v \bold v v加上加速度。

后面这一串就是在求加速度 M − 1 ∫ t [ 0 ] t [ 1 ] f ( x ( t ) , v ( t ) , t ) d t \bold {M^{-1}} \int_{t^{[0]}}^{t^{[1]}}{f(\bold x(t), \bold v(t), t)}dt M−1∫t[0]t[1]​f(x(t),v(t),t)dt。

根据牛顿第二定律,加速度等于力除以质量。这里的计算力的写成了位置、速度还有时间的函数 f ( x ( t ) , v ( t ) , t ) f(\bold x(t), \bold v(t), t) f(x(t),v(t),t),考虑到现实世界中物体的受力比较复杂,因此写的也比较复杂。

1.1.2 位置

上图公式的第二行描述了位置如何随着时间的变化而变化。

t [ 1 ] t^{[1]} t[1]时刻新的位置 x \bold x x等于 t [ 0 ] t^{[0]} t[0]时刻的位置 x \bold x x加上速度对时间的积分。

透过上述两个公式可以看到,解刚体的模拟方程,就是在解公式中的积分;又因为都是对「时间」这个参数的积分,因此也称时间积分

1.2 时间积分

在基于物理模拟的计算机图形学中,我们会经常看到这个词。

要想在计算机中解决积分,肯定不会是使用牛顿-莱布尼茨公式求原函数来求解。

回想定积分的物理含义,他是一条曲线段被积分的上下限截断,与x轴围成的面积。

根据这个原理,当 Δ t \Delta t Δt足够小的时候,计算一个小矩形的面积,当做积分结果对积分进行估算。

我们既可以采用积分的下限去估算面积,也可以采用积分的上限去估算面积,甚至是上限和下限的中点。

这就产生了计算机中解时间积分的三个常用的方法:显示欧拉(Explicit Euler)、隐式欧拉(Implicit Euler)和中点法(Mid-point)。

这里面最准确的是中点法。

1.3 半隐式欧拉

回到平移的积分公式,这里面有两个积分“嗷嗷待解”。这里我们采用显示欧拉与隐式欧拉结合的方式求解。

求解速度的时候采用显示欧拉,使用积分下限;求解位置的时候用隐式欧拉,使用积分上限。

在有些文献中,称这个方法为半隐式欧拉(Semi-implicit Euler)。他有另一个比较有趣的名字,叫做Leapfrog Integration。

有了这样的迭代的更新方法,我们就可以在计算机中进行模拟了。

1.4 力的分类


最后一条的意思是模拟Drag Force可以对速度做一个衰减来简单的实现。乘一个 α \alpha α,例如 α = 0.99 \alpha = 0.99 α=0.99。

2. 旋转

2.1 采用什么状态参数描述旋转

不用旋转矩阵,太复杂且有多余的信息。

不用欧拉角,有万向节死锁问题(这个up主讲的不错,和别人讲的不一样)。

采用四元数(Quaternion)。

2.2 四元数

2.2.1 什么是四元数

四元数(Quaternion)的发明是想用复数系统来描述三维空间中的一个点。之所以会有这个想法是因为3D空间中的一个点如果仅仅用xyz坐标表示,是无法定义除法运算的。

发明了四元数后就可以定义了,四元数之间的乘法和除法可以用下图的乘法表来描述。

一个四元数 q q q由两部分组成,实数部分 s s s和虚数部分 v v v, q = [ s v ] q = [s \space \bold v] q=[s v]。 v v v是一个3D向量,代表 i j k ijk ijk。四元数与四元数之间的运算如下图。

2.2.2 四元数与旋转

一个物体绕一个轴 v v v旋转 θ \theta θ度,写成四元数的形式如下图所示。

我们给四元数添加了一个约束 ∥ q ∥ = 1 \|q\| = 1 ∥q∥=1,即 v v v的模长为1。因为实数部分 s = c o s θ 2 s = cos\frac \theta 2 s=cos2θ​,所以导出 ∥ v ∥ 2 = s i n 2 θ 2 \|v\|^2 = sin^2 \frac \theta 2 ∥v∥2=sin22θ​。

把一个四元数转换成矩阵,记住公式即可。下图中 x y z xyz xyz是四元数的三个虚部。

为什么只用一个轴和一个角度表示成的四元数就表示了三维空间中的所有旋转呢?欧拉角可是有三个数啊!

仔细想想,当我们只观察旋转的起始状态和终止状态时,似乎真的只让某个物体绕着某个轴旋转一下即可。

2.3 旋转运动

接下来的我们要用四元数来模拟旋转运动(Rotation Motion)。旋转运动的状态变量包含角速度 ω \omega ω和描述旋转的四元数 q \bold q q。

旋转运动的公式如下:

ω [ 1 ] = ω [ 0 ] + Δ t ( I [ 0 ] ) − 1 τ [ 0 ] q [ 1 ] = q [ 0 ] + [ 0 Δ t 2 ω [ 1 ] ] × q [ 0 ] \begin{aligned} \omega^{[1]} &= \omega^{[0]} + \Delta t (\bold I^{[0]})^{-1} \tau^{[0]} \\ \bold q^{[1]} &= \bold q^{[0]} + [0 \space \frac {\Delta t} {2} \omega^{[1]}] \times \bold q^{[0]} \end{aligned} ω[1]q[1]​=ω[0]+Δt(I[0])−1τ[0]=q[0]+[0 2Δt​ω[1]]×q[0]​

这里面有不认识的 I \bold I I、 τ \tau τ,我们接下来逐步讲解。

2.3.1 角速度

除了知道如何用四元数表示旋转,我们还需要知道单位时间旋转的速率,即旋转对于时间的导数,用于求解当力作用于物体上时,物体将如何旋转。

这里我们用一个3D向量 ω \omega ω来表示。 ω \omega ω的方向表示旋转轴的方向, ω \omega ω的大小表示旋转的速率。

这里在更新角速度的时候,不能简单的使用牛顿第二定律了。对于旋转运动而言,我们需要知道力矩(Torque)和惯量(Inertia)。

2.3.1.1 力矩

计算力矩使用如下公式。

假设物体的质心为局部空间原点,物体上的一个受力点 r i \bold r_i ri​受力 f i \bold f_i fi​后,变成了 R r i \bold {Rr_i} Rri​( R \bold R R为旋转矩阵)。那么该点所受的力矩为 R r i \bold R \bold {r_i} Rri​与 f i \bold f_i fi​的叉积。

τ i = ( R r i ) × f i \bold {\tau_i = (Rr_i) \times f_i} τi​=(Rri​)×fi​

接下来对所有顶点求和,得到物体整体的力矩。

τ = ∑ τ i \bold {\tau = \sum \tau_i} τ=∑τi​

2.3.1.2 惯量

惯量的计算方法,记公式吧。

首先计算一个reference状态下的Inertia矩阵 I r e f \bold {I_{ref}} Iref​。

I r e f = ∑ m i ( r i T r i 1 − r i r i T ) \bold {I_{ref} = \sum m_i(r_i^Tr_i1 - r_ir_i^T)} Iref​=∑mi​(riT​ri​1−ri​riT​)

为了避免和 I \bold I I搞混,这里粗体的 1 \bold 1 1就是个单位矩阵。

上述求出的 I r e f \bold {I_{ref}} Iref​是一个3x3的矩阵。

然后使用物体的旋转矩阵,求得物体旋转后的Inertia。

I = R I r e f R T \bold {I = RI_{ref}R^T} I=RIref​RT

2.3.1.3 小结

有了 τ \bold \tau τ和 I \bold I I,就能看懂旋转运动的第一条公式了。

ω [ 1 ] = ω [ 0 ] + Δ t ( I [ 0 ] ) − 1 τ [ 0 ] \begin{aligned} \omega^{[1]} &= \omega^{[0]} + \Delta t (\bold I^{[0]})^{-1} \tau^{[0]} \\ \end{aligned} ω[1]​=ω[0]+Δt(I[0])−1τ[0]​

2.3.2 四元数

第二条公式比较简单,就是更新表示物体旋转的四元数的数值。

q [ 1 ] = q [ 0 ] + [ 0 Δ t 2 ω [ 1 ] ] × q [ 0 ] \begin{aligned} \bold q^{[1]} &= \bold q^{[0]} + [0 \space \frac {\Delta t} {2} \omega^{[1]}] \times \bold q^{[0]} \end{aligned} q[1]​=q[0]+[0 2Δt​ω[1]]×q[0]​

这里需要注意, [ 0 Δ t 2 ω [ 1 ] ] [0 \space \frac {\Delta t} {2} \omega^{[1]}] [0 2Δt​ω[1]]和 q [ 0 ] \bold q^{[0]} q[0]中间的乘号不是向量叉乘,是四元数的乘法,定义在四元数的乘法表中。

[ 0 Δ t 2 ω [ 1 ] ] [0 \space \frac {\Delta t} {2} \omega^{[1]}] [0 2Δt​ω[1]]的实数部分是0,后面是由角速度 ω \omega ω计算得到的虚数部分。

最后,最好再将 q [ 1 ] \bold {q^{[1]}} q[1]归一化一下。

3 刚体运动小结


状态变量有四个,速度 v \bold v v,位置 x \bold x x,角速度 w \bold w w,旋转四元数 q \bold q q。

还有一些物理的中间变量,质量 M \bold M M,作用于每个质点上的力 f i \bold f_i fi​以及合力 f \bold f f,惯量 I \bold I I,力矩 τ \bold \tau τ。

还有需要注意的就是重力不产生力矩,如果要模拟的系统没有重力以外的力,可以不用更新 w \bold w w。

【GAMES103学习笔记】刚体(Rigid Body)相关推荐

  1. 【GAMES103学习笔记】线性系统(Linear System)及其解法(Linear Sovler)

    [GAMES103学习笔记]线性系统(Linear System)及其解法(Linear Sovler) 0. 为什么要研究线性系统 1. 什么是线性系统 2. 解线性系统 2.1 直接法 2.1.1 ...

  2. 平移刚体上各点的加速度和速度_大物学习笔记(一)——刚体力学

    第一次写笔记,或多或少都会有很多的不足.疫情期间一直都是网课的学习,书本也没有带回来,经常都是在草稿本上随手推导一下公式,隔几天翻了几页,自己推导的东西就不见了.所以总想着来总结一下,把学的东西稍稍理 ...

  3. PointNet学习笔记(一)—— 论文

    PointNet学习笔记(一)-- 论文 本文记录了博主在学习<PointNet: Deep Learning on Point Sets for 3D Clasification and Se ...

  4. 08年A题数码相机定位学习笔记

    To Be Continue- 文章目录 数码相机定位学习笔记 一.摘要 二.问题分析 三.刚体变换 3.1世界坐标系→\rightarrow→相机坐标系 3.2相机坐标系→\rightarrow→图 ...

  5. 图像坐标:我想和世界坐标谈谈(A) 【计算机视觉学习笔记--双目视觉几何框架系列】

    玉米竭力用轻松具体的描述来讲述双目三维重建中的一些数学问题.希望这样的方式让大家以一个轻松的心态阅读玉米的<计算机视觉学习笔记>双目视觉数学架构系列博客.这个系列博客旨在捋顺一下已标定的双 ...

  6. box2dweb 学习笔记--sample讲解

    前言: 之前博文"台球游戏的核心算法和AI(1)" 中, 提到过想用HTML5+Box2d来编写实现一个台球游戏. 以此来对比感慨一下游戏物理引擎的巨大威力. 做为H5+box2d ...

  7. 视觉SLAM十四讲学习笔记-第三讲-相似、仿射、射影变换和eigen程序、可视化演示

    专栏系列文章如下: 视觉SLAM十四讲学习笔记-第一讲_goldqiu的博客-CSDN博客 视觉SLAM十四讲学习笔记-第二讲-初识SLAM_goldqiu的博客-CSDN博客 视觉SLAM十四讲学习 ...

  8. 视觉SLAM十四讲学习笔记-第三讲-旋转矩阵和Eigen库

    专栏系列文章如下: 视觉SLAM十四讲学习笔记-第一讲_goldqiu的博客-CSDN博客 视觉SLAM十四讲学习笔记-第二讲-初识SLAM_goldqiu的博客-CSDN博客 视觉SLAM十四讲学习 ...

  9. AI学习笔记(五)坐标变换与视觉测量

    AI学习笔记之坐标变换与视觉测量 左右手坐标系即转换 左手坐标系.右手坐标系.笛卡尔坐标系 左手旋转规则.右手旋转规则 左手坐标系和右手坐标系相互转换 旋转矩阵 欧拉角与万向锁 欧拉角 万向锁 四元数 ...

最新文章

  1. 初始Java DVD项目
  2. BeeHive模块注册
  3. 1.3.2 java程序的运行机制和jvm
  4. matlab绘制蜂窝,PPT技巧:如何快速设计蜂窝表达的图形设计?
  5. SVN 回滚(撤回)提交的代码
  6. 物联网进入规模化应用时代 万物互联时代到来
  7. C++20 系列(一)- Hello C++20
  8. 计算机网络运输层习题5-17
  9. 2018年全国多校算法寒假训练营练习比赛(第一场)C. 六子冲(模拟)
  10. 除了php云和骑士还有什么_骑士CMS是什么开源程序
  11. 如何键盘锁定计算机,如何锁定电脑键盘或鼠标防止误操作
  12. chrome 打印布局_Chrome 网页打印中的宽度控制
  13. 电子计算机与多谋种,2011—2012学年度第一学期七年级上册语文期末测试AB卷(2套)(含答案)...
  14. Android封装拍照sdk,Android 短视频拍摄、拍照滤镜 第三方库SDK
  15. 《excel应用大全》(excel home 编著)--学习摘抄笔记2
  16. python使用venv环境报Python.h : No such file or direc
  17. PHP jqGrid 表格数据更新帮助代码
  18. Android离线人脸识别方案对比
  19. 软件开发知识点基础介绍
  20. RecyclerView的使用

热门文章

  1. linux桌面监控软件,Plasma桌面系统监视应用程序Plasma System Monitor介绍
  2. Java版本UCWEB-7.2安装时出现授权失败的问题
  3. Spring与XFire
  4. 如何抠图换背景?介绍两个抠图换背景的方法
  5. 汇正进销存——安装文档
  6. 【人脸检测0】视频分解图片与图片合成视频
  7. css镶嵌,CSS3 图片的镶嵌特效
  8. 2007最牛X网站收集
  9. HTML5实战之《疯狂猜价格》
  10. ES6补充-异步与等待、符号、迭代器、代理以及生成器