游戏开发论坛

 找回密码
 立即注册
搜索
查看: 8337|回复: 0

游戏中的物理与数学(一):物体运动算法的实现

[复制链接]

1万

主题

1万

帖子

3万

积分

论坛元老

Rank: 8Rank: 8

积分
36572
发表于 2016-1-13 15:40:05 | 显示全部楼层 |阅读模式
QQ截图20160113153715.jpg

  GameRes游资网授权发布 文/wfenglinxu

  (看了《游戏开发的数学与物理》,感觉很不错,记下点东西。 这是本“图灵程序丛书”,对于这个系列的书,我一直是蛮喜欢的,感觉书的内容、排版等,都让人看着很舒服。)

  1.1让物体沿水平方向运动

  了解匀速直线运动(最简单的运动),若左边为x,速度为v,则:x+=v,v=-v。

  注意: 注意物体的中心点,不同的游戏引擎,可能设计的中心点不同,而中心点不同,边界也就不同。

  1.2通过键盘控制物体的运动

  主要用到小学学的勾股定理,原理很简单,而且很实用。

  PS: 在模拟运动时,要控制个方向的速度。

  1.3让物体沿任意方向运动

1.jpg

  注1:请将角的单位统一为弧度(主要关系到微积分的一些问题)。

  注2:在计算浮点数中,计算机不可避免的会有误差,绝对值越大误差也就越大。因此应该尽可能地使用绝对值小的数字进行计算。

  1.4在物体运动中加入重力

  1. y += vy;       //对位置加入速度  
  2. vy +=G;       //为速度加上加速度  
复制代码

  用此方法算的Vy与y分别是:

2.jpg

  计算机所使用的重力加速度单位是特殊的 dot/F^2 (像素/平方帧)

  但是对于真实的情况,我们用积分模拟

3.jpg

  这样就和前面代码所表示的存在一些误差,则代码应该改成:

  1. v=vx*t;                   //x方向的位置  
  2. y=1/2*G*t*t+vy*t+y0;      //y方向的位置  
复制代码

  1.5物体随机飞溅运动

  随机数、均匀随机数、正态分布 ——>火山喷发、烟花、摩擦迸出的火花。

  产生随机速度的部分:

  1. Balls[i].vx = rand()*Screen_width/(float)RAND_MAX - Screen_width/2.0f;               //vx的初始值  
  2. Balls[i].vy = rand()*Screen_height/(float)RAND_MAX - Screen_height/2.0f - Base;      //vy的初始值  
复制代码

  生成了均匀随机数(所有数字的出现概率都相等的随机数),其中,Screen_width 和 screen_height 分辨是屏幕的宽和高。而vx与vy生成的初始值的范围分别为(-Screen_width/2.0 ~ Screen_width/2.0) 和 (-Base - Screen_height/2.0f ~ -Base+Screen_height/2.0)。

  1.6让物体进行圆周角运动

  1. x=R*cosf(fAngle)+(Screen_width-Char_width)/2.0f;  
  2. y=R*sinf(fAngle)+(Screen_Height-Char_height)/2.0f;  
  3. fAngle+=2.0f*PI/120.0f;       //一周的时间为2min  
复制代码

4.jpg

  所以物体施加一个指向某一点的角速度为ω的力,物体就会围绕该点做圆周运动。

  把t=0代入上面两式得初始时间与速度:

  1. //使用向心力的圆周运动,决定初始位置及初始速度的部分  
  2. rx=R;  
  3. ry=0.0f;                            //(r,0)  
  4. vx=0.0f;  
  5. vy=R*AngleSpeed;            //(0,rw)  
复制代码

  1.7[难]微分方程式及其数值解法

  常用:微分方程的数学值解法;  欧拉法

5.jpg

  但是球类等运动,需要更高精度,则有以下几种方法

  使用精度更高的高阶近似求解微分方程,eg,Runge-Kutta methods 。(数学难)

  使用线性多步法(Linear multistep method)计算,即不光使用前一次的值,还使用前两次或更多次的值进行计算, eg,Adams-Bashforth等。

  在一帧内多次使用欧拉法计算,缩小t——重复使用欧拉法,比较常用。

  相关阅读游戏世界的物理学—《超级马里奥兄弟》滑行与跳跃的实现

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-6-18 02:48

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表