unity3D中,给物体添加刚体后,为啥不是掉在地面上,而是穿过地形一直往下落呢?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了unity3D中,给物体添加刚体后,为啥不是掉在地面上,而是穿过地形一直往下落呢?相关的知识,希望对你有一定的参考价值。

为fbx物体添加capsule collider组件之后再添加刚体组件,物体就不会穿过地面下沉了。在立方体上面添加一个Rigidbody刚体组件,并在上面添加一个Tertest脚本。给脚本添加OnCollisionEnter方法,可以检测碰撞collider,详细步骤:

1、打开unity3d创建一个地面Terrain。

2、接着创建一个立方体模型Cube。

3、在立方体上面添加一个Rigidbody刚体组件。

4、并在上面添加一个Tertest脚本。

5、给脚本添加OnCollisionEnter方法,可以检测碰撞collider。

6、在方法判断是否与地面Terrain接触并发生碰撞了,是的话就修改为红颜色。

if(theCollision.gameObject.name=="Terrain")

GetComponent<Renderer>().material.color = new Color (255,0,0);

7、运行unity3d场景,发现立方体会下落,当掉落到地面后就变成了红颜色。

参考技术A 碰撞体厚度小于unity里的物理设置 default contact offset就会往下掉。
Edit-project settings-physics里设置contact offset,默认是0.1调小。
比如物体碰撞体z是0.2,scale的z是0.2,0.2*0.2<0.1,就会往下掉
参考技术B 添加刚体后,你还必须给该物体添加一个碰撞。
并且该碰撞不能是meshCollider。
如果非要是MeshCollider,那你还必须给Convex打上勾
参考技术C 你这个是导入的fbx文件吧 ,为fbx物体添加capsule collider组件之后再添加刚体组件,物体就不会穿过地面下沉了 参考技术D

我也是这个问题,我最后是修改了碰撞检测collision detection模式,你看一下你的

unity物理引擎浅谈

刚体:

刚体是模拟物理效果的对象。添加了刚体组件的游戏物体,会受重力影响,可以被玩家四处推动,或者直接用脚本添加力给对象来让他四处移动。通常情况下,对同一物体,要么通过刚体操纵,要么通过变换(transform)操纵。但添加刚体组件之后直接通过Transform组件更改物体位置,它和其他对象的碰撞可能出问题(除非Is Kinematic 选项被选中,选中该选项,则没法通过物理模拟来改变物体运动状态)。应避免同时使用两种方式。正确地方法应该是通过施加力或者扭矩来移动刚体。

 

属性:

Mass 质量:物体的质量(任意单位)。建议一个物体的质量不要多于或少于其他单位的100倍。
Drag 阻力:移动时物体受到的空气阻力。0表示没有,极大时物体立即停止运动。
Angular Drag:角阻力 当受扭力旋转时物体受到的空气阻力。0表示没有,极大时物体立即停止旋转。
Use Gravity 是否使用重力
Is Kinematic 是否是运动学:若激活,该物体不再受物理引擎驱动,而只能通过transform来操作。适用于模拟运动的平台或者模拟与铰链关节连接的刚体。
Interpolate 插值
当你发现刚体运动时抖动,可以尝试下面的选项。
None 无 不应用插值。
Interpolate 内插值 基于上一帧的变换来平滑本帧变换。
Extrapolate 外插值 基于下一帧的预估变换来平滑本帧变换。

Collision Detection 碰撞检测模式。用于避免高速物体穿过其他物体,却未触发碰撞。
Discrete 离散

离散碰撞检测。使用离散碰撞检测模式来与场景中其他碰撞器进行碰撞检测。其他物体与它的碰撞检测,也会应用这种模式。适用于普通碰撞(这是默认的模式)。
Continuous 连续
连续碰撞检测。使用离散碰撞检测来检测与动态碰撞器(刚体)的碰撞,使用连续碰撞检测来检测与静态网格(非刚体)的碰撞检测。采用连续动态碰撞检测模式的刚体碰见这类物体也将采用连续碰撞检测模式。而与其他刚体将采用离散碰撞检测模式。这种模式适用于那些采用动态连续碰撞模式的物体碰撞的物体。(这对物理表现有很大的影响,如果你不关心与高速物体的碰撞,那么就让其为默认的离散模式。)
Continuous Dynamic    动态连续
连续动态碰撞检测。使用连续动态碰撞检测模式来检测与连续模式和连续动态模式的物体间的碰撞。也适用于与静态网格(非刚体)的碰撞检测。而与之碰撞的其他模式的物体,采用的是离散动态碰撞检测模式。适用于高速物体。
Constraints 约束 对刚体运动的约束。 限制刚体在某些维度上的移动或|和旋转。


Freeze Position 冻结位置,刚体在世界中沿所选X,Y,Z轴的移动,将无效。
Freeze Rotation 冻结旋转,刚体在世界中沿所选的X,Y,Z轴的旋转,将无效。
velocity:刚体的速度向量,最好不要直接修改它,可以通过它的大小判断撞击的强度。


方法:
Rigibody.AddForce(Vector3),在物体的中心点位置添加一个Vector3的力,使物体朝该Vector3方向运动,运动速度为该向量的模。
Rigibody.AddTorque(Vector3),在物体中心添加一个力矩Vector3,力矩可以使物体旋转,刚体将绕着torque轴旋转。
Rigibody.AddForceAtPosition(Vector3,Vector3),在物体某个位置添加一个力,对于真实的效果,位置应大约在刚体表面的范围。
Rigibody.AddExplosionForce(float forceStrength,Vector3 postion,float range),在某个位置添加一个大小为float,半径为range的爆炸力(向爆炸范围内各个方向的对象施加一个力),用来模拟爆炸效果。爆炸力将随着到刚体的距离线形衰减。。

提示:两个刚体 (Rigidbody) 的相对质量 (Mass) 确定它们在互相碰撞时的反应方式。
使一个刚体 (Rigidbody) 的 质量 (Mass) 大于另一个刚体 (Rigidbody) 不会使其在自由落体过程中下落得更快。请使用阻力 (Drag) 实现此目的。
较小阻力 (Drag)值会使对象看起来较重。较高值会使对象看起来较轻。阻力 (Drag) 的典型值介于 0.001(实心金属块)与 10(羽毛)之间。
如果直接处理对象的变换 (Transform) 组件 (Component) ,但是仍需要物理,请附加刚体 (Rigidbody) 并将其设为运动学 (Kinematic)。
如果通过其变换 (Transform) 组件 (Component) 移动某个游戏对象 (GameObject),但是希望接收碰撞体 (Collider)/触发器 (Trigger) 消息,则必须将刚体 (Rigidbody) 附加到移动的对象。
不能仅仅通过将其“角阻力”(Angular Drag) 设置为无穷大使对象停止旋转。


碰撞体、触发器
发生碰撞条件:两个物体都必须带有碰撞器(Collider),其中一个物体还必须带有Rigidbody刚体,没有碰撞体的刚体会彼此相互穿过。发生碰撞时,当两个物体都是碰撞器(Is Trigger都未勾选)时触发OnCollisionXXX,否则触发OnTriggerxxx。


属性:
Is Trigger 是否触发器,勾选后会触发OnTriggerxxx方法,会穿过刚体
Material 材质,后面再讲
Center 中心点,用于调整碰撞盒的位置
Size 大小 在X、Y、Z三维上的碰撞器尺寸。
Convex 凸起的 如激活,该网格碰撞器将会和其他网格碰撞器碰撞。凸起的网格碰撞器限制在255个三角形面内。网格碰撞器之间通常不相互碰撞,但如果一个网格碰撞器被标记为凸起的(Convex ),那么它就可以与其他网格碰撞器碰撞。典型的解决方案是,对移动的对象使用基本碰撞器,而对静态环境对象使用网格碰撞器。
碰撞方法:
OnTriggerEnter( Collider other )当进入触发器
OnTriggerExit( Collider other )当退出触发器
OnTriggerStay( Collider other )当逗留触发器
OnCollisionEnter( Collision collisionInfo ) 当进入碰撞器
OnCollisionExit( Collision collisionInfo ) 当退出碰撞器
OnCollisionStay( Collision collisionInfo ) 当逗留碰撞器

Static Colliders 静态碰撞器,包含碰撞器但不含刚体的游戏对象。你不要逐帧移动 一个静态碰撞器,移动静态碰撞器将导致PhysX引擎的内部重置,非常耗费资源,而且会造成性能的极大下降。
 基于层的碰撞检测:Edit->Project Settings->Physics.,打开物理引用界面. 在碰撞矩阵中选择要与其他层相互作用的层,勾选即可.(前提是先设置好层)

物理材质 Physic Material
物理材质用来调节碰撞物体的摩擦力和弹力效果。要创建物理材质从菜单栏选择Assets->Create->Physic Material。然后从项目视图拖拽物理材质到场景的一个碰撞器上。

属性:
Dynamic Friction 动力摩擦力,对象在运动时的摩擦力,取值范围0~1,该值越大,物体受到阻力越大,越快停止运动。
Static Friction 静态摩擦力,对象被放置在表面时的摩擦力,取值范围0~1,该值越大,物体受到阻力越大,开始运动所需力也越大,取值接近0时可模拟冰的效果。
Bouncyness 弹力 0值将不反弹。1值反弹将没有任何能量损失。
Friction Combine Mode 摩擦力结合模式 ,两个碰撞物体的摩擦力是如何结合起来。
Average 使用两个摩擦力的平均值
Min 使用两个摩擦力的最小值
Max 使用两个摩擦力的最大值
Multiply 使用两个摩擦力的乘积

以上是关于unity3D中,给物体添加刚体后,为啥不是掉在地面上,而是穿过地形一直往下落呢?的主要内容,如果未能解决你的问题,请参考以下文章

Unity3D 中3D刚体组件的力

unity3d怎么添加碰撞体

unity3d里怎么给动态添加的物体添加贴图

Unity3d 碰撞问题,怎么能不穿透

Unity3D 学习教程 7 基本应用与添加刚体

unity3d/2d刚体addforce如何才能立即停下来,我人物移动每次都会滑行一会