U3D物理引擎

xiaoxiao2021-02-28  18

物理效果,布料,碰撞检测都需要rigibody刚体组件。使用物理引擎,引入力大小和速度的(最终会通过物理引擎改变transform参数),不能同时操作transform的参数,否则对transform的计算将会出现错误。 rigibody: mass是刚体的质量, drag是空气阻力,angular drag是角阻力。 is kinematic是否开启动力学,不再受物理引擎的影响transform的位置,而是直接几何操作transform,适用于模拟移动或带有铰链关节链刚体的动画。 碰撞离散碰撞(紧带rigibody之间的,为默认),连续碰撞(可与不带rigibody的网格碰撞体碰撞),连续动态碰撞(可以和不带rigibody的静态网格物体碰撞)。 contraints:是冻结某个轴的移动或者旋转。 父子级运动:刚体子物体会随着父物体移动,但是也有自己独立的力作用效果,例如随着父物体平移,但是自己会重力下降。 脚本:用addForce(), addTorque()函数对刚体物体增加力,不能直接修改transform参数。 animation:在使用布娃娃效果时候,需要在动画和物理引擎之间切换对象的控制权,勾选is kinematic即可,选择is kinematic后可以直接修改transform参数,不选择时候需要使用力。 有碰撞体的刚体才会检测碰撞(碰撞体不需要刚体可碰撞,刚体一定需要碰撞体才能碰撞),否则刚体也是可以相互穿越的。要两个碰撞体的触发器触发事件,其中一个必须是刚体。 碰撞类型参数有is trigger,选择那么会触发事件,并被物理引擎忽略。 物理材质,可以编辑各种阻力,摩擦力,弹力。 charactercontroller: 不会对施加给它的作用力作出反应,也不会作用于其它刚体,如果需要作用于其它刚体需要重载OnCtrollerColliderHit()函数内对碰撞的物体手动施加力。如果想让角色控制器受到物理引擎影响那么最好使用刚体(重力,摩擦力,弹力等)。角色控制器slope limt是坡度限制,step offset是台阶高度, skin width是皮肤厚度可以穿过的厚度注意调整防止卡住。 布料: 1)interactive cloth交互布料,存在弯曲和拉伸刚度 阻尼,厚度,自身碰撞,外部和随机加速度,摩擦力,密度,压力,撕裂因子等,交互布料和布料渲染器存在依赖关系。布料渲染器组件有一些阴影和材质的编辑。 2)蒙皮布料从蒙皮渲染器中获取顶点,可以编辑顶点的布料参数。世界速度,世界加速度,可以将角色在世界中的运动反应到布料效果上。 关节: 铰链hinge joint可以模拟门打开,钟摆效果,若指定关联的rigibody游戏对象则会围绕它弹动或摇动,如果没有指定那么是围绕世界轴或锚点弹动或摇动。 Fixed joint 固定关节,需要该游戏对象是有rigibody的对象,可以不改变物体父子结构,而临时性的将一个物体绑定到另外一个物体。 spring joint 弹簧关节,可使用一个空对象的rigibody,然后让另外一个物体跟随空物体移动,实现移动时候的弹簧效果。 character joint 主要用于表现布娃娃效果,可用于限制每个轴向上的关节。 configurable joint是physX引擎开放出来的和关节相关的属性,通过对移动/旋转的速度和加速度的设置,可以创造各种各样的关节。 力场: constant force组件可以为进入该空间区域的刚体物体,添加一个力效果,该力会使得刚体物体产生加速度。 实例: 1)地图就是一个有mesh collider的 网格物体,所以能避免掉落。 地图边界碰撞体,可以用一个平面或者一个立方体,放大缩放,添加碰撞体,勾选is trigger,去掉mesh renderer组件来实现碰撞: public class GameoverTrigger : MonoBehaviour { void OnTriggerEnter() { MarbleGameManager.SP.SetGameOver(); } } 2)让摄像机有插值的跟随物体。 void Update() { Vector3 newPos = target.position + new Vector3(0, relativeHeigth, -zDistance); transform.position = Vector3.Lerp(transform.position, newPos, Time.deltaTime * dampSpeed); } 3)操作成功和失败都是通过物理碰撞检测来实现。 void OnTriggerEnter (Collider other ) { if (other.tag == "Pickup") { MarbleGameManager.SP.FoundGem(); Destroy(other.gameObject); } else { //Other collider.. See other.tag and other.name } }
转载请注明原文地址: https://www.6miu.com/read-849996.html

最新回复(0)