用户:
爵士OIer查看:50 回复:34 评论:50 创建时间:2021-02-03T14:11:11
这本来并不是原定计划内的,因为有人要我写,所以我就先写了,不按规定流程走啦qaq
一、运动
我们还是从运动讲起。
众所周知,球抛出后是抛物线。我们的物体在运动的时候,一瞬时沿着什么方向去运动呢?
建立坐标系,假定一个物体运动的路径为y=-x²+5x-4,如下图:

那么我们在物体运动到紫色点的一瞬时,它的运动方向是沿着黄色的线运动的。
这条线即时抛物线在x=1.2处的切线。
二、力
接下来我们讲讲力。
众所周知,力具有大小;同时,力还有方向:你想,将一个物体向上扔和向下扔,结果是不一样的。
因此力具有方向和大小,力是向量。
在平面直角坐标系中,我们通常能够用坐标(x,y)来确定一个起点为(0,0),角度为arctan(y/x),模长为sqrt(x²+y²)的向量

三、导数及物理意义
我们想知道一个物体在运动过程中的瞬时速度。这怎么办?
如果我们能用函数来描述物体的运动,那么想想平均速度:行过的路程除以花费的时间。
比如一个物体的运动路程关于时间的函数为y=x²,那么这个物体在t=0.5和t=1间的平均速度可表示为下图:

现在我们就像要求t=0.5时的瞬时速度,怎么办?
我们想:如果我们选取的另一个时间点无限接近0.5,那么最终求得的平均速度也无限接近与瞬时速度。然后我们求个极限就可以啦qaq!
我们设y=f(x),时间t的增加量为dx,于是增加的路程为f(x+dx)-f(x),增加的时间为dx,这样,两者相除求极限即可qaq!
如下:

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

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

还是挺简单的qaq
我们还有很简单的求导公式,大家可以去记一记,这里就不罗嗦啦qaq
四、加速度
速度的导数即为加速度。
一般来说,重力加速度为10,这表示在竖直方向上一个物体的运动速度必然是-10x,路程为-5x²+ax+b。这也正好是抛物线。
五、牛顿第二定律
那么知道了加速度,也知道了力,我们能干什么?这和物理引擎的制作有什么关系?
事实上,恭喜你一旦到了这一步,你离完成物理引擎的制作就不远了。
牛顿第二定律讲力和运动联系在了一起:
F=ma
其中,m是物体的质量,a就是加速度,F为应施加的力。
六、正交分解
那么既然如此,我们知道了牛顿第二定律,我们还差一个条件:
如果一个力它不是水平方向或垂直方向上的,那么请问这个时候我们该怎么调整速度、加速度?
这是个好问题!众所周知,向量也是可以相加减的。
根据向量基本定理

我们完全可以将一个向量分解为互相垂直的两个向量!
这样,我们的力不在水平或竖直方向上的问题也迎刃而解了。

如图,我们遇到需要施加黄色线条的力的时候,可以分解为紫色的两个力。
七、简单物理积木的手动制作
恭喜我们,现在正是踏入物理引擎的手动制作!
现在,你也可以像技术喵那样开发积木盒子啦qaq!
竖直方向的重力加速度
因为前面说过,重力加速度是不会变的,所以直接给他设置一个值即可。

水平方向加速度
然后我们要设置这个水平方向上的加速度。
忽略空气阻力,水平方向上的加速度为零,不用管。
因此我们既然知道了两个方向上每时每刻的速度,我们直接重复执行让它坐标增加这些值就行啦qaq

物理边界
好了,然后我们要设置物理边界。
我的这个程序只设置了下边界,上边界没有设置,左、右边界让它连通了。
我们的反弹也非常简单,设置一个反弹系数,每次将竖直方向上的速度乘以-1,然后再乘以反弹系数即可。

空气阻力
但众所周知,物理引擎是有所谓空气阻力的。
这个时候很简单,传入一个参数,让两方向上的速度每次都以固定的比值减少即可。

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

九、较复杂物理积木的手动搭建
好了,但是我们物理引擎还有类似于这样的积木:

其实这也很容易实现。
想想我们的正交分解,再想想慕斯是怎么教你们三角函数的?
我们自己画个圆试试看qaq:

然后,这也就非常简单啦qaq!
因为我们施加了一个瞬时的力,所以是不会影响加速度的!因此我们只需修改两个方向上的速度即可。

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

这就好啦qaq!
十、模板作品和结语
到现在为止,我们从最简单的下落,到空气阻力等数据,再到反弹,最后讲了如何实现物理引擎的最后四块积木。
好了!现在,我们把物理引擎里的积木做了个遍,原来也是非常简单啊!
什么叫万能手写(战术后仰
本期教程就到这里啦qaq,我们非常简单的学会了物理学中力学的原理,还会了不用物理引擎实现的物理效果!
欢迎提出问题,我已将作品发布,需要查看完成积木的可以购买。
https://shequ.codemao.cn/work/78233837