Unity3D学习笔记(十一)物理引擎:刚体与力

四个世纪前,物理学家牛顿发现了万有引力,并延伸出三大牛顿定理,为之后的物理学界的发展奠定了强大的理论基础。牛顿有句话我很喜欢:“如果说我看得比较远的话,那是因为我站在巨人的肩膀上。”

做游戏设计也是一样的,我们写策划文档需要Word、Excel、Visio等办公软件,写程序需要Visual Studio、Eclipse等各种集成开发环境、美术需要3dsMax、Maya、Photoshop……正因为有了这些强大工具,我们的生产力才会越来越高效。所以用记事本写代码、用Windows画图画蒙娜丽莎什么的,只是个人能力的体现,保留一份敬佩的心情就好了,可别真应用到实际工作中哦,老板会疯掉的^_^。

话说不知道当年那个给牛顿带来启迪的苹果,到底是掉在了地上还是真的掉在了牛顿的头上,总之它就是往下掉了。运用基本的初中物理知识我们就知道这是因为地球对苹果施加了重力。同样的还有在“愤怒的小鸟”中,我们把小鸟用弹弓弹向空中之后,始终都会掉落在地面上。在大部分物理引擎中,都可以使用刚体(RigidBody)来模拟这种效果,Unity也不例外。

看下官方文档中对刚体的说明:当一个游戏对象被赋予刚体组件之后,游戏引擎就会对其进行物理效果模拟。同时我们也可以给这个对象施加各种作用力,让它运动起来。另外如果要实现重力的效果,那么相应的游戏物体都必须附上刚体组件。

Unity3D学习笔记(十一)物理引擎:刚体与力_第1张图片 

我在Unity中导入了一个苹果的模型来实验一下重力的效果,选中模型并添加刚体组件。(主菜单→Component(组件)→Physics(物理)→RigidBody(刚体),添加组件的操作都很类似,以后不再赘述。)可以看到属性列表并不是很复杂,稍微介绍一下:


  • Mass(质量): 学过物理的同学们都知道的吧,质量越大,惯性越大。这里的单位可以自己统一规定,但是官方给出的建议是场景中的物体质量最好不要相差100倍率以上。估计是防止两个质量相差太大的物体碰撞后会产生过大的速度,从而影响游戏性能吧。
  • Drag(阻力):这里指的是空气阻力,当游戏物体收到某个作用力的时候,这个值越大越难移动。如果设置成无限的话,物体会立即停止移动。
  • Angular Drag(角阻力): 同样指的是空气阻力,只不过是用来阻碍物体旋转的。如果设置成无限的话,物体会立即停止旋转。
  • Use Gravity(使用重力): 勾选了这个项,游戏对象就会受到重力影响。
  • Is Kinematic(是否动态): 勾选这个选项会使游戏对象不受物理引擎的影响,但这不等同于没有刚体组件。这通常用于需要用动画控制的刚体,这样就不会因为惯性而影响动画了。
  • Interplate(差值类型):如果看到刚体移动的时候一直抽风或者运动的不是很平滑,可以选择一种平滑方式: None(无差值):不使用差值平滑。 Interpolate(差值):根据上一帧来平滑移动。 Extrapolate(推算):根据推算下一帧物体的位置来平滑移动。
  • Collision Detection(碰撞检测方式): Discrete(离散):默认的碰撞检测方式。但若当物体A运动很快的时候,有可能前一帧还在B物体的前面,后一帧就在B物体后面了,这种情况下不会触发碰撞事件,所以如果需要检测这种情况,那就必须使用后两种检测方式。 Continuous(连续):这种方式可以与有静态网格碰撞器的游戏对象进行碰撞检测。 Continuous Dynamic(动态连续):这种方式可以与所有设置了2或3方式的游戏对象进行碰撞检测。
  • Freeze Position/Rotation(冻结位置/旋转): 可以对物体在X、Y、Z三个轴上的位置/旋转进行锁定,即使受到相应的力也不会改变,但可以通过脚本来修改。

了解完刚体组件的设置参数后,直接点击测试运行游戏按钮(记得把摄像机对准苹果),结果发现苹果的确是往下坠了,但是并没有停在地面上,而是穿过去了,囧。检查一下发现原来忘了添加碰撞器,于是找个球形碰撞器附加到苹果上就OK了。貌似Unity还自动匹配了碰撞器的大小,省得我自己再调整,真是体贴呀。

Unity3D学习笔记(十一)物理引擎:刚体与力_第2张图片 

如上图所示,绿色的曲线就代表了苹果所带有的球体碰撞器,此时如果运行游戏的话可以发现苹果正确地落到了地上。但是还有个问题,因为我场景里的地形不是水平的,所以苹果落地以后会慢慢慢慢滚向湖中心……给地形添加了碰撞材质貌似苹果还是义无反顾地向湖中心奔去,如果有哪位高人路过还望指点一二。

最后顺便再提一下恒力组件(Constant Force),由于比较容易理解我就不做详细介绍了。一共有4个参数,分别是Force/Relative Force(世界/相对作用力)、Torque/Relative Torque(世界/相对扭力)。

这些参数代表了附加在刚体上的XYZ轴方向恒力的大小,另外还要注意必须是刚体才可以添加恒力。有兴趣可以自己尝试一下给物体一个Y轴方向的力,物体就会像火箭一样飞向天际,哈哈。

你可能感兴趣的:(Unity3D学习笔记(十一)物理引擎:刚体与力)