gamemaker做个简陋的2d物理方面的东西合适吗
gamemaker吧
全部回复
仅看楼主
level 8
anheimfb 楼主
就是只考虑同样大小的正方形刚性碰撞,动量守恒, 能量守恒, 但是碰到边缘墙壁速度为0
可以先不考虑摩擦和重力 不考虑旋转
最近试了一下,只有一个运动的物体还好说,但是多个运动的物体的时候总会有嵌入的情况 ,
原因可能是和每个物体的代码执行顺序有关,
也许还应该考虑一下力的传导问题,先受到力的物体代码先执行。
顺便说一下,从没用过gm里的碰撞函数,我都是计算正方形物体间是否重叠来判定碰撞的。。
2014年12月15日 03点12分 1
level 11
不是有物理扩展包吗
2014年12月15日 09点12分 2
额 拓展包啊, 比较想自己写一个, 简陋点的就行, 对2d物理方面的编程想琢磨一下
2014年12月15日 10点12分
level 11
可以啊
2014年12月15日 11点12分 3
level 8
anheimfb 楼主
感觉最难的 应该是位置校正了 ,多个运动物体碰撞之后的位置校正应该是个很困难的事 计算量也很大
2014年12月15日 12点12分 4
吧务
level 13
以下均为未实测的难度设想:
难度1:由于GM的“步”处理方式,导致了时间上的离散性,需要有效手段来保证时间连续。类似的情况在东方系列中也有发生,特定机体高速移动时可以从现有弹幕中穿越。
难度2:多目标同时碰撞。大概就是LZ说的“嵌入”的来源,在一个物体与多个物体在一步内发生碰撞时,简单分次计算会导致结果偏差。
难度3:单步多次碰撞、“返回式”碰撞。大概就是,把台球紧贴排成完美直线,且最后一球紧贴岸边时,母球沿这条“完美直线”打过来,所有的球都要考虑往返两次得到和失去能量,共计4次碰撞的结果,将母球“弹回去”。需要非常合理的计算方法以保证在母球与第一个球碰撞(或“预碰撞”)时计算全部球的碰撞过程。
难度4:关于实际的碰撞角度,嗯哼哼哼,既然都打算自己做简易物理引擎的话,这个应该不成问题吧。所以,真正的问题是……
难度5:上面4个问题需要,嗯,一
#起#
考#虑。
打完收工,反正咱没打算做这玩意。
PS1:也许用预判断会碰撞以后执行用户事件比较好……
PS2:也许用一个obj_ctrl来判断所有物体是否发生(预)碰撞比较好……
PS3:也许让obj_ctrl来while检测直到没有新碰撞发生来处理这个问题比较好……
2014年12月16日 01点12分 5
对啊 我就是这个意思,网上这方面的资料基本没有,都是简单的告诉你怎么判断2个物体如何判定碰撞 。到是看到一个delphi做的很牛的物理引擎源码,但是编程的方面我就会gamemaker[不高兴].现在只想做1楼那样的简陋的物理引擎就行.有时怀疑gm是不是不太适合做这些。
2014年12月16日 04点12分
level 8
anheimfb 楼主
刚才突然想到个思路, 也许可以去试一下。
1,记录:
碰撞前位置1.xn,1.yn,2.xn,2.yn.
碰撞前速度1.vxn,1.vyn,2.vxn,2.vyn.
一步的物体间相对位移是l= scr_l(1.vxn,1.vyn,2.vxn,2.vyn)
一步的物体间相对速度是v=scr_v(1.vxn,1.vyn,2.vxn,2.vyn)
一步用的时间是t=l/v=1
////////////////////////////////////////////////////////////////当然还需要正方形边长做参数,以下省略了
2.进行碰撞检测 :
if scr_碰撞(1.xn,1.yn,1.vxn,1.vyn,2.xn,2.yn,2.vxn,2.vyn)=1;进入第3步
else break
////////////////////////////////////////////////////////////////////////////////////////////////////////////
3,时间校正:
取出物体间嵌入的距离ln=scr_ln(1.xn,1.yn,1.vxn,1.vyn,2.xn,2.yn,2.vxn,2.vyn)
取出会最先进行碰撞的两个物体碰撞时的时间: tn=max[ln/v,......];
取出剩余时间:t=t-tn
///////////////////////////////////////////////////////////////////////////////////////////////////////////
4,位置校正:
最先进行碰撞的所有物体碰撞时位置校正
1.xn=1.xn+1.vx*tn;
1.yn=1.yn+1.vy*tn;
2.xn=2.xn+2.vx*tn;
2.yn=2.yn+2.vy*tn;
.....
////////////////////////////////////////////动量守恒,能量守恒,不考虑摩擦和重力,质量相等速度互换
5,速度校正:
最先进行碰撞的两物体碰撞时速度校正
var a,b;
a=1.vxn;
b=1.vyn;
1.vxn=2.vxn;
1.vyn=2.vyn;
2.vxn=a;
2.vyn=b;
其他物体速度不变
////////////////////////////////////////////////////////////////////////////////////////////////////
6。循环:
if 剩余时间t!=0 从第2步开始
else break
/////////////////////////////////////////////ps:考虑到可能会无限循环,限制循环次数。。
2014年12月16日 05点12分 7
自己瞎想的 ,以后有时间做做吧,看着逻辑蛋疼,[汗]
2014年12月16日 05点12分
回复 anheimfb :又看了一眼 速度校正有些不严谨- - 这东西果真不是随便搞的
2014年12月16日 05点12分
第6步循环的判定 也好象不太行, 果真是想了个废物逻辑。。
2014年12月16日 05点12分
level 13
自己写物理用Gm自带内容真心困难,需要考虑的东西太多了。所以……还是用现成的吧。ExP和box2d还都算不错,也很好用。
2014年12月16日 11点12分 8
对这个挺感兴趣的,如果用专门编程的软件会涉及哪些知识点呢?做个最简陋的也好啊 或者现在想这些有些不自量力了。。先把c#都看懂在说[不高兴],感觉gm和c#的语法有些接近呢
2014年12月16日 12点12分
1