目录
物理引擎概论
Unity本身主要支持刚体物理,即不可变形的物体之间的物理模拟
Unity内置的物理引擎中,3D和2D是独立的,可以从组件上看出。3D:Nvidia开发的PhysX引擎,而2D部分则是开源引擎Box2D。不能同时作用在一个物体上。
物理引擎:(1)碰撞检测(2)刚体动力学模拟
在Unity中,物理更新相比渲染的频率是不同的,在每一次物理更新时会有:
- 调用FixedUpdate(),更新所有物理组件的行为
- 唤醒所有yield WaitForFixedUpdate的协程
- 执行一些物理事件:例如,OnCollisionxxx()和OnTriggerxxx()
离散碰撞检测DCD
最基本的一种碰撞检测方式。
- 获取上一帧的位置,计算下一帧的位置
- 计算是否发生碰撞
- 若碰撞,进行碰撞的物理计算然后计算最终的位置与速度
DCD最大的缺点在于它是离散的,也就是说在高速的情况下会出现穿模的问题。
连续碰撞检测CCD
可以比较有效的解决离散碰撞检测的问题的一种碰撞检测方式。
扫动检测Sweep-based CCD
- 记录上一帧和下一帧的物体位置
- 划分扫动范围
- 在扫动范围内进行检测
缺点:不能处理旋转产生的碰撞;极其消耗性能,尤其是扫动范围内的物体比较多的时候
在Unity中,你可以勾选RGB的continuous或者continuous dynamic开启这种扫动检测。
预测式检测Speculative CCD
根据上一帧的数据预测当前物体的位置与速度,并且生成一个坐标轴对齐包围盒来进行碰撞检测
由于考虑到物体的角速度,对快速旋转的物体的处理比扫动检测要好。
在Unity中,你可以勾选RGB的continuous speculative开启这种扫动检测。
缺点:有时候会出现Ghost Collision的情况;另外,有时候这种碰撞检测会导致碰撞后穿模。这是由于碰撞只在AABB范围内进行,但碰撞的结果超出了AABB范围不会被检测二次碰撞。
总结:上面几种方法只是Unity中提供的方法。事实上,还有其他的碰撞检测的方法,效果也更好或者更差。
连接关节组件
FixedJoint
重要属性:
- Connected Body
- Break Force
- Break Torque
HingeJoint
重要属性:
- Connected Body
- Axis
- Anchor
- Break Force
- Break Torque
SpringJoint
重要属性:
- Connected Body
- Anchor
- Spring
- Damper
- Break Force
- Break Torque
2D作用器
AreaEffector2D
对整个内部区域施力
BuoyancyEffector2D
实现内部的浮力
PlatformEffector
实现了单向的平台跳跃
PointEffector2D
从某点向四周的物体施加吸引力或者斥力
SurfaceEffector2D
让接触表面的物体沿着表面运动。类似于传送带。
BoxCast与SphereCast
有时候,简单的Raycast不能完全满足我们的需求。
BoxCast盒状射线检测
参数列表:origin,size,angle,direction,distance,layermask
一般适用于方形物体
SphereCast球状射线检测
参数列表:origin,radius,direction,distance,layermask
一般适用于球形物体。
除了上述的三种检测之外,还有其他的一些检测方式
射线检测可视化
对于普通射线检测可以使用debug.Drawray函数。
对于盒状射线检测,需要很多的debug.drawline并且将他们相连。
对于球状射线检测,可以使用Gizmos类调用函数DrawWireSphere来画出两个圆并将它们相连
总结
本节课讨论了关于碰撞检测、关节组件、作用器和射线检测的一些进阶知识。注意:虽然是进阶知识,但是和实际应用相比这些知识依然是非常简单的。实际的应用场景非常复杂,需要我们做出一些针对实际应用的变化。
关于课后习题
目前还在思考中~