在现实世界中,刚体与刚体由于接触力的作用是不可能发生穿透的,但是在物理动画世界,由于我们无法直接得到刚体与刚体的接触力,并且数据模型也很难具备现实世界的刚体属性。所以我们允许模型与模型之间发生穿透,这样我们就可以计算物体与物体之间的接触力,以此来进一步算出物体下一步的运动状态。

基于穿透的物理模拟实际上是一个利用弹簧-阻尼系统来求取碰撞力的方法。

刚体运动基础

在计算机物理模拟中,对于刚体运动通常使用常微分方程来进行描述,也就是常说的ODE。经常使用的ODE有两种,一种叫做Largrangian formulation,另一种是Hamiltonian formulation。

Largrangian formulation

Largrangian formulation是对刚体的位置(r),刚体的姿态四元数(q),刚体的速度(v)与刚体的角速度(ω)进行求导,来构造ODE

Hamiltonian formulation

Hamiltonian formulation,大体上与Largrangian formulation一致,只不过用动量(P)与角动量(L)来代替速度与角速度,这样做的原因是由于动量守恒,所以可以写出更简单的方程

在解决了OED方程的形式之后,我们需要考虑,如何构造出任意时刻刚体的OED方程。在每一帧的计算中,刚体的位置与刚体的姿态,对于我们来说都是已知的,那么重点就是求刚体的合外力与合外力矩。

一个刚体所受的和外力应该是外力与它与其它刚体碰撞产生的碰撞力的和,同理合外力矩也应该是这样。

在Penalty-Based中我们将碰撞里以穿透产生的弹簧力来表示

在一个仿真循环中,通常可以分为三步

1.运行碰撞检测,求出刚体与刚体与刚体之间的接触点

2.计算穿透力

3.求解ODE,来计算下一步的刚体运动状态。

对于物体 j 来说,他受到的接触力是由于与它发生碰撞的物体 i 产生的。那么我们假设两物体间第K个接触点Pk,该点的法向量是Nk,由 i 指向 j 。这时我们考虑物体 j 所受的力,首先有穿透产生的弹簧力,还应该有弹簧回复产生的阻尼力,那么,我们就可以得到 j 所受到的穿透力。

其中

表示相对速度。

又由于力的作用是相互的,那么

同样的道理我们可以求出穿透产生的力矩

rkj表示的是在 j 的质心坐标系中Pk的位置。

这样我们就可以计算出物体与物体接触所产生的力。然而事情没有那么简单。大部分情况下,我们很难得到令我们满意的接触法向量与穿透深度。比如

又或者一个平面上的正方体盒子

再或者,当某些时候接触法线变化会出现不连续的情况,就比如第一个问题图片那样。

第一个问题出现的原因是因为在计算的时候只考虑局部,当我们从全局出发就不需要考虑这个问题。

第二个问题,可以通过多个点采样来避免。

第三个问题,有另外特定的方法去解决。

Penalty-Based Multibody Animation(1)相关推荐

  1. Android的 animation (总结)

    Android的 animation 由四种类型组成 XML 中 alpha  渐变透明度动画效果  scale  渐变尺寸伸缩动画效果  translate  画面转换位置移动动画效果  rotat ...

  2. Android画图学习总结(四)——Animation(中)

    在Android画图学习总结(四)--Animation(上)中详细介绍了Tween Animation的定义.使用,由于篇幅有限,很多中重要的方面没有说明,这篇文章一方面做个完整的总结说明,另外一方 ...

  3. Android - Animation(二)

    Android - Animation(一) 一文总结了Android中的补间动画(View Animation/Tween Animation)和帧动画(Drawable Animation/Fra ...

  4. iOS核心动画Core Animation(一)

    核心动画Core Animation(一) 一.简述 Core Animation是直接作用在CALayer上的(并非UIView上)非常强大的跨Mac OS X和iOS平台的动画处理API,Core ...

  5. transition(过渡)与animation(动画)的区别

    1.简写属性包含的属性: transition(过渡)属性: transition: property duration timing-function delay; transition-prope ...

  6. 走进绚烂多彩的属性动画-Property Animation(上篇)

    转载请注明出处(万分感谢!): http://blog.csdn.net/javazejian/article/details/52273733 出自[zejian的博客] 关联文章: 走进绚烂多彩的 ...

  7. animation(动画)

    animation(动画) 文章目录 animation(动画) 一.过渡(transition)? 1. 案例 二.动画 1.奔跑的少年 三.关键帧 四.变形平移(通过CSS来改变元素的形状或位置) ...

  8. 06_css3中的Animation(动画)

    Animation(动画) 人类具有视觉暂留的特性,人的眼睛在看到一幅画或一个物体后,在0.34秒内不会消失. 动画原理: 通过把人物的表情.动作.变化等分解后画成许多动作瞬间的画幅,利用视觉暂留的原 ...

  9. Core Animation (2)

    Keyframe Animation 关键帧动画 关键帧动画(CAKeyframeAnimation)是一种可以替代基本动画的动画(CABasicAnimation);它们都是CAPropertyAn ...

最新文章

  1. 浅谈人工智能应对数字化转型挑战的5个领域
  2. c语言通用Makefile
  3. kafka生产者、消费者消息操作命令
  4. Dialog向Activity传递数据
  5. 树莓派Python编程指南--第一章(起航--启动和运行)
  6. 内核错误Linux,ubuntu14.04更新内核出错
  7. pytorch1.7教程实验——分类器训练
  8. FastRoute - 快速请求路由
  9. m1芯片MacBook安装本地编译版matplotlib库
  10. python ray分布式_分布式框架Ray及RLlib简易理解
  11. exc导入mysql phpcms_PHP如何将EXCEL导入MYSQL,急!!!急!!哪位大师能帮帮忙啊,给个详细代码...
  12. 获取当前时间以及模拟倒计时(Java)
  13. JAVA基础编程——数据库编程
  14. 进化算法之粒子群算法介绍附代码——PSO
  15. mysql运维监控工具排名_运维监控工具
  16. extjs6 带条件查询分页
  17. 企业债和公司债的区别(表)
  18. 让洁净煤保障群众温暖过冬
  19. 小米air2se耳机只有一边有声音怎么办_双十一高性价蓝牙耳机排名,500元内真无线蓝牙耳机推荐...
  20. Maven使用Profile

热门文章

  1. 前端项目,看我在这里管理全局后台初始化的数据,就问你飒不飒?
  2. codeforces 1567 C. Carrying Conundrum
  3. qrcode的使用方法
  4. 静电场边值问题及其求解
  5. AMM和ASMM理解
  6. 虚继承是什么意思_程序猿是什么意思?程序员为什么叫程序猿?程序猿笑话段子-360常识网...
  7. 通信端口感叹号_解决通用串行总线控制器总是有感叹号的办法
  8. GBK 和 UTF8编码
  9. SDUT实验六7-6 sdut- C语言实验-矩阵转置
  10. MongoDB副本集详解与搭建