猫史档案馆


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

用户:爵士OIer爵士OIer查看:887 回复: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


评论

重力加速度一直是10啊()

可是下落距离越多加速度越多啊。。。

谁告诉你自由落体运动加速度会变了?

准确的说是9.8m/s^2

哦哦

那初始速度不是零怎么办

自由落体的空气阻力里面算进去了吗

话说你很厉害那ε=ε=ε=(~ ̄▽ ̄)~

初始速度和重力加速度是没有关系的

做空气阻力这里我很懒(),直接给他每次乘了0.9996()


爵士OIer爵士OIer

喵

点赞0


评论


爵士OIer爵士OIer

喵

点赞0


评论


LiuChaoyiLiuChaoyi

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

点赞0


评论

我做过一个机械波演示器:https://shequ.codemao.cn/work/80121078

回头可以介绍一下简谐运动再

简谐运动可以去论坛搜索“三角函数”,有我和慕斯的教程

我飞机大战用的就是机械波(),我还用泰勒公式实现过(),写进了我的教程里()

我用的就是原带三角函数

我也是原带三角函数

但是你可以看看我的第一期(),里面我用泰勒公式给弄出来了(),但不知道对不对

嗯。

哦不对不是第一期是第二期

好家伙,碰撞的内容我已经在写了)

催更


LiuChaoyiLiuChaoyi

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

点赞0


评论

但是实现方法很喵,直接把弹性碰撞的碰撞列了两个方程手解出来(能量守恒和动量守恒,通过m1,m2,v1,v2解v1',v2'),在放到程序里算的。回头我再试试完全非弹性碰撞

喵=暴 力

我在想怎么实现真正的圆周呢?怎么才能实现向心力呢?求大佬提供思路QwQ

我还是先看看怎么解决二维弹碰吧

草这个()

你把两个球的方程都写出来,然后给他算一下碰撞前两个力是怎么样的,多大,然后碰撞的时候俩圆的切线的角度也给算出来,然后暴解()

理论上很好算()

我觉得可能分解两个方向各用一次弹碰函数?

目前尝试的是这个思路


爵士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


评论

我也一样)

我初一还蒙蔽

我懂了我懂了()

我二年级,完全看不懂

狼王蛛才6年级吗?

大佬这是5个月前的。。

c,没注意


阮泽峯kW喵阮泽峯kW喵

谢谢你

点赞0


评论


爵士OIer爵士OIer

ddd

点赞0


评论


爵士OIer爵士OIer

ddd

点赞0


评论

捉......

作者,你知道吗,这是你非常实用的一篇教程!非常感谢!(在没有物理模块的Nemo可以用......)