猫史档案馆


【进阶Kitten串讲】【第四期】如何手动实现物理效果?

用户:爵士OIer爵士OIer查看:50 回复:34 评论:50 创建时间:2021-02-03T14:11:11


这本来并不是原定计划内的,因为有人要我写,所以我就先写了,不按规定流程走啦qaq

 

 

一、运动

 

我们还是从运动讲起。

众所周知,球抛出后是抛物线。我们的物体在运动的时候,一瞬时沿着什么方向去运动呢?

建立坐标系,假定一个物体运动的路径为y=-x²+5x-4,如下图:

center_image

那么我们在物体运动到紫色点的一瞬时,它的运动方向是沿着黄色的线运动的。

这条线即时抛物线在x=1.2处的切线。

 

 

二、力

 

接下来我们讲讲力。

众所周知,力具有大小;同时,力还有方向:你想,将一个物体向上扔和向下扔,结果是不一样的。

因此力具有方向和大小,力是向量。

在平面直角坐标系中,我们通常能够用坐标(x,y)来确定一个起点为(0,0),角度为arctan(y/x),模长为sqrt(x²+y²)的向量

center_image

 

 

三、导数及物理意义

 

我们想知道一个物体在运动过程中的瞬时速度。这怎么办?

如果我们能用函数来描述物体的运动,那么想想平均速度:行过的路程除以花费的时间。

比如一个物体的运动路程关于时间的函数为y=x²,那么这个物体在t=0.5和t=1间的平均速度可表示为下图:

center_image

 

现在我们就像要求t=0.5时的瞬时速度,怎么办?

我们想:如果我们选取的另一个时间点无限接近0.5,那么最终求得的平均速度也无限接近与瞬时速度。然后我们求个极限就可以啦qaq!

 

我们设y=f(x),时间t的增加量为dx,于是增加的路程为f(x+dx)-f(x),增加的时间为dx,这样,两者相除求极限即可qaq!

如下:

center_image

 

我们还有另一种求极限的方法:洛必达法则。

center_image

总结一下,我们求瞬时速度的方法:

center_image

还是挺简单的qaq

我们还有很简单的求导公式,大家可以去记一记,这里就不罗嗦啦qaq

 

 

四、加速度

 

速度的导数即为加速度。

一般来说,重力加速度为10,这表示在竖直方向上一个物体的运动速度必然是-10x,路程为-5x²+ax+b。这也正好是抛物线。

 

 

五、牛顿第二定律

 

那么知道了加速度,也知道了力,我们能干什么?这和物理引擎的制作有什么关系?

事实上,恭喜你一旦到了这一步,你离完成物理引擎的制作就不远了。

 

牛顿第二定律讲力和运动联系在了一起:

F=ma

其中,m是物体的质量,a就是加速度,F为应施加的力。

 

 

六、正交分解

 

那么既然如此,我们知道了牛顿第二定律,我们还差一个条件:

如果一个力它不是水平方向或垂直方向上的,那么请问这个时候我们该怎么调整速度、加速度?

这是个好问题!众所周知,向量也是可以相加减的。

根据向量基本定理

center_image

我们完全可以将一个向量分解为互相垂直的两个向量!

这样,我们的力不在水平或竖直方向上的问题也迎刃而解了。

center_image

如图,我们遇到需要施加黄色线条的力的时候,可以分解为紫色的两个力。

 

 

七、简单物理积木的手动制作

 

恭喜我们,现在正是踏入物理引擎的手动制作!

现在,你也可以像技术喵那样开发积木盒子啦qaq!

 

 

竖直方向的重力加速度

 

因为前面说过,重力加速度是不会变的,所以直接给他设置一个值即可。

center_image

 

 

水平方向加速度

 

然后我们要设置这个水平方向上的加速度。

忽略空气阻力,水平方向上的加速度为零,不用管。

因此我们既然知道了两个方向上每时每刻的速度,我们直接重复执行让它坐标增加这些值就行啦qaq

center_image

 

 

物理边界

 

好了,然后我们要设置物理边界。

我的这个程序只设置了下边界,上边界没有设置,左、右边界让它连通了。

我们的反弹也非常简单,设置一个反弹系数,每次将竖直方向上的速度乘以-1,然后再乘以反弹系数即可。

center_image

 

 

空气阻力

 

但众所周知,物理引擎是有所谓空气阻力的。

这个时候很简单,传入一个参数,让两方向上的速度每次都以固定的比值减少即可。

center_image

 

 

八、主函数调用

 

那么这些函数在主函数里直接传入参数即可。

center_image

 

 

九、较复杂物理积木的手动搭建

 

好了,但是我们物理引擎还有类似于这样的积木:

center_image

 

其实这也很容易实现。

想想我们的正交分解,再想想慕斯是怎么教你们三角函数的?

我们自己画个圆试试看qaq:

center_image

 

然后,这也就非常简单啦qaq!

因为我们施加了一个瞬时的力,所以是不会影响加速度的!因此我们只需修改两个方向上的速度即可。

center_image

 

我们需要用户输入,则询问一下即可。

center_image

 

这就好啦qaq!

 

 

十、模板作品和结语

 

到现在为止,我们从最简单的下落,到空气阻力等数据,再到反弹,最后讲了如何实现物理引擎的最后四块积木。

 

好了!现在,我们把物理引擎里的积木做了个遍,原来也是非常简单啊!

什么叫万能手写(战术后仰

 

本期教程就到这里啦qaq,我们非常简单的学会了物理学中力学的原理,还会了不用物理引擎实现的物理效果!

欢迎提出问题,我已将作品发布,需要查看完成积木的可以购买。

https://shequ.codemao.cn/work/78233837

 


回复

上一页1 页 / 共 2下一页
爵士OIer爵士OIer

点赞0


评论


605memz605memz

好家伙,我初二早已晕头转向

 

点赞0


评论


ZCH编程小贝壳ZCH编程小贝壳

咱能说人话吗

点赞0


评论


爵士OIer爵士OIer

点赞0


评论


屑辰屑辰

喵啊能不能整点阳间的东西(((

点赞0


评论


晨月霜星晨月霜星

sc都没有[物理]这个东西,都得这样(意思不是不喜欢sc)。再说你那上面一大坨就只有一点用。而且我也不会用源码编辑器里的物理(被踹)

 

(室长回复)

点赞0


评论


Chengxuyee_已退Chengxuyee_已退

5年级不该来的()

点赞0


评论


爵士OIer爵士OIer

dd

点赞0


评论


咚咚锵哦咚咚锵哦

作者,加速度也算进去了吗

点赞0


评论


爵士OIer爵士OIer

点赞0


评论


爵士OIer爵士OIer

点赞0


评论


LiuChaoyiLiuChaoyi

再出一期动量吧,讲讲弹性和完全非弹性碰撞,二维碰撞有了这一期内容应该很好解决了吧()

点赞0


评论


LiuChaoyiLiuChaoyi

大佬,我刚刚做了一个演示弹性碰撞的程序,希望对以后的教程有帮助:https://shequ.codemao.cn/work/80125058

点赞0


评论


爵士OIer爵士OIer

dd

点赞0


评论


爵士OIer爵士OIer

dd

点赞0


评论


晨月霜星晨月霜星

我再看一遍再佩服一遍

点赞0


评论


爵士OIer爵士OIer

https://shequ.cod喵/community/361462

点赞0


评论


爵士OIer爵士OIer

dd

点赞0


评论


爵士OIer爵士OIer

点赞0


评论


禁止挖坟后果自负禁止挖坟后果自负

六年级小孩蒙了

点赞2


评论


禁止挖坟后果自负禁止挖坟后果自负

给我再去看此帖的勇气

点赞0


评论


Mellin_AmpMellin_Amp

空气阻力在一定速度范围内是大致和速度平方成正比的(逃)

点赞0


评论


爵士OIer爵士OIer

点赞2


评论


屑蜗屑蜗

最新回复23分钟爵士???监督你学习A 

点赞0


评论


爵士OIer爵士OIer

dd

点赞0


评论


TechnetiumTechnetium

总结一下,洛(不

点赞0


评论


umbrallawwumbrallaww

六年级懵逼 (诶我发现了错别字()啰嗦打成罗嗦)

点赞1


评论


阮泽峯kW喵阮泽峯kW喵

谢谢你

点赞0


评论


爵士OIer爵士OIer

ddd

点赞0


评论


爵士OIer爵士OIer

ddd

点赞0


评论