Pymunk是一个易于使用的pythonic2d物理库
1 说明:
=====
1.1 中英文介绍:
Pymunk is a easy-to-use pythonic 2d physics library
pymunk是一个易于使用的pythonic 2d物理库
1.2 多基于pygame和pyglet的动画。
1.3 官网示意图:
图1:index_video.gif,可以实现
2 准备:
=====
2.1 官网:http://www.pymunk.org/en/latest/ https://pypi.org/project/pymunk/ https://github.com/viblo/pymunk
2.2 环境:
华为笔记本电脑、深度deepin-linux操作系统、谷歌浏览器、python3.8和微软vscode编辑器。
2.3 安装:pip install pymunk #本机安装,且推荐国内源安装 sudo pip3.8 install pymunk -i https://mirrors.aliyun.com/pypi/simple
3 官方example:
arrow
bouncing_balls
4 拿官网的动画gif来讲解:
======================
4.1 图1:index_video.gif,也可以实现,代码量太多了,省略,属于example。
4.2 蜘蛛网:spiderweb.py对代码进行修改,注释,bug改进。
5 spiderweb.py代码:
===============
提前看看效果图:
5.1 第1步:导入模块import math, random import pyglet import pymunk from pymunk.vec2d import Vec2d
5.2 第2步:初始化参数设定config = pyglet.gl.Config(sample_buffers=1, samples=2, double_buffer=True) window = pyglet.window.Window(config=config, vsync = False, #窗口大小和标题名设定 width=800, height=800, caption="spiderweb", resizable=True) #pymunk物理参数设定 space = pymunk.Space() space.gravity = 0,-900 space.damping = .999 #中心点坐标 c = Vec2d(window.width /2., window.height / 2.) #WEB参数 web_group = 1 bs = [] dist = .3 cb = pymunk.Body(1,1) cb.position = c #位置中心点坐标 s = pymunk.Circle(cb, 15) # to have something to grab s.filter = pymunk.ShapeFilter(group = web_group) s.ignore_draw = True space.add(cb, s)
5.3 第3步:织网#generate each crossing in the net for x in range(0,101): b = pymunk.Body(1, 1) v = Vec2d.unit() v.angle_degrees = x*18 scale = window.height / 2. / 6. * .5 dist += 1/18. dist = dist ** 1.005 offset = 0 offset = [0.0, -0.80, -1.0, -0.80][((x*18) % 360)//18 % 4] offset = .8 + offset offset *= dist**2.8 / 100. v.length = scale * (dist + offset) b.position = c + v s = pymunk.Circle(b, 15) s.filter = pymunk.ShapeFilter(group = web_group) s.ignore_draw = True space.add(b,s) bs.append(b) #连接线 def add_joint(a,b): rl = a.position.get_distance(b.position) * 0.9 stiffness = 5000. damping = 100 j = pymunk.DampedSpring(a, b, (0,0), (0,0), rl, stiffness, damping) j.max_bias = 1000 j.max_force = 50000 space.add(j) for b in bs[:20]: add_joint(cb,b) for i in range(len(bs)-1): add_joint(bs[i], bs[i+1]) i2 = i+20 if len(bs) > i2: add_joint(bs[i], bs[i2])
5.4 网和点的关系static_bs = [] for b in bs[-17::4]: static_body = pymunk.Body(body_type = pymunk.Body.STATIC) static_body.position = b.position static_bs.append(static_body) j = pymunk.PivotJoint(static_body, b, static_body.position) j = pymunk.DampedSpring(static_body, b, (0,0), (0,0), 0, 0, 0) j.damping = 100 j.stiffness = 20000 space.add(j) #更新 def update(dt): r = 10 for x in range(r): space.step(1./30./r) pyglet.clock.schedule_interval(update, 1/30.) selected = None selected_joint = None mouse_body = pymunk.Body(body_type = pymunk.Body.KINEMATIC)
5.5 第5步:窗口事件绑定和运行#第5步:窗口时间绑定 @window.event def on_mouse_press(x, y, button, modifiers): mouse_body.position = x,y hit = space.point_query_nearest((x,y), 10, pymunk.ShapeFilter()) if hit != None: global selected body = hit.shape.body rest_length = mouse_body.position.get_distance(body.position) stiffness = 1000 damping = 10 selected = pymunk.DampedSpring(mouse_body, body, (0,0), (0,0), rest_length, stiffness, damping) space.add(selected) @window.event def on_mouse_release(x, y, button, modifiers): global selected if selected != None: space.remove(selected) selected = None @window.event def on_mouse_drag(x, y, dx, dy, buttons, modifiers): mouse_body.position = x,y @window.event def on_key_press(symbol, modifiers): #保存设置,当按p就是保存 if symbol == pyglet.window.key.P: pyglet.image.get_buffer_manager().get_color_buffer().save("spiderweb.png") fps_display = pyglet.window.FPSDisplay(window) @window.event def on_draw(): #窗口背景颜色设置,默认为黑色(0,0,0,255),最后一个255为透明度 #pyglet.gl.glClearColor(240,240,240,255) #白色 #pyglet.gl.glClearColor(0,0,0,255) #黑色,不设置也是黑色 window.clear() fps_display.draw() # static attach points pyglet.gl.glColor3f(1,0,1) pyglet.gl.glPointSize(6) a = [] for b in static_bs: a += [b.position.x, b.position.y] pyglet.graphics.draw(len(a)//2, pyglet.gl.GL_POINTS, ("v2f",a)) # web crossings / bodies pyglet.gl.glColor3f(.8,.8,.8) a = [] for b in bs: a += [b.position.x, b.position.y] pyglet.gl.glPointSize(4) pyglet.graphics.draw(len(a)//2, pyglet.gl.GL_POINTS, ("v2f",a)) # web net / constraints a = [] for j in space.constraints: a += [j.a.position.x, j.a.position.y, j.b.position.x, j.b.position.y] pass pyglet.graphics.draw(len(a)//2, pyglet.gl.GL_LINES, ("v2f",a)) pyglet.app.run()
关注我,不迷路。
学习你学不到的python知识,作为你编程的补充。
人和人相处的维度真的很重要我是故事创作者柯柯KOKO一直有说人分三六九等,这个观念我不认可,我们同样是人,何来的三六九等之分。不是说一个人花钱如流水,穿名牌,开跑车,出入高档场所这个人就是上等人。也不是说一
恐婚未来的迷茫我是故事创作者柯柯KOKO这段时间的自己非常的情绪化,你问我怎么了,我可能会和你说我恐婚了。原因呢?或许是对未来的迷茫,或许是对未知的恐惧,或许是对以后的不确定性,归根究底,我想是
你觉得你每天很累,那你有去过医院吗?21天图文打卡挑战柯柯KOKO上个礼拜,跟几个朋友去吃饭,去吃饭的路上有一位老年中风患者,他一手拄着拐杖,一手僵硬的蜷曲着,一条腿向前迈,一条腿被拖着向前迈。我们快速的从他的身边路
成年人学会控制你的情绪情感点评大赏柯柯KOKO这几天,跟一位年长朋友聊天,她跟我说我女儿89年的,到现在都没有结婚,我看她是脑子不大好了,跟她说说嘛!脾气来得个差。我就坐在那里听她断断续续的说她女儿,最
猝不及防就成了成年人追梦路上的好心人柯柯KOKO我们这一代年轻人,我们这一代90后,没有吃过太多6070年代父辈的苦。我们一直在他们的羽翼下健康茁壮的成长,猝不及防下我们也成年了。蓦然回首,我们还是那
足足省了2w,多亏了新生儿医保!宝妈必办你知道吗?新生儿其实也可以办医保!而且办得越快越好,千万别拖过28天。我的一个闺蜜孩子早产,住院半个月,花费2w多,还好办理了儿童医保,只花了4k!像在广州,一年最高可报40万,其
开学季入园在家两手抓,为了娃,老母亲花大心思开学一周,你们的娃还好吗?为了迎接这次开学,除了做好入园准备,家里也重新添置了很多东西来营造学习的氛围先简单说下幼儿园清单推荐书包tigerfamily不多说了,之前有个视频介绍过
秋季腹泻!上吐下泻,90的孩子都逃不过秋季腹泻,很多妈妈开始担心的问题来了。与普通拉肚子不同,秋季腹泻起病急症状重时间长易脱水,而且所有年龄段的孩子都会中招。像圆圆的托班,才10个小朋友,有好几个小朋友国庆期间都中了,
全职妈妈离婚补偿5万全职妈妈的牺牲和付出,到底能换来什么?这2天,首个离婚经济补偿案件在北京房山法院实锤依据民法典新规,全职妈妈由于在婚内承担了较多的义务,获得5万元经济赔偿。新闻一出,迅速引发网友热议女孩子在家里承担的家务比较多,5万很
孩子我希望你心机一些值得每个父母看一下最近朋友圈疯传一段网络视频。视频片段视频中,三个女孩在天台上玩耍,其中一位蓝色衣服的女孩站在最靠近护栏角落的地方,并且手里一直牢牢抓住护栏。另外两位小女孩站在天台边缘最危险的地方,
少年派代沟就是你在和同学聊星座,而妈妈却误会你不是处女由张嘉译闫妮赵今麦领衔主演的电视剧少年派正在热播,该电视剧讲述了孩子的成长学习过程中与父母的种种问题。在最近几集中由赵今麦饰演的林妙妙邀请自己的好朋友赵小琪来自己家里做客,为了邀请