目录
四,Crowd state triggers and transitions
一,基础概念
群集本质上是附加到粒子上的动画角色,群集模拟中的角色移动是基于DOP中的粒子模拟;
在群集模拟内,角色被称为代理(Agent),在任意时间代理是处于特定状态(如standing、walking、或running);事件(Event,称为trigger)可改变代理的状态(如从walking到running);
可让一些代理处于“idle”状态,一些处于“walk”状态;“idle”状态内,代理被附加的点保持静止,“walk”状态内,点将移动;trigger检测每个代理处于当前状态是否达到指定时间,对于满足条件的代理,状态将被转换(idle → walk或walk → idle);
群集模拟要求SOP和DOP网络:
- SOP,用于创建和定义代理,可从现有模型(如Terraria)创建代理位置;
- DOP,用于真实的群集模拟,包含控制每粒子运动的逻辑,代理可与其他动力学元素交互;
概念
- Agents,代理是群集模拟的演员(actor),一个代理是具有蒙皮几何体和动画的角色骨骼;在群集内的每粒子都有一个代理附加于它;
- Crowd source,群集模拟的源是SOP内的点,代理被拷贝到这些点上,这些点表示群集的起始位置;如未给定源点,crowd source节点会随机撒点;
- Clips,是代理处于特定状态下的动画片段(walk或run);
- States,在给定时间点,每个代理都处于特定状态(如walk、idle、attack、或run_to_goal);一个状态是被一个动画clip定义;
- Triggers and transitions,在群集模拟的每步幅,houdini均查看代理并检测一系列的触发条件;如一触发应用,将检测赋予触发的转换,以将代理改为新状态;转换有一个过渡时间,会自动融合新旧状态;
- Weights,houdini有许多有用的POP力,可使用作为行为节点以控制粒子行为;这些“steering force”本质上是添加了weights概念的粒子力,提供了有用的群集行为(如向一点移动或沿路径);在给定的时刻,代理可被多个力影响(如沿此路径和避开障碍物);群集解算器处理多个力,通过标准化weights(缩放它们以加起来为1),然后将单个力乘以标准化的权重;
- 群集解算器也有默认的权重概念的力;
- Obstacles,可指定静态的DOP对象,以让代理避开;
- Terrain,当前支持单个地形对象,代理将沿着地形,可选的IK足部适应;
二,Agent Primitives
Agent Primitives是一种packed primitive类型,通常用于表示群集内的角色;与其他packed primitive类型一样,此类型包含一个点,在许多情况下可作为一个粒子;
Agent Definition
- 一个Agent Primitive存储多个数据(代理副本间共享的数据)的引用,常被称为代理定义;
- 组成部分:rig、shape library、layers、clips、transform groups、及可选的metadata;代理的当前层、变换、通道值确定解包时的几何体;
- 当存储一组Agent Primitives时,代理定义的组件也会嵌入到几何体文件;每个组件也可单独存储,并作为外部引用对待;如,当从群集模拟存储序列帧时,可显著减低冗余数据;在这种情况下,仅存储到组件的路径;Agent render node节点可将现有的Agent Primitive代理定义写入到磁盘,或从角色rig或FBX文件创建代理定义;
Rig
- 存储代理的变换层级(被命名的变换树)和通道;
- 每个变换有一个父级,或是层级的根;如在动画片段内没有joint,或代理没有pose或clip,rest pose可被指定;
- 每个通道可提供默认值(当在动画片段内没有通道时被使用),可关联一个变换;
Shape Library
- 提供由代理使用一组几何体(外形),库内的每个外形有唯一的名字;
Layers
- 控制代理几何体(当代理解包时应使用的外形),以及外形如何变换或变形;
- 一层是由一组外形绑定组成,将外形库中的外形附加到rig中的变换(如,将命名的sword_1的外形附加到RHand的变换上);
- 每个外形绑定也对外形的边界框指定一个缩放因素,及当解包外形时将使用的变形器;如没有变形器,外形绑定是静态的,外形简单的被joint变换;
Deformers 在外形绑定中有多个变形器类型
- Skinning,这些变形器等价于Bone Deform节点的Skinning Method选项;形状几何体应为rest pose,且包含capture attributes(描述几何体咋样被变换影响);几何体基于capture attributes和代理的当前变换变形;
- Blend Shapes,使用代理的通道值提供的权重,融合一组输入的外形,等价于Blend Shape节点的操作;
Clips
- 提供动画数据,能被用于驱动代理的变换和通道值;
Transform Groups
- 是在rig内被命名的变换和通道的子集;
- 当应用clips到代理骨骼的部分时,可被使用;
- 0-1的权重值也可被赋予到组内的每个变换;
Metadata
- 可被用于在代理定义内存储额外的自定义数据(如,用于构建代理的资产信息);
- 由于是在代理实例中共享的,比在代理上创建属性更有效‘’;
- 是作为字典存储的,字典的关键字始终是字符串,值可以是字符串、数字、数组、或字典;
三,States
在给定时间点,每个代理都应在特定的状态下,如“walk”,“idle”,“attack”,或“run_to_goal”;状态可被以下定义:
- animation clip
- behavior nodes,影响粒子的运动;
- 影响代理骨骼动画的节点,如Agent Look At DOP,Agent Clip Layer DOP;
Movement behaviors
- POP Steer Align
- POP Steer Avoid
- POP Steer Cohesion
- POP Steer Obstacle
- POP Steer Path
- POP Steer Seek
- POP Steer Separate
- POP Steer Wander
- POP Steer Custom
四,Crowd state triggers and transitions
在群集模拟的每步幅,houdini均查看代理并检测一系列的触发条件;如一触发应用,将检测赋予触发的转换,以将代理改为新状态;转换有一个过渡时间,会自动融合新旧状态;
- 代理属性可用于自定义触发器;
- 多个触发/转换激活,被选择的转换在技术上是未定义的(但可能是最后一个转换);最好不要创建多个具有相同的“from”状态触发/转换;
Trigger type | What it does | Example |
Object bounds | 当代理进入、离开、或在几何体内部时激活 | 当代理超过终点线时停止跑动 |
Object attribute | 基于在代理附近一些对象的属性值激活 | 当在红灯时停,在绿灯时行走(在灯对象上使用stop属性) |
Object distance | 基于代理与对象或点云的距离激活 | 如代理离基地太远会停止转身 |
Object ray cast | 如一对象直接在代理的前面且在一定距离内激活 | 如代理看见一幅画,停下并欣赏 |
Particle speed | 基于代理的速度 | 从走到跑在到冲刺 |
Particle proximity | 基于其他代理的接近度激活 | 不同组代理接近时转换为战斗状态 |
Particle attribute lookup | 基于代理属性的某个值活 | 如代理的health属性太低切换为待死状态 |
Particle attribute comparison | 基于将代理属性值与附加代理相比较激活 | 代理逃离更大的对手 |
Time | 基于场景时间激活 | 穿过场景一半时代理跑动 |
Current state duration | 基于代理在当前状态的时间 | 警卫在30秒后离开“警戒”状态 |
Animated parameter | 基于触发节点的参数(可手动K帧或表达式) | 代理对其他部分手动动画事件做出反应 |
Custom VEXpression | 基于变量的值激活 | 对更加复杂或自定义要求使用 |
RBD impact data | 当代理被一个对象撞击并impact大于阈值时激活 | 代理被箭击中并转化为ragdolls |
Animation clip loops | 基于代理当前动画片段的循环次数激活 | 代理在弹跳一定次数时跑动 |
Look At target | 基于代理当前查看目标 | 代理在看画5秒后开始跑动 |
RBD sticky collisions | 基于发生在代理上的粘性碰撞次数激活 | 代理被箭集中(黏在他们上)转化为ragdolls |
五,Caches
当存储agent primitives到磁盘时,它们的共享代理定义也会嵌入到几何体文件,以便在加载文件时可重建代理;
代理定义的每个组件可被标记为磁盘上文件的外部引用,如当Agent SOP节点Input参数设置为Disk,或使用Agent Clip SOP节点从磁盘加载动画片段;在这个情况下,仅有文件路径存储在几何体文件(当存储代理定义),可显著降低几何体文件尺寸;
当从几何体文件加载代理时,代理定义和任何外部引用文件也被从磁盘读取;如代理定义不包含外部引用,可能会在加载序列文件时降低性能;除了必须加载更大文件外,每文件代理定义的单独副本可能降低视图性能,由于代理定义每帧改变;
如果代理定义是外部引用,houdini能避免每帧重复加载代理定义文件以提高性能;houdini维护一个代理定义的引用计数缓存,当没有代理引用这些文件,entries会被移除;建议设置File SOP的Cache Frames参数至少为1;否则,当在加载下一个文件前几何体被清理,导致代理定义不必要的刷新和加载;