Difference between revisions of "Documentation/Engine/Mover model group"
DriveSafely (talk | contribs) m |
|||
(21 intermediate revisions by one other user not shown) | |||
Line 1: | Line 1: | ||
__TOC__ | __TOC__ | ||
− | Mover model group is a new mover definition unit. | + | Mover model group is a new mover definition unit. The idea of this new unit is to have a system which can easily combine compatible models and animations. The main use is for characters to remove the need of definition for every combination of models and animations. Moreover these mover groups can use props in separate models and you can easily "skin" them to specific bones. |
The whole system consists of four units: | The whole system consists of four units: | ||
Line 7: | Line 7: | ||
== Mover desc == | == Mover desc == | ||
− | Unit <code>mover_desc</code> represents model and | + | Unit <code>mover_desc</code> represents model and its data. It is located in <code>/base/def/world/mover_desc.sii</code>. |
<pre> | <pre> | ||
mover_desc : mover_desc.worker_3 { | mover_desc : mover_desc.worker_3 { | ||
Line 73: | Line 73: | ||
* <code>model</code> Props model descriptor. | * <code>model</code> Props model descriptor. | ||
* <code>model_animation</code> Props model animation. | * <code>model_animation</code> Props model animation. | ||
− | * <code>sync_animation</code> Force time synchronization | + | * <code>sync_animation</code> Force time synchronization between props animation and mover animation. |
* <code>model_offset</code> Props placement offset. | * <code>model_offset</code> Props placement offset. | ||
* <code>model_rotation</code> Props placement rotation. | * <code>model_rotation</code> Props placement rotation. | ||
+ | '''How does it work?''' | ||
+ | |||
+ | Props is rendered and placed as separate model. Using bone A and bone B we can attach the props to the mover skeleton. There are three possible setups. | ||
+ | : '''1) No bones are set.''' | ||
+ | ::Props is placed to the mover origin plus <code>model_offset</code> and with zero rotation plus <code>model_rotation</code>. | ||
+ | :: For example a bucket on the ground. | ||
+ | : '''2) Bone A is set only.''' | ||
+ | ::Props is placed to the bone A placement plus <code>bone_offset_a</code> plus <code>model_offset</code> with bone A rotation plus <code>model_rotation</code>. | ||
+ | :: For example a sponge in one hand. | ||
+ | : '''3) Bone A and bone B are set.''' | ||
+ | ::Props is placed to the bone A placement plus <code>bone_offset_a</code> plus <code>model_offset</code> with rotation given by direction vector ('''from''' bone B placement plus <code>bone_offset_b</code> '''to''' bone A placement plus <code>bone_offset_a</code>) plus <code>model_rotation</code> | ||
+ | :: For example a broom in both hands. | ||
+ | |||
+ | == Mover model group == | ||
+ | |||
+ | Unit <code>mover_model_group</code> represents all valid combinations between specified mover desc and mover anim. It is located in <code>/base/def/world/mover.group.sii</code>. But it can placed in any mover def file. | ||
+ | <pre> | ||
+ | mover_model_group: mover.work_sw_all { | ||
+ | mover_name: "worker sweeper all" | ||
+ | |||
+ | desc_tags[]: man | ||
+ | desc_tags[]: worker | ||
+ | anim_tags[]: man | ||
+ | anim_tags[]: sweeper | ||
+ | } | ||
+ | </pre> | ||
+ | '''Properties:''' | ||
+ | * <code>desc_tags</code> Mover desc tags. | ||
+ | * <code>anim_tags</code> Mover anim tags. | ||
+ | * <code>country_specific</code> If true then only mover desc containing country tag given by mover placement will be generated. | ||
+ | '''How does it work?''' | ||
+ | |||
+ | When the unit is loaded, it collects all mover desc containing all tags from the <code>desc_tags</code> property and all mover anim containing all tags from the <code>anim_tags</code> property. When the mover is generated, it randomly chooses one of the collected mover desc and then it tries to choose one of the collected mover anim which use the '''same skeleton''' as the choosen mover desc model. | ||
+ | |||
+ | This is important because sometimes you want to have group containing models with different skeletons and animations with different skeletons. But you want only valid model-anim combinations. '''For example''' group of walking men and women where men use different skeleton than women. | ||
+ | |||
+ | '''Optimization''' | ||
+ | |||
+ | Because engine ensures that only valid model-anim combinations will be created, it may seem that animation tags should contain only tags describing the animation activity. But because the model-anim combinations are choosen in the moment of mover generation, we want to limit the combination pool as much as possible. Because of that mover anim tags should contain (apart from the activity itself) tags describing compatible mover desc. In <code>mover_anim</code> the example above these tags are <code>human</code> and <code>man</code>. And in the related mover group use these tags in <code>anim_tags</code>. In the example it is the tag <code>man</code>. |
Latest revision as of 09:26, 6 December 2022
Mover model group is a new mover definition unit. The idea of this new unit is to have a system which can easily combine compatible models and animations. The main use is for characters to remove the need of definition for every combination of models and animations. Moreover these mover groups can use props in separate models and you can easily "skin" them to specific bones.
The whole system consists of four units:
Mover desc
Unit mover_desc
represents model and its data. It is located in /base/def/world/mover_desc.sii
.
mover_desc : mover_desc.worker_3 { model_desc: "/model/mover/characters/new_generation/new/models/man/worker_vest/worker_vest_nemiro_lod0.pmd" lods[0]: "/model/mover/characters/new_generation/new/models/man/worker_vest/worker_vest_nemiro_lod1.pmd" lods[1]: "/model/mover/characters/new_generation/new/models/man/worker_vest/worker_vest_nemiro_lod2.pmd" lods[2]: "/model/mover/characters/new_generation/new/models/man/worker_vest/worker_vest_lod3.pmd" lod_distances[0]: 10 lod_distances[1]: 30 lod_distances[2]: 90 group_tags[]: human group_tags[]: man group_tags[]: cauca group_tags[]: worker }
Properties:
model_desc
Model descriptor.model_coll
Model collision.lods
Model lod descriptors.lod_distances
Lod distances.group_tags
Group tags. More about it in mover_model_group section.
Mover anim
Unit mover_anim
represents animation and its data. It is located in /base/def/world/mover_anim.sii
.
mover_anim : mover_anim.sweeper { model_anim: "/model/mover/characters/new_generation/animations/universal/sweeping_anim.pma" group_tags[]: human group_tags[]: man group_tags[]: sweeper props[]: mover_props.sweeper.broom }
Properties:
model_anim
Animation descriptor.group_tags
Group tags. More about it in mover_model_group section.props
Array of link pointers to animation props.
Mover anim props
Unit mover_anim_props
represents animation props and its settings. It is located in /base/def/world/mover_anim_props.sii
.
mover_anim_props : mover_props.sweeper.broom { model: "/model/mover/characters/new_generation/models/props/independent/broom.pmd" bone_a: lefthand bone_b: righthand bone_offset_a: (0.03, 0.08, 0) bone_offset_b: (-0.2, 0.16, -0.15) model_offset: (0.0, 0.0, -0.67) model_rotation: (0.0, 0.0, 0.0) }
Properties:
bone_a
First bone to "skin" prefix.bone_b
Second bone to "skin" prefix.bone_offset_a
Skin offset for the first bone.bone_offset_b
Skin offset for the second bone.model
Props model descriptor.model_animation
Props model animation.sync_animation
Force time synchronization between props animation and mover animation.model_offset
Props placement offset.model_rotation
Props placement rotation.
How does it work?
Props is rendered and placed as separate model. Using bone A and bone B we can attach the props to the mover skeleton. There are three possible setups.
- 1) No bones are set.
- Props is placed to the mover origin plus
model_offset
and with zero rotation plusmodel_rotation
. - For example a bucket on the ground.
- Props is placed to the mover origin plus
- 2) Bone A is set only.
- Props is placed to the bone A placement plus
bone_offset_a
plusmodel_offset
with bone A rotation plusmodel_rotation
. - For example a sponge in one hand.
- Props is placed to the bone A placement plus
- 3) Bone A and bone B are set.
- Props is placed to the bone A placement plus
bone_offset_a
plusmodel_offset
with rotation given by direction vector (from bone B placement plusbone_offset_b
to bone A placement plusbone_offset_a
) plusmodel_rotation
- For example a broom in both hands.
- Props is placed to the bone A placement plus
Mover model group
Unit mover_model_group
represents all valid combinations between specified mover desc and mover anim. It is located in /base/def/world/mover.group.sii
. But it can placed in any mover def file.
mover_model_group: mover.work_sw_all { mover_name: "worker sweeper all" desc_tags[]: man desc_tags[]: worker anim_tags[]: man anim_tags[]: sweeper }
Properties:
desc_tags
Mover desc tags.anim_tags
Mover anim tags.country_specific
If true then only mover desc containing country tag given by mover placement will be generated.
How does it work?
When the unit is loaded, it collects all mover desc containing all tags from the desc_tags
property and all mover anim containing all tags from the anim_tags
property. When the mover is generated, it randomly chooses one of the collected mover desc and then it tries to choose one of the collected mover anim which use the same skeleton as the choosen mover desc model.
This is important because sometimes you want to have group containing models with different skeletons and animations with different skeletons. But you want only valid model-anim combinations. For example group of walking men and women where men use different skeleton than women.
Optimization
Because engine ensures that only valid model-anim combinations will be created, it may seem that animation tags should contain only tags describing the animation activity. But because the model-anim combinations are choosen in the moment of mover generation, we want to limit the combination pool as much as possible. Because of that mover anim tags should contain (apart from the activity itself) tags describing compatible mover desc. In mover_anim
the example above these tags are human
and man
. And in the related mover group use these tags in anim_tags
. In the example it is the tag man
.