pygame 游戏开发 基础物理建模 摩擦力系统模拟

       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()

这段代码里面小球由高出下落触及地面进行反弹,且存在落地时的摩擦力,使得小球在落地弹跳后速度减慢,最后呈现静止的状态,停在窗口边缘。






  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值