cocos creator 3d的问题请教一下,关于物理系统。

我正在学习3d, 看了b站的布道师小姐姐的快上车教程,但是我觉得完全在update里面去自己计算并更新车子位置不是很优雅,我就想自己研究一下3d的物理系统。让车子根据力的作用去运动岂不是更加完美?

但是研究过程中,由于没有找到前人的经验(毕竟3d也刚出。)遇到问题百思不得姐。(看文档相当于没看,毕竟cocos的文档你懂的)

正文:
在物理系统中,我给地面和车子都设置了分组和掩码,并在碰撞监听中是可以触发碰撞的。这说明分组没问题了吧!
然而,当我给车子添加上重力,并且不勾选isKinematic,并且isTrigger为false (就是它是碰撞器)
然后给地板的包围盒上设置isTrigger为true(触发器),地板没有刚体组件

然后车子就从地板上掉了下去。。。

理论上车子不是应该被地板挡住的吗?我想可能是地板没有刚体的原因,所以给地板也加了个刚体,结果是一样的。

请教,两个物体分别应该怎么设置才对呢?

上传中…
上传中…
上传中…

地板设置成了触发器?这意味着地板不会和任何物体产生碰撞,所以车子掉了下去

改成碰撞器试试,另外检查一下地板的厚度,注意不要是0

emmm…地板设置成碰撞器之后就可以了,不过文档上对于碰撞器和触发器的解释希望详细点,我看了还以为触发器是用来触发碰撞的,因为isTrigger:是否为触发器,触发器不会产生物理反馈
我以为地板不需要物理反馈,所以只需要当作触发器就够了。容易让人误解。

然后我又碰到一个难题,我给车子加上重力之后,使用rigidBody.applyForce(new Vec3(0, 0, 500));似乎没看到车子动起来,不太清楚具体什么原因。
请问这个用法是正确的吗?车子质量是10

这个我遇到过,你车有重力,并且有质量,则你在使用applyForce的时候重力方向要添加一个反方向的力重力向下,你的给一个向上的力一般是y轴,值一般是m*g,这样的话就可以移动了,少于这个值哪怕只是少一个 1,你别的方向再大的力好像也不行。

挺好的回答,其实主要的原因是摩擦力导致的,默认的摩擦系数是不为0的

你可以想象一下这个场景,在不光滑的地面上,有一块不光滑的方形石头,并且有重力的影响,这时候你需要用施加大于石头受到的摩擦力才可以让它滑动起来

使用物理系统模拟物体,最佳的方式就是把模拟场景用现实环境搭建出来,这样是最直观和最容易理解的方式

贴下之前写的物理模块介绍的某段话

给碰撞体添加一个物理材质,设置其摩擦力为0.1,勾选使用重力,添加一个恒力组件,当重力没有抵消的情况下和我设想的加速度a = (F-G*0.1)/M,不一致。 表现是碰撞体落到地面后就不动了。

摩擦力是和 G 沿斜面向下的分力是一组平衡力,这个 G*0.1 是什么啊

哦,我当成斜面了

这个可能是cannon.js没有处理好,可以改成ammo.js试试

ammo.js和预期的一样。

1赞

关于力的这块还有很多地方不懂。
我尝试施加一个给车子z轴方向施加一个力,却发现无论这个力多大,车子都没办法移动,这个应该不是摩擦力的问题,毕竟摩擦力按照质量跟摩擦系数计算也没那么大啊。而且就算不施加重力也动不了。

然后我尝试给他施加了一个恒力,在施加恒力的状况下,如果同时有重力,则还是动不了,如果没有重力就可以动,这就很奇怪,重力是y轴伤的,我施加的力是z轴的,线性阻尼是0,应该是不会相互干扰的?

还有那个applyForce的api是只要施加了力,这个力就会一直作用在制定物体上吗?还是只会作用一下?

还有Vec3这个函数生成的是一个坐标,它跟力之间的转化关系到底是怎样的呢?

感觉力这块好多坑啊,有没有完善一些的教程呢?

这个力要持续给 我试了下 this.playerBody.applyForce(new Vec3(0, 0, -500)) 是可以移动的 或者你可以用 this.playerBody.setLinearVelocity(new Vec3(0, 0, 50))

这个选项下的比较符合咱们物理的认知。
cannon.js
选项下的,我测试的结果和你的一样,y轴有重力的情况下是不会移动的。

关于applyForce,调用一次也就是作用一次,如果每帧调用和恒力效果是相同的
我自己总结你参考一下:作用力在引擎中调用不持久,仅有有限时间内有效。如果是当前帧内,则效果需要和当前帧的时间相乘,改变的加速度a = f/m,改变的速度,则是a*帧时间;

Vec3函数生成的如果叫做向量,这样和力的对应关系就好理解了。

ammo.js
这个选项下的比较符合咱们物理的认知。
cannon.js
选项下的,我测试的结果和你的一样,y轴有重力的情况下是不会移动的。

关于applyForce,调用一次也就是作用一次,如果每帧调用和恒力效果是相同的
我自己总结你参考一下:作用力在引擎中调用不持久,仅有有限时间内有效。如果是当前帧内,则效果需要和当前帧的时间相乘,改变的加速度a = f/m,改变的速度,则是a*帧时间;

Vec3函数生成的如果叫做向量,这样和力的对应关系就好理解了。

1赞

放弃了,先搞搞2D。等这块成熟一点再看看吧。文档和编辑器感觉坑还都是挺大的:innocent:

1赞

设置了,物体产生碰撞还是会下沉:sob:

编辑器的物理材质貌似有问题,设置了弹力为0依然反弹