一切的基础

在二维平面中,点$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$,将它算入总受力。

碰撞

两个物体间产生碰撞,这是物理引擎最核心的部分之一。

一般来说,要解决这几个问题:

  1. 如何检测到碰撞的产生?
  2. 如何确定碰撞点及方向?
  3. 如何做精度修正?
  4. 如何解决“子弹”问题?

解决了上述几个问题后,我们就可以求得发生碰撞的两个物体的总受力和力矩和,从而解析它们将要产生的平动和转动。

涉及碰撞的内容很多,在后面会讲到。

摩擦

物体受空气阻力和地面摩擦力影响。地面摩擦力对物体产生的影响算入力矩和。

总结

实际上,一个涉及力学的物理引擎要做的最主要的事就是:

求物体所受力和力矩,从而计算它将要发生的平动和转动。

但如何求得力和力矩?这便是一个很复杂的问题了。像重力可以直接影响物体所受力,摩擦可以直接影响物体所受力矩,这些都很简单。较为复杂的就是两个物体间的碰撞了,在这里,物体引擎有一半以上的代码是用来计算碰撞的。

制作简单的2D物理引擎(一)——动力学基础的更多相关文章

  1. 制作简单的2D物理引擎(零)

    最近发现了Github上的开源物理引擎项目Matter.js,对它很感兴趣,发现源码并不算长,算上注释大约1万行左右,值得剖析一番.Matter.js实现一个最小化的2D物理引擎,性能不错,故打算用C ...

  2. HTML5之2D物理引擎 Box2D for javascript Games 系列 第一部分

    我要的是能在H5页面上跑的javascript版的Box2D啊!!! 最近想学习Javascript版本的Box2D JS物理引擎,无奈搜了半天也没找到相对比较系统的资料 官方网站也只是简单的介绍,A ...

  3. Matter.js – 你不能错过的 2D 物理引擎

    Matter.js 是一个 JavaScript 2D 刚体物理引擎的网页.Matter.Engine 模块包含用于创建和操作引擎的方法.这个引擎是一个管理更新和渲染世界的模拟控制器. Matter. ...

  4. HTML5之2D物理引擎 Box2D for javascript Games 系列 翻外篇--如何结合createJS应用box2d.js

    太久没有更新了,新年回来工作,突然有收到网友的邮件提问,居然还有人在关注,惭愧,找了下电脑上还有一点儿存着,顺便先发这一个番外篇吧,好歹可以看到真实的效果,等我考完英语,一定会更新下一章," ...

  5. HTML5之2D物理引擎 Box2D for javascript Games 系列 第二部分

    这是系列第二部分,之前部分在本博客中找 源码demo存放在https://github.com/willian12345/Box2D-for-Javascript-Games 向世界添加刚体 刚体(B ...

  6. HTML5之2D物理引擎 Box2D for javascript Games 系列 第三部分之创建图腾破坏者的关卡

    创建图腾破坏者的关卡 现在你有能力创建你的第一个游戏原型,我们将从创建图腾破坏者的级别开始. 为了展示我们所做事情的真实性,我们将流行的Flash游戏图腾破坏者的一关作为 我们模仿的对象.请看下面的截 ...

  7. iOS中的物理引擎

    目前知名的2D物理引擎有 Box2d,和Chipmunk,这些是跨平台的.但苹果本身也封装了一个物理引擎, UIDynamic是从iOS 7开始引入的一种新技术,隶属于UIKit框架.这可以让开发人员 ...

  8. Egret中使用P2物理引擎

    游戏中的对象按照物理规律移动,体现重力.引力.反作用力.加速度等物体特性,实现自由落体.摇摆运动.抛物线运动,以及物理碰撞现象的模拟.用于模拟物理碰撞.物理运动的引擎称为物理引擎. 来自瑞典斯德哥尔摩 ...

  9. 转:Bullet物理引擎不完全指南(Bullet Physics Engine not complete Guide)

    write by 九天雁翎(JTianLing) -- blog.csdn.net/vagrxie 讨论新闻组及文件 前言 Bullet据称为游戏世界占有率为第三的物理引擎,也是前几大引擎目前唯一能够 ...

随机推荐

  1. .md文件的语法

    md全称是Macdown,.md文件可以当记事本一样使用,作为编辑软件,还可以自己添加样式,图片,链接等,可以用记事本打开,也可以保持样式排版转换为html文件,语法比较简单..md除了编辑容易的优势 ...

  2. Symbol not found for architecture arm64 错误

    如果Archiectures和Valid Architectures都是对的,需要检查Other Linker Flags是否添加$(inherited),如果还不行,检查Library Search ...

  3. Python3基础 casefold 将字符串中的所有字符变成小写

    镇场诗:---大梦谁觉,水月中建博客.百千磨难,才知世事无常.---今持佛语,技术无量愿学.愿尽所学,铸一良心博客.------------------------------------------ ...

  4. 3.mvc core 文件目录详细的解释

    wwwroot 放js css image的文件夹,静态文件. favicon.ico 网站图标.上传文件的话最好在里面新建一个Upload的文件夹进行管理 Controllers 控制器, View ...

  5. JavaScript parseInt() 函数

    定义和用法 parseInt() 函数可解析一个字符串,并返回一个整数. 语法 parseInt(string, radix) 参数 描述 string 必需.要被解析的字符串. radix 可选.表 ...

  6. UVA 11464 偶数矩阵

    https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  7. Java生成随机验证码

    package com.tg.snail.core.util; import java.awt.Color; import java.awt.Font; import java.awt.Graphic ...

  8. pip和easy_install更换使用国内源

    因为论文原因,需要使用python安装一些自然语言库,但是使用pip或easy_install安装包时,总是超时(中国特色搞得事:-D),没有办法,上网查资料解决问题~~,在网上找到的方法都是说更换国 ...

  9. 《与小卡特一起学Python》 Code5 for循环

    import time for i in range(10,0,-1): print i time.sleep(1) print "Blast off!" 以上代码循环意思为: 从 ...

  10. fineUI ueditor(可能别的editor也有)配置注意事项

    1.把ueditor配置在弹窗里的一些小问题 这种弹窗的原理 如果把ueditor放进这个小窗口里 放进items里(以下截图还没有放) 那么配置的ueditor是不可用的 就好像enable=fal ...