SC-102笔记:Unity物理系统详解

本文介绍了Unity物理引擎中的碰撞检测方法(离散、连续、预测式)、关节组件如FixedJoint、HingeJoint和SpringJoint,以及2D作用器和BoxCast、SphereCast射线检测技术。课程强调进阶知识的实用性,但实际应用需考虑复杂场景的调整。
摘要由CSDN通过智能技术生成

目录

物理引擎概论

离散碰撞检测DCD

连续碰撞检测CCD

扫动检测Sweep-based CCD

预测式检测Speculative CCD

连接关节组件

FixedJoint

HingeJoint

SpringJoint

2D作用器

AreaEffector2D

BuoyancyEffector2D

PlatformEffector

PointEffector2D

SurfaceEffector2D

BoxCast与SphereCast

BoxCast盒状射线检测

SphereCast球状射线检测

射线检测可视化

总结

关于课后习题


物理引擎概论

Unity本身主要支持刚体物理,即不可变形的物体之间的物理模拟

Unity内置的物理引擎中,3D和2D是独立的,可以从组件上看出。3D:Nvidia开发的PhysX引擎,而2D部分则是开源引擎Box2D。不能同时作用在一个物体上。

物理引擎:(1)碰撞检测(2)刚体动力学模拟

在Unity中,物理更新相比渲染的频率是不同的,在每一次物理更新时会有:

  1. 调用FixedUpdate(),更新所有物理组件的行为
  2. 唤醒所有yield WaitForFixedUpdate的协程
  3. 执行一些物理事件:例如,OnCollisionxxx()和OnTriggerxxx()

离散碰撞检测DCD

最基本的一种碰撞检测方式。

  1. 获取上一帧的位置,计算下一帧的位置
  2. 计算是否发生碰撞
  3. 若碰撞,进行碰撞的物理计算然后计算最终的位置与速度

DCD最大的缺点在于它是离散的,也就是说在高速的情况下会出现穿模的问题。

连续碰撞检测CCD

可以比较有效的解决离散碰撞检测的问题的一种碰撞检测方式。

扫动检测Sweep-based CCD

  1. 记录上一帧和下一帧的物体位置
  2. 划分扫动范围
  3. 在扫动范围内进行检测

缺点:不能处理旋转产生的碰撞;极其消耗性能,尤其是扫动范围内的物体比较多的时候

在Unity中,你可以勾选RGB的continuous或者continuous dynamic开启这种扫动检测。

预测式检测Speculative CCD

根据上一帧的数据预测当前物体的位置与速度,并且生成一个坐标轴对齐包围盒来进行碰撞检测

由于考虑到物体的角速度,对快速旋转的物体的处理比扫动检测要好。

在Unity中,你可以勾选RGB的continuous speculative开启这种扫动检测。

缺点:有时候会出现Ghost Collision的情况;另外,有时候这种碰撞检测会导致碰撞后穿模。这是由于碰撞只在AABB范围内进行,但碰撞的结果超出了AABB范围不会被检测二次碰撞。

总结:上面几种方法只是Unity中提供的方法。事实上,还有其他的碰撞检测的方法,效果也更好或者更差。

连接关节组件

FixedJoint

重要属性:

  1. Connected Body
  2. Break Force
  3. Break Torque

HingeJoint

重要属性:

  1. Connected Body
  2. Axis
  3. Anchor
  4. Break Force
  5. Break Torque

SpringJoint

重要属性:

  1. Connected Body
  2. Anchor
  3. Spring
  4. Damper
  5. Break Force
  6. 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来画出两个圆并将它们相连

总结

本节课讨论了关于碰撞检测、关节组件、作用器和射线检测的一些进阶知识。注意:虽然是进阶知识,但是和实际应用相比这些知识依然是非常简单的。实际的应用场景非常复杂,需要我们做出一些针对实际应用的变化。

关于课后习题

目前还在思考中~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值