U3D物理引擎

物理效果,布料,碰撞检测都需要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
}
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值