Unity Physics 中的马达(Motors)

自 ECS for Unity 预发布以来,1.0.0-pre.22 版起的 Unity Physics 就开始支持马达(motor)。马达是一种特殊关节,关节的一端会向目标方位施加驱动力。这个目标既可以是位置,即马达会一直尝试抵达该位置,也可以是向量,即马达会尽量保持一定的向量。目前,Unity Physics 支持四种马达(两种位置马达和两种向量马达):
  1. 驱动铰链结构向特定角度运动的 旋转马达
  2. 驱动铰链结构按一定角速度绕轴心旋转的 角速度马达
  3. 驱动对象向目标位置移动的 运动马达
  4. 驱动对象以一定矢量移动的 线速度马达
每种马达都受 Unity PhysicsHavok Physics for Unity 支持。

马达类型

在介绍各个马达之前,我们可以先去 GitHub 上的 PhysicsSamples 项目里找到演示,并在 Unity 说明文档 里找到详细说明。文档描述了几种建立上述马达的方式,包括用 GameObject、C# 脚本或 Unity Physics Custom Authoring Component。

旋转马达

旋转马达是一种向特定角度运动的铰链关节,类似于一个弹簧铰链。
在开发时,我们联想到的是可以自动关闭的弹簧门。也可以是(比如对抗重力)固定在某个角度的关节。
要想创建一扇自动关闭的门,我们可以为 Door 对象 添加带有以下参数的 Hinge Joint ,将 Connected Body 连接到带静态刚体(Rigidbody)的 Wall 上。注意,要想让马达执行位置的运动,我们必须启用 Use Spring 并禁用 Use Motor (这会让马达产生矢量运动)。
图示:弹簧门的 Hinge Joint 配置,Target Position 被设为 0 度,Break Torque 被设为 900。

角速度马达

假设我们想把弹簧门变成旋转门,那就需要将运动目标设为一个矢量而非位置。我们可以拿一个圆柱体当作父对象,再加上马达和几个代表门的长方体。
我们来看看把 Hinge Joint 变成角速度马达的设定:
图示:旋转门的 Hinge Joint 设定,Target Motor Velocity 设为了 90 度,Motor Force 为 1000,这是马达可施加的最大力。
如上方视频所示,我们可以手动加快或减慢马达的速度,影响马达的模拟。视频里的 Motor Force 是 1000。如果这个力被设为无限大,则无法对马达施加影响。

运动马达

运动马达是一种驱动对象向特定位置移动的单轴关节,其行为与弹簧关节非常类似。我们可以用它来实现类似弹簧伸展到特定长度的运动。另一种用法是浮动平台或滑动门。假设我们希望做几个浮动平台:
图示:浮动平台配置
要建立运动马达,请设好 Configurable Joint 的 Target Position 、 X Drive: Position Spring 和 X Drive: Maximum Force 字段。下方设定好的 Configurable Joint 可以让场景内的平台从左侧移动到右侧:
图示:从左往右运动的 Configurable Joint 设定
在视频里,无论 Position Spring 字段的设定如何,平台在到达目标位置后都会被弹开。这是因为马达使用着默认的 Unity Physics 弹力与阻尼参数。
目前,要规避这种现象,我们可以用脚本来创建马达,直接设置 SpringFrequency 和 SpringDamping 的数值。实际上,用脚本创建马达更为合适,因为我们能更灵活地根据项目代码做出调整,调整弹力和阻尼参数,或者定时改变运动方向。

线速度马达

线速度马达一般可用在火箭推进器上,也能用来驱动火车、平台或其他任意事物。
本示例中,我们用简单形状做了两艘火箭,为箭身添加了一个 Configurable Joint。向右飞行的火箭重量为 10 千克,目标速度为 3 米/秒,向左飞行的火箭重量为 20 千克,目标速度为 4 米/秒。
下方为右向飞行火箭的参数(未包括所有 Configurable Joint 选项,未展示的选项仍为默认,未经修改)。需要注意的是设为 -3、0、0 米/秒的 Target Velocity 。目标速度的正负会相对于对象未来的位置而定,负数会推动火箭前进。
在 X Drive 部分, Position Damper 被随意设为了 10,Maximum Force 为 2000。另一艘火箭的 Maximum Force 则为 1000。这个差别影响着改变马达运动轨迹所需的力,如果右向火箭的 Maximum Force 被设为无限,则火箭不会受外力影响改变航向,但另一艘火箭会。
图示:产生线性运动的 Configurable Joint 设定。

未来计划

Unity Physics 提供的基础性关节功能可以有非常多的用法。未来,我们会继续简化工作流,打磨内置 Physics 组件的功能。比如让组件的弹力和阻尼参数支持马达,支持烘焙 Configurable Joint 编辑组件。这些改进可让关节更为耐用,包括那些绕多条轴运动的关节(比如 active ragdolls)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值