OK,我们继续改一下c++的摩擦力系统模拟
摩擦力是两个表面接触的物体相互运动时互相施加的一种物理力。广义地物体在液体和气体中运动时也受到摩擦力。摩擦力可谓无处不在,为了模拟出与现实生活相符的游戏场景,游戏或者游戏引擎中,用相关代码实现摩擦力的真实效果是十分必要的。
任何一款完善的物理引擎,都有模拟摩擦力系统的相关代码。如大名鼎鼎的havok物理引擎(暗黑破坏神3所采用的物理引擎),也如最近在移动平台上很热门的Box2d物理引擎。
上一节范例中并没有考虑小球下坠与弹跳时的摩擦力影响效果,这节笔记里面我们将其考虑其中,加入了使小球运动速度减慢的负向加速度,但忽略小球与空气之间的阻力。下面看看如何实现这样一个比较符合真实状况的小球下落与弹跳效果:
def main():
x = 10 # 初始横坐标位置
y = 10 # 初始纵坐标位置
vx = 6 # 初始水平速度
vy = 0 # 初始竖直速度
gy = 3 # 重力加速度
fx = -1 # 水平摩擦力
fy = -4 # 竖直摩擦力
x += vx # 计算横轴坐标,每次刷新界面,横坐标x都加上一个vx的当前值
vy = vy+gy # 计算Y轴方向速度分量,每次刷新界面,vy就加上一个gy(重力加速度)
y += vy # 计算纵轴坐标,每次刷新界面,纵坐标y都加上一个vy的当前值
if y > 490:
y = 490
vx += fx # 触及地面之后水平速度加上水平摩擦力
if vx < 0:
vx = 0
vy += fy # 触及地面之后竖直速度加上竖直摩擦力
if vy < 0:
vy = 0
vy = -vy # 当触及地面之后,纵轴速度反向
整个代码如下:
import pygame
def main():
x = 10
y = 10
vx = 6
vy = 0
gy = 3
fx = -1
fy = -4
pygame.init()
clock = pygame.time.Clock()
area = [800,500]
screen = pygame.display.set_mode(area)
pygame.display.set_caption("PHY")
time = 10
while True:
screen.fill(0)
event = pygame.event.poll()
if event.type == pygame.QUIT:
pygame.quit()
exit(0)
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_n:
pygame.quit()
exit(0)
clock.tick(30)
x += vx
vy = vy+gy
y += vy
if y > 490:
y = 490
vx += fx
if vx < 0:
vx = 0
vy += fy
if vy < 0:
vy = 0
vy = -vy
pygame.draw.circle(screen,[255,0,0],[x,y],10)
pygame.display.update()
time += 1
if __name__=="__main__":
main()
这段代码里面小球由高出下落触及地面进行反弹,且存在落地时的摩擦力,使得小球在落地弹跳后速度减慢,最后呈现静止的状态,停在窗口边缘。