用户:
爵士OIer查看:887 回复: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
晨月霜星sc都没有[物理]这个东西,都得这样(意思不是不喜欢sc)。再说你那上面一大坨就只有一点用。而且我也不会用源码编辑器里的物理(被踹)
(室长回复)
点赞0
评论
我上面那一大坨句句都有用(),否则你上面那一坨有一点不会也理解不了物理()
可能还需要一些小学二年级的知识()
一点不会虽然理解不了物理但是那东西太多了吧
不多吧,我总要讲完力怎么影响一个物体的位置之后我才能给出积木吧,而这样的话我肯定要把上面的东西都讲到啊
而且这是写教程的正常套路吧
咚咚锵哦作者,加速度也算进去了吗
点赞0
评论
重力加速度一直是10啊()
可是下落距离越多加速度越多啊。。。
谁告诉你自由落体运动加速度会变了?
准确的说是9.8m/s^2
哦哦
那初始速度不是零怎么办
自由落体的空气阻力里面算进去了吗
话说你很厉害那ε=ε=ε=(~ ̄▽ ̄)~
初始速度和重力加速度是没有关系的
做空气阻力这里我很懒(),直接给他每次乘了0.9996()
再出一期动量吧,讲讲弹性和完全非弹性碰撞,二维碰撞有了这一期内容应该很好解决了吧()
点赞0
评论
我做过一个机械波演示器:https://shequ.codemao.cn/work/80121078
回头可以介绍一下简谐运动再
简谐运动可以去论坛搜索“三角函数”,有我和慕斯的教程
我飞机大战用的就是机械波(),我还用泰勒公式实现过(),写进了我的教程里()
我用的就是原带三角函数
我也是原带三角函数
但是你可以看看我的第一期(),里面我用泰勒公式给弄出来了(),但不知道对不对
嗯。
哦不对不是第一期是第二期
好家伙,碰撞的内容我已经在写了)
催更
大佬,我刚刚做了一个演示弹性碰撞的程序,希望对以后的教程有帮助:https://shequ.codemao.cn/work/80125058
点赞0
评论
但是实现方法很喵,直接把弹性碰撞的碰撞列了两个方程手解出来(能量守恒和动量守恒,通过m1,m2,v1,v2解v1',v2'),在放到程序里算的。回头我再试试完全非弹性碰撞
喵=暴 力
我在想怎么实现真正的圆周呢?怎么才能实现向心力呢?求大佬提供思路QwQ
我还是先看看怎么解决二维弹碰吧
草这个()
你把两个球的方程都写出来,然后给他算一下碰撞前两个力是怎么样的,多大,然后碰撞的时候俩圆的切线的角度也给算出来,然后暴解()
理论上很好算()
我觉得可能分解两个方向各用一次弹碰函数?
目前尝试的是这个思路