宝哥软件园

JavaScript模拟实现自由落体效果

编辑:宝哥软件园 来源:互联网 时间:2021-08-30

本文的例子分享了js实现自由落体效果的具体代码,供大家参考。具体内容如下

1.翻译

2.实施分析

用画布画球和地面;

1.下降过程

复习物理知识,物体的下落过程(不包括损耗)是由引力势能转化为动能

重力势能Ep=mgh

动能ek=(1/2) mv 2

速度从0增加到gt

这里需要计算每次浏览器渲染的球的Y坐标

y=(1/2)gt^2

2.反弹过程

动能转化为重力势能

速度逐渐降低,直到达到零

计划设置Y=(1/2) g (t-t1) 2,其中t1为下落或反弹所花费的时间

然而,实际效果并不令人满意。应该是回弹位移的计算有误,反复思考也没有结果(如果有更好的实现方式,请评论告知)

所以决定先把下落过程的位移保存在数组中,等它反弹回来的时候再一个一个取出赋值

3.代码实现

!DOCTYPE html html lang=' en ' head meta charset=' UTF-8 ' title title/title style body { padd : 0;margin : 0;背景-color: rgba(0,0,0,1);} # canvas { display:块;margin: 10px自动;}/style/头条canvas id=' canvas ' width=' 600 ' height=' 600 '您的浏览器不支持canvas/canvas脚本类型=' text/JavaScript '//自由落体h=(gt 2)/2动能ek=(mv 2)/2重力势能:Ep=mgh let x=300,y=60,//中心坐标minHeight=60,//最小下落位移maxHeight=446,//最大下落位移dir=true//dir true falls,false是bounce(function(){ let canvas=document . getelementbyid(' canvas ');let CTX=canvas . getcontext(' 2d ');draw(CTX);})();函数draw(ctx){让currentTime=new Date()。getTime();//开始毫秒,返回并记录一次。current time let arr _ y=[];//设置数组窗口。requestanimation frame(函数init(){ if(dir){ if(y=max height){ dir=false;当前时间=新日期()。getTime();}else{ y=y Math.pow((新日期()。getTime() - currentTime)/1000,2)* 10/2;arr _ y . push(y);} } else { if(y=minHigh){ dir=true;当前时间=新日期()。getTime();}else{ y=arr_y.splice(-1,1)[0]| | 60;} } drawArc(ctx,x,y);requestAnimationFrame(init);});}//draw函数drawarc (CTX,x,y) {CTX。球体和地面上的clearrect (0,0,600,600);CTX . BeginPath();ctx.arc(x,y,50,0,Math。PI * 2);CTX . FillStyle=' # 98 ADF 0 ';CTX . fill();CTX . save();CTX . BeginPath();ctx.strokeStyle=' # ffffffctx.moveTo(0,500);ctx.lineTo(600,500);CTX . LineWidth=4;CTX . stroke();CTX . closepath();CTX . save();}/脚本/正文/html4。结论

虽然只是一个简单的下落和弹跳,但是我用了6天的时间才实现了弹跳位移(主要是每天想着怎么计算弹跳位移)

主要的出发点集中在

下落位移(开口线上的抛物线方程)

y=(1/2)gt^2

对回弹位移的思考应改为将抛物线沿X轴向右移动t1,并得出结论

y=(1/2)g(t-t1)^2

感兴趣的同学可以试试看效果

浏览器渲染反弹的效果不尽如人意,所以还没有想出位移的计算方法,所以用数组来实现

以上就是本文的全部内容。希望对大家的学习有帮助,支持我们。

更多资讯
游戏推荐
更多+