制作简单的2D物理引擎(一)——动力学基础
一切的基础
点
在二维平面中,点$P$就是坐标$(x,y)$,点集就是一系列坐标的集合$\{P_1,P_2,...,P_n\}$,不过这个集合是有序的(顺时针)。
向量
加减运算
$$\vec{P}\pm\vec{Q}=(P_x\pm Q_x,P_y\pm Q_y)$$
模
$$\vert\vec{P}\vert=\sqrt{P_x^2+P_y^2}$$
单位向量
$$\vec{e}=\frac{\vec{P}}{\vert\vec{P}\vert}$$
角度
$$\alpha=arctan(\frac{y}{x})$$
旋转
$$
\left[\begin{array}{c}
x'\\
y'
\end{array}\right]=\left[\begin{array}{cc}
cos(\alpha) & -sin(\alpha)\\
sin(\alpha) & cos(\alpha)
\end{array}\right]\left[\begin{array}{c}
x\\
y
\end{array}\right]
$$
点积
主要用来判断角度关系。
$$\vec{P}\cdot\vec{Q}=(P_{x}+Q_{x},P_{y}+Q_{y})$$
叉积
主要用来求面积。
$$
\vec{P}\times\vec{Q}=\left|\begin{array}{ccc}
\boldsymbol{\vec{i}} & \boldsymbol{\vec{j}} & \vec{\boldsymbol{k}}\\
P_{x} & P_{y} & P_{z}\\
Q_{x} & Q_{y} & Q_{z}
\end{array}\right|
$$
物体的表示
我们只实现一类物体——凸几何体。
几何属性
顶点集
凸几何体固有的几何外形——$N$个顶点,所以只需要储存这些顶点即可。
有人问:物体运动后,位置改变了怎么办?一般而言,要对原始顶点集做矩阵变换,才能得到最终位置。
轴向量
另外,为了便于计算,还需要储存一些向量——几何体每条边的单位向量。
面积
由已知的顶点集可以确定一个几何体,那如何求其面积?
假设由原点$O$和任意两个相邻顶点$P$、$Q$组成三角形,那么这些所有三角形加起来就是几何形的面积。
现在就是求$\triangle OPQ$的面积了。由叉乘的定义,两向量叉乘的结果的模就是其相应平行四边形的面积。
故有$2S=(Q_x-P_x)\times(Q_y+P_y)$。
重心
在这里,物体的密度$\rho$是均匀的。
设顶点数为$n$,顶点$P_1\sim P_n$,故
$$\vec{P_G}=\frac{1}{n}\sum_{i=1}^{n}\vec{P_i}$$
物理属性
质量、速度、位置、受力、密度、角偏、角加速度、扭矩、摩擦系数等。
外观属性
美观起见,给物体添加颜色。
物体的运动
力学令人着迷,用计算机来模拟力学就不那么容易了,万事开头难,做仿真还是要从理论学起。
力学无非就是加速度、碰撞、摩擦等内容。不过对物体(刚体)来说,它的运动不是平动就是转动。
平动
平动部分是较为简单的,最经典的公式:
- 力$F=ma$
- 速度$v=at$
- 位移$s=vt$
无须多言。
转动
刚体的转动可能令人感觉陌生,其实类比平动,大致相同。
平动中,力$F$产生加速度$a$,进而影响速度$v$,进而影响位移$s$。
转动中,力矩$M$产生角加速度$\alpha$,进而影响角速度$\omega$,进而影响角位移$\theta$。
力矩$M=r\times F$,$r$是力臂,$F$是外力。
但是,力矩$M$产生角加速度$\alpha$,公式是$M=J\alpha$,这里就比平动复杂了。$J$是转动惯量,也能用$I$表示,类比于质量$m$。
转动惯量
求几何体$\{P_1,P_2…P_n\}$的转动惯量。
根据公式:
$$I=\frac{{m}}{6}\frac{\sum_{i=1}^{n}\left\Vert \vec{P_{i+1}}\times\vec{P_{i}}\right\Vert (\vec{P_{i+1}^2}+\vec{P_{i+1}}\cdot \vec{P_{i}}+\vec{P_i^2})}{\sum_{i=1}^{n}\left\Vert \vec{P_{i+1}}\times\vec{P_{i}}\right\Vert }$$
力的交互
重力
物体在重力场中受到一个恒定方向、恒定大小的力$g$,将它算入总受力。
碰撞
两个物体间产生碰撞,这是物理引擎最核心的部分之一。
一般来说,要解决这几个问题:
- 如何检测到碰撞的产生?
- 如何确定碰撞点及方向?
- 如何做精度修正?
- 如何解决“子弹”问题?
解决了上述几个问题后,我们就可以求得发生碰撞的两个物体的总受力和力矩和,从而解析它们将要产生的平动和转动。
涉及碰撞的内容很多,在后面会讲到。
摩擦
物体受空气阻力和地面摩擦力影响。地面摩擦力对物体产生的影响算入力矩和。
总结
实际上,一个涉及力学的物理引擎要做的最主要的事就是:
求物体所受力和力矩,从而计算它将要发生的平动和转动。
但如何求得力和力矩?这便是一个很复杂的问题了。像重力可以直接影响物体所受力,摩擦可以直接影响物体所受力矩,这些都很简单。较为复杂的就是两个物体间的碰撞了,在这里,物体引擎有一半以上的代码是用来计算碰撞的。
制作简单的2D物理引擎(一)——动力学基础的更多相关文章
- 制作简单的2D物理引擎(零)
最近发现了Github上的开源物理引擎项目Matter.js,对它很感兴趣,发现源码并不算长,算上注释大约1万行左右,值得剖析一番.Matter.js实现一个最小化的2D物理引擎,性能不错,故打算用C ...
- HTML5之2D物理引擎 Box2D for javascript Games 系列 第一部分
我要的是能在H5页面上跑的javascript版的Box2D啊!!! 最近想学习Javascript版本的Box2D JS物理引擎,无奈搜了半天也没找到相对比较系统的资料 官方网站也只是简单的介绍,A ...
- Matter.js – 你不能错过的 2D 物理引擎
Matter.js 是一个 JavaScript 2D 刚体物理引擎的网页.Matter.Engine 模块包含用于创建和操作引擎的方法.这个引擎是一个管理更新和渲染世界的模拟控制器. Matter. ...
- HTML5之2D物理引擎 Box2D for javascript Games 系列 翻外篇--如何结合createJS应用box2d.js
太久没有更新了,新年回来工作,突然有收到网友的邮件提问,居然还有人在关注,惭愧,找了下电脑上还有一点儿存着,顺便先发这一个番外篇吧,好歹可以看到真实的效果,等我考完英语,一定会更新下一章," ...
- HTML5之2D物理引擎 Box2D for javascript Games 系列 第二部分
这是系列第二部分,之前部分在本博客中找 源码demo存放在https://github.com/willian12345/Box2D-for-Javascript-Games 向世界添加刚体 刚体(B ...
- HTML5之2D物理引擎 Box2D for javascript Games 系列 第三部分之创建图腾破坏者的关卡
创建图腾破坏者的关卡 现在你有能力创建你的第一个游戏原型,我们将从创建图腾破坏者的级别开始. 为了展示我们所做事情的真实性,我们将流行的Flash游戏图腾破坏者的一关作为 我们模仿的对象.请看下面的截 ...
- iOS中的物理引擎
目前知名的2D物理引擎有 Box2d,和Chipmunk,这些是跨平台的.但苹果本身也封装了一个物理引擎, UIDynamic是从iOS 7开始引入的一种新技术,隶属于UIKit框架.这可以让开发人员 ...
- Egret中使用P2物理引擎
游戏中的对象按照物理规律移动,体现重力.引力.反作用力.加速度等物体特性,实现自由落体.摇摆运动.抛物线运动,以及物理碰撞现象的模拟.用于模拟物理碰撞.物理运动的引擎称为物理引擎. 来自瑞典斯德哥尔摩 ...
- 转:Bullet物理引擎不完全指南(Bullet Physics Engine not complete Guide)
write by 九天雁翎(JTianLing) -- blog.csdn.net/vagrxie 讨论新闻组及文件 前言 Bullet据称为游戏世界占有率为第三的物理引擎,也是前几大引擎目前唯一能够 ...
随机推荐
- 【转载】Log4j详细使用教程
本文由林炳文Evankaka创作,出处http://blog.csdn.net/evankaka 日志是应用软件中不可缺少的部分,Apache的开源项目Log4j是一个功能强大的日志组件,提供方便的日 ...
- 使用js倒计时还有几天及计时过了几天
公司主营业务是体育赛事为主的:尤其是足球赛事.现正值2016法国欧洲杯:之前忙于做欧洲杯专题没时间总结.现分享一个工作中需求带来的经历. 需求是:从现在开始倒计时欧洲杯还有多久开赛:当开赛之后开始计算 ...
- 怎样获取Windows平台下SQL server性能计数器值
转载自工作伙伴Garrett, Helen "SQL Server Performance Counter captures" Capturing Windows Performa ...
- 题目描述: k一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
时间限制:1秒 空间限制:32768k 斐波那契数列指的是这样一个数列: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,9 ...
- Volley全方位解析,带你从源码的角度彻底理解
Volley 是 Google 推出的轻量级 Android 异步网络请求框架和图片加载框架.在 Google I/O 2013 大会上发布.其适用场景是数据量小,通信频繁的网络操作. 主要特点: ( ...
- java反射类内容获取
private void DtoReflect(Object obj, MqDto mqDto) throws Exception { Map map = getMap(mqDto); if(obj= ...
- 20160626001 O2O Website
1. http://sidapai.baijia.baidu.com/ 百度百家 2. http://www.huxiu.com/ 虎嗅网 3. http://i.wshang.com ...
- phpMyAdmin的配置
好久没写东西了,上来记录一下今天学的一点小东西吧~ 之前搞php开发的时候,一直用的是SQLyog来操作mysql数据库的,但是今天发现sqlyog功能不是很完善,主要是我想修改数据库名,但是sqly ...
- zigbee学习之路(十三):基于协议栈的Usart 实验
一.前言 这次实验我们来学习基于zigbee的串口通信实验,揭开zigbee神秘的面纱,让大家可以用zigbee协议编制属于自己的程序,这次实验只是串口发送数据,并没有进行无线的数据传输,为的是使大家 ...
- OOP过度抽象
OI的时候,解决问题是第一位的,别老想着可维护性.能过就行啦,又不是工程. 下面是两篇相关的文章 来自酷壳 编程真难啊 2009年9月3日 陈皓 上周,在Sun的Java论坛上出现了一个这样的帖子,L ...