1说明: 1。1中英文介绍: Pymunkisaeasytousepythonic2dphysicslibrary pymunk是一个易于使用的pythonic2d物理库 1。2多基于pygame和pyglet的动画。 1。3官网示意图: 图1:indexvideo。gif,可以实现 2准备: 2。1官网:http:www。pymunk。orgenlatesthttps:pypi。orgprojectpymunkhttps:github。comviblopymunk 2。2环境: 华为笔记本电脑、深度deepinlinux操作系统、谷歌浏览器、python3。8和微软vscode编辑器。 2。3安装:pipinstallpymunk本机安装,且推荐国内源安装sudopip3。8installpymunkihttps:mirrors。aliyun。compypisimple 3官方example: arrow bouncingballs 4拿官网的动画gif来讲解: 4。1图1:indexvideo。gif,也可以实现,代码量太多了,省略,属于example。 4。2蜘蛛网:spiderweb。py对代码进行修改,注释,bug改进。 5spiderweb。py代码: 提前看看效果图: 5。1第1步:导入模块importmath,randomimportpygletimportpymunkfrompymunk。vec2dimportVec2d 5。2第2步:初始化参数设定configpyglet。gl。Config(samplebuffers1,samples2,doublebufferTrue)windowpyglet。window。Window(configconfig,vsyncFalse,窗口大小和标题名设定width800,height800,captionspiderweb,resizableTrue)pymunk物理参数设定spacepymunk。Space()space。gravity0,900space。damping。999中心点坐标cVec2d(window。width2。,window。height2。)WEB参数webgroup1bs〔〕dist。3cbpymunk。Body(1,1)cb。positionc位置中心点坐标spymunk。Circle(cb,15)tohavesomethingtograbs。filterpymunk。ShapeFilter(groupwebgroup)s。ignoredrawTruespace。add(cb,s) 5。3第3步:织网generateeachcrossinginthenetforxinrange(0,101):bpymunk。Body(1,1)vVec2d。unit()v。angledegreesx18scalewindow。height2。6。。5dist118。distdist1。005offset0offset〔0。0,0。80,1。0,0。80〕〔((x18)360)184〕offset。8offsetoffsetdist2。8100。v。lengthscale(distoffset)b。positioncvspymunk。Circle(b,15)s。filterpymunk。ShapeFilter(groupwebgroup)s。ignoredrawTruespace。add(b,s)bs。append(b)连接线defaddjoint(a,b):rla。position。getdistance(b。position)0。9stiffness5000。damping100jpymunk。DampedSpring(a,b,(0,0),(0,0),rl,stiffness,damping)j。maxbias1000j。maxforce50000space。add(j)forbinbs〔:20〕:addjoint(cb,b)foriinrange(len(bs)1):addjoint(bs〔i〕,bs〔i1〕)i2i20iflen(bs)i2:addjoint(bs〔i〕,bs〔i2〕) 5。4网和点的关系staticbs〔〕forbinbs〔17::4〕:staticbodypymunk。Body(bodytypepymunk。Body。STATIC)staticbody。positionb。positionstaticbs。append(staticbody)jpymunk。PivotJoint(staticbody,b,staticbody。position)jpymunk。DampedSpring(staticbody,b,(0,0),(0,0),0,0,0)j。damping100j。stiffness20000space。add(j)更新defupdate(dt):r10forxinrange(r):space。step(1。30。r)pyglet。clock。scheduleinterval(update,130。)selectedNoneselectedjointNonemousebodypymunk。Body(bodytypepymunk。Body。KINEMATIC) 5。5第5步:窗口事件绑定和运行第5步:窗口时间绑定window。eventdefonmousepress(x,y,button,modifiers):mousebody。positionx,yhitspace。pointquerynearest((x,y),10,pymunk。ShapeFilter())ifhit!None:globalselectedbodyhit。shape。bodyrestlengthmousebody。position。getdistance(body。position)stiffness1000damping10selectedpymunk。DampedSpring(mousebody,body,(0,0),(0,0),restlength,stiffness,damping)space。add(selected)window。eventdefonmouserelease(x,y,button,modifiers):globalselectedifselected!None:space。remove(selected)selectedNonewindow。eventdefonmousedrag(x,y,dx,dy,buttons,modifiers):mousebody。positionx,ywindow。eventdefonkeypress(symbol,modifiers):保存设置,当按p就是保存ifsymbolpyglet。window。key。P:pyglet。image。getbuffermanager()。getcolorbuffer()。save(spiderweb。png)fpsdisplaypyglet。window。FPSDisplay(window)window。eventdefondraw():窗口背景颜色设置,默认为黑色(0,0,0,255),最后一个255为透明度pyglet。gl。glClearColor(240,240,240,255)白色pyglet。gl。glClearColor(0,0,0,255)黑色,不设置也是黑色window。clear()fpsdisplay。draw()staticattachpointspyglet。gl。glColor3f(1,0,1)pyglet。gl。glPointSize(6)a〔〕forbinstaticbs:a〔b。position。x,b。position。y〕pyglet。graphics。draw(len(a)2,pyglet。gl。GLPOINTS,(v2f,a))webcrossingsbodiespyglet。gl。glColor3f(。8,。8,。8)a〔〕forbinbs:a〔b。position。x,b。position。y〕pyglet。gl。glPointSize(4)pyglet。graphics。draw(len(a)2,pyglet。gl。GLPOINTS,(v2f,a))webnetconstraintsa〔〕forjinspace。constraints:a〔j。a。position。x,j。a。position。y,j。b。position。x,j。b。position。y〕passpyglet。graphics。draw(len(a)2,pyglet。gl。GLLINES,(v2f,a))pyglet。app。run() 关注我,不迷路。 学习你学不到的python知识,作为你编程的补充。