第三章:不能再简单的世界

在真正开始编写之前,先回顾一下初中学过的经典物理的知识,OK,闭上眼睛想三分钟,嗯,动量守恒,摩擦系数,胡克定律,弹性碰撞。。。是不是突然想到了很多,但是并不系统,这里就简单的,系统的总结一下游戏中需要物理学知识(更详细的推荐《游戏开发物理学》)。

在物理世界的仿真中,一般我们至少要进行以下三种现象的仿真。

1.线性运动:包括定加速,不定加速运动,考虑摩擦力,压差,重力,阻尼,浮力等。

2.旋转:要计算角速度,力矩,转动惯量等。

3.弹性碰撞:包括完全弹性碰撞,非完全弹性碰撞,完全非弹性碰撞等。

关于二维和三维坐标系的知识就不做介绍,关于公式的推导也都省略了,只给出实用的结果公式。

注:以下公式中:*表示乘法,也是点积;×表示叉乘(外积),^表示幂。

第一节:线性运动

为了仿真物体的线性运动,需要知道计算物体的质量,速度,如果要考虑摩擦力,还需要物体的摩擦系数,要计算重力,需要引力常数等。

质心

对于组合物体,如飞船由引擎,人员,船身等各个部分组成,而不同部分的重量不同,在计算物体线性运动时,施加在物体上的力,都看做是施加在物体质心上的,所以在计算物体运动之前要先算出物体的质心。

Mc =  ∑(mc_i * m_i ) / m

Mc是物体合并后的质心,mc_i是物体中每个质点的坐标(二维或三维空间下的向量),m_i是每个质点的质量,m是物体的总质量。

牛顿第二定律

这是计算线性运动的基本定律,即根据作用在物体质心上的合力计算物体的加速度:

∑F = m*a

m是物体的质量,a是在力作用下的加速度,∑F是施加在质心的合力,F和a都是向量。一般把F分解为沿着空间坐标轴的分量计算沿着不同坐标轴的加速度。如果运动过程中∑F不变,则成为定加速运动,如果∑F再运动中变换就是变加速运动。

定加速运动

物体的及时速度 v是由上一时刻速度v'和加速度a 决定的,

v = v' + a * t

这个就不解释了,同理:

s = v * t + 1/2 * a * t^2

变加速运动

因为物体在运动中会受到阻力(这里说的不同于摩擦力),阻力一般与速度的平方成正比,由此可知阻力引起的反加速度也与速度的平方成反比:

a = -k * v^2

a既是阻力引起的加速度,k为常数而负号表示方向相反。对于此类变加速运动,及时速度为:

v = v' / (1 + v' * k * t)

v'是上一时刻的速度,t是经过的时间。而距离公式为:

s =ln(1 + v' * k * t)  /  k

其中v和a都是向量,ln是自然对数,在二维和三维空间中可以分别分解为坐标轴的不同分量进行计算。

各种力

说了这么多可能还有人有疑问,各种合力都是那些力啊,首先说一下重力,重力是万有引力的特殊形式,引力公式如下:

Fa = G * m1 * m2 /  r^2

G是万有引力常数,m1与m2是两个物体的质量,r是物体间的距离。根据牛顿第二定律和地球的质量以及引力常数可以求得,海平面附近在地球引力作用下物体的加速度为9.8m/s^2。

然后就是物体的摩擦力,物体的摩擦力比较复杂,既是两个物体在压力作用下,某个接触面阻碍相互运动的力。摩擦力公式为:

Ff = p * N

其中N为垂直于接触面的压力,p为接触面的摩擦系数。摩擦系数分为静摩系数和动摩擦系数,即物体在静止时的摩擦系数和运动时。静摩擦系数一般大于动摩擦系数,即是说物体由静止转向运动要克服一个较大的力,当物体处于运动状态则收到的摩擦力较小。摩擦系数是对于两个接触面统一来说的,而一般在游戏中通过分别设置两个物体的摩擦系数来仿真。

之前变加速运动时提到的流动阻力,比如位于两种流体间运动的物体,比如船在空气和水面间,收到水波的影响。流动阻力一般和速度的平方成反比

F = C * v^2

C为阻力系数。还有就是物体在液体中的浮力,由液体的压强差决定:

F = F_b - F_t

F_b = P * A = p * g * h * A

浮力既是物体在不同高度受到的压力差如(F_b,F_t)决定的,而压力是压强P乘以接触面积A,液体压强P是液体深度h乘以密度p再乘以重力加速度g。

在仿真过程中还经常遇到弹力的例子,根据胡克定律,弹力是由于物体伸长或缩短而受到的力:

Fs = ks * ( L - r )

ks是弹力系数,L是物体伸长或缩短的长度,r是原先的长度。另外阻尼常与弹力联合使用,阻尼是抵消相对速度的力,

Fd = kd * ( v - v')

kd是阻尼常数。两个公式合并后为:

F = -( ks * ( L - r ) + kd * ( ( v - v' ) * L ) / s ) * L / s

L为弹簧阻尼单元的长度向量,而s是L的长度。利用弹簧阻尼单元可以用来仿真布料,将布料网格每个交叉点看做粒子,与周围粒子靠弹簧/阻尼公式连接,这样每个粒子在重力,风等的作用下,网格就呈布料的特性。

第二节 旋转

介绍完线性运动,基本上大部分的力和定理都明白了,但是对于刚体的仿真,在力作用到刚体上时,根据作用点的不同不但会产生线性运动,还会产生转动。计算产生的转动需要的量有力矩和转动惯量。

转动惯量

转动惯量是物体绕轴旋转,其质量呈辐射分布的度量,用于计算物体的旋转。物体到某一轴的转动惯量计算公式为,其各个质点到该轴距离乘积的积分,如三维空间下,对x,y,z轴的转动惯量公式:

I_x =  ∫(y^2+z^2)dm

I_y =  ∫(x^2+z^2)dm

I_z =  ∫(y^2+x^2)dm

根据转动惯量的公式可知,物体相对于其他平行轴的转动惯量为:

I = I_o + m*d^2

其中m是物体自身的质量,d是两平行轴间的距离,I_o是物体相对于自身某转动轴的转动惯量,。当md^2较大时,I_o可以忽略不计。

而对于一些规则物体,其相对于自身转动轴的转动惯量都有可直接计算的公式,如圆柱体,长方体,球体(这也是为什么大多数物理引擎的刚体都支持这些形状的原因之一)。对于这些公式就不再列举了,可以随意查到,有兴趣也可以自己积分一下。

力矩

如果力可以使物体转动,说明作用在物体上的力的力矩不为零,力矩计算如下:

M_cg = r× F

M_cg为力矩,×是叉乘(外积)。F为施加在某一质点的力,r为该力(向量)的作用线(直线)到质心的距离向量。根据作用力的力矩可以求出物体的转动角加速度的方程。

∑M_cg = I*a

其中I为转动惯量,是张量,在三维空间中是3x3的矩阵。∑M_cg为作用力矩的总和。a为角加速度。角加速度和角速度都是垂直于旋转轴的向量,二维空间中是标量。这样在计算过程中可能要不断地计算转动惯量和其逆矩阵,为了方便计算,将其化为局部坐标,公式为:

∑M_cg = I*(dw/dt)+w×(I*w)

w为角速度,t为时间,这样所有量都化成了局部坐标,除非物体质量或形状发生变化,不然物体的转动惯量是常数。

第三节 碰撞

冲量定律

动量就不介绍了,冲量是碰撞前后动量的变化:

Jf = m * ( v - v' )

Jm = I * ( w - w' )

m是物体质量,I是转动惯量,w,v是碰撞后的角速度与线速度,w',v'是碰撞前的角速度与线速度。Jf是线性冲量,Jm是角冲量。其中角冲量与线冲量的关系为:

Jm = Jf × r

即线冲量作用线与其到重心的距离向量的外积。因为外积满足分配率,由此可知角动量与线动量的关系。

动量守恒定律

动量守恒定律揭示了两个物体m1与m2碰撞前后速度的关系:

m1 * v1 + m2 * v2 = m1 * v1' + m2 * v2'

其中v1,v2是m1,m2碰撞前的线速度,v1',v2'是m1,m2碰撞后的线速度。这里的v是线速度,如果是角速度则不成立。

能量守恒定律

能量守恒定律表示碰撞的两个物体能量不会损失:

m1 * v1^2 + m2 * v2^2 = m1 * v1'^2 + m2 * v2'^2

参数同上,根据这两个公式可以求出两个物体碰撞后的速度。

但是能量守恒定律都是对于完全弹性碰撞而言的,即刚体形状不发生变化,因为物体形状发生变化要消耗能量,能量消耗就不守恒了。为了仿真非完全弹性碰撞给出了弹性恢复公式:

e = (v1 - v2) / (v1' - v2')

e是恢复系数,根据碰撞物体不同而不同。其中当e=0是完全非弹性碰撞,即碰撞后两个物体合为一个,e=1是完全弹性碰撞即能量守恒。配合动量守恒公式,就可以求出碰撞后两物体的速度了。

最后在计算一些复杂运动物体时,物体碰撞面的线速度是由当前物体的线速度和旋转的角速度组成的,线速度v与角速度w的转换如下:

v = w × r

即线速度是角速度与接触点到质心向量的外积。这里v,w,r都是空间中的向量。

介绍完基本的物理定律,在系统中计算流程一般如下:

1.初始化时计算物体重心,转动惯量

2.在循环仿真中,先计算作用力的合力,力矩,如摩擦力,阻力,重力

3.根据动量定律,速度方程等更新物体位置

4.如果发生碰撞,根据动量守恒定律,角速度与线速度的关系,建立方程即可求得碰撞后的物体状态

这样游戏开发中遇到的基本物理学知识就差不多了。以上的不少变量都是向量,在二维和三维的系统中处理时要用到向量和矩阵运算,有关物体平移,旋转,缩放的操作之后再介绍。

游戏开发中的基本物理学知识相关推荐

  1. 游戏开发中必备的数学知识(一)——向量

    3D空间中的向量 向量:只有长度和方向,不含有位置信息的量,也就是说,两个向量只要长度和方向相同,则二者相同. 左手坐标系和右手坐标系 同样是三维的坐标系,两者的差别在Z轴上面.在左手坐标系中,Z轴正 ...

  2. 游戏开发中常用的数学知识---矩阵(一)

    在数学中,矩阵(Matrix)是一个按照长方阵列排列的复数或实数集合,最早来自于方程组的系数及常数所构成的方阵.这一概念由19世纪英国数学家凯利首先提出. 矩阵是高等代数学中的常见工具,也常见于统计分 ...

  3. 【《Real-Time Rendering 3rd》 提炼总结】(十一) 第十四章 : 游戏开发中的渲染加速算法总结

    本文由@浅墨_毛星云 出品,转载请注明出处.   文章链接: http://blog.csdn.net/poem_qianmo/article/details/78884513 导读 这是一篇1万3千 ...

  4. 【转载】【《Real-Time Rendering 3rd》 提炼总结】(十一) 第十四章 : 游戏开发中的渲染加速算法总结

    本文由@浅墨_毛星云 出品,转载请注明出处.    文章链接:  http://blog.csdn.net/poem_qianmo/article/details/78884513 导读 这是一篇1万 ...

  5. 手把手教你架构3d游戏引擎pdf_游戏开发中的算法

    游戏技术这条路,可深可浅.你可以满足于完成GamePlay玩法层面的东西,你也可以满足于架构和框架设计层面的东西,你也可以醉心于了解某一游戏引擎带来的掌控感.但是,我们不该止步于此,止步与目前所见或所 ...

  6. 游戏开发、安卓、IOS知识概括

    游戏开发与安卓知识概括 游戏开发 安卓 IOS 游戏开发 简述: 使用unreal引擎(虚幻引擎)开发则使用c++语言编程. 使用unity引擎开发则使用c#语言编程. 因此第一步需要将c++或者c# ...

  7. 游戏开发中的矩阵与变换

    游戏开发中的矩阵与变换 介绍 矩阵组件和恒等矩阵 缩放转换矩阵 旋转变换矩阵 变换矩阵的基础 翻译转换矩阵 全部放在一起 剪切变换矩阵(高级) 转换的实际应用 在转换之间转换位置 相对于自身移动对象 ...

  8. VR硬件演进与其游戏开发中的若干注意事项

    最近两年虚拟现实(Virtual Reality,简称VR)从刚刚走进公众视野到逐渐变得炙手可热,很多不同领域的IT开发者都想进入虚拟现实领域.本篇文章将首先讲解VR入门所需要学习的知识,然后从VR软 ...

  9. 游戏开发中的物理介绍

    游戏开发中的物理介绍 碰撞对象 物理过程回调 碰撞层和蒙版 GUI示例 代码示例 Area2D StaticBody2D RigidBody2D KinematicBody2D 在游戏开发中,您通常需 ...

最新文章

  1. android程序贴吧,【Android 教程总结贴】归纳所有android贴
  2. jQuery快速学习
  3. linux-IO之copy的实现
  4. iOS 8那些有意思的API和服务
  5. java ee会话_Java EE会话技术Cookie和Session
  6. Altium Designer(九):DXF+DWG
  7. 内存不足时Android 系统如何Kill进程
  8. linux 系列:[所有相关文章链接]
  9. App Store 受欢迎榜单(美国区)-分析出未来方向
  10. 什么是EMC?什么是EMI?什么是EMS?电磁兼容详解(一)
  11. win10联网进入msn页面,信号出现感叹号
  12. android 2.2 sdk 下载地址,Android SDK 2.2 离线安装
  13. ZCMU 1635 超大型 LED 显示屏
  14. Windows系统完全卸载删除 Node.js
  15. LSB利器-zsteg
  16. windows计算机图标历史,从1993年至今,Windows开始菜单的传奇发展史
  17. 网页设计初了解-基础知识篇
  18. pycharm在ubuntu中不能输入中文的问题
  19. [ISCC 2023] pwn部分
  20. 触宝今年第一季度净利润为17.2万美元 同比减少87%

热门文章

  1. 安装win7时提示“缺少所需的CD/DVD驱动器设备驱动程序”
  2. matlab删失数据威布尔,scipy.stats.威布尔分钟.fit()如何处理右删失数据?
  3. Nancy 返回值详解
  4. TO_CHAR函数的用法
  5. 骁龙相机动态设置选项卡
  6. 网络基础——OSI模型
  7. 强度测试与压力测试的理解和区别
  8. python 开发框架 ant_GitHub - forging2012/pymqant: python版本mqant游戏框架
  9. 2021年安全员-C证考试资料及安全员-C证免费试题
  10. android给组件加上id,Android组件化入门:一步步搭建组件化架构