I'm shaking off the rust to try to figure out what you are saying about the translation and the axis. From your bike screenshot it looks like you using the same alignment in Fragmo I used to use.
...
You are using Reacher's puppets, same as me. And I see you know about setting verbs...
...
I think so: z-axis upwards from the puppet's point of view. Here you the layout:
2017-02-14_074450.jpg 195.51KB
1 downloads
This is the StateMachine file, with machine states and the definition of the transitions for both the puppet (subject) and the bike (object):
<StateMachine>
<NameMap>
<State>
<name>JMHBP_BIKEHELD</name>
<resources class="enum-set" enum-type="Resource">LEFT_ARM,RIGHT_ARM,TORSO,LEFT_LEG,RIGHT_LEG</resources>
</State>
<State>
<name>JMHBP_WALKING</name>
<resources class="enum-set" enum-type="Resource">LEFT_ARM,RIGHT_ARM,TORSO,LEFT_LEG,RIGHT_LEG</resources>
</State>
<State>
<name>JMHBP_MOUNT</name>
<resources class="enum-set" enum-type="Resource">LEFT_ARM,RIGHT_ARM,TORSO,LEFT_LEG,RIGHT_LEG</resources>
</State>
<State>
<name>JMHBP_RIDING</name>
<resources class="enum-set" enum-type="Resource">LEFT_ARM,RIGHT_ARM,TORSO,LEFT_LEG,RIGHT_LEG</resources>
</State>
</NameMap>
<NameMap>
<AnimTransition>
<menuPath>Interact/Bike/bike_get</menuPath>
<soundTime>0.0</soundTime>
<soundLevel>1.0</soundLevel>
<interest>0</interest>
<name>interact/bike/bike_get</name>
<startState>IDLE</startState>
<nextState>JMHBP_BIKEHELD</nextState>
<resources class="enum-set" enum-type="Resource">LEFT_ARM,RIGHT_ARM,TORSO,LEFT_LEG,RIGHT_LEG</resources>
</AnimTransition>
<AnimTransition>
<menuPath>Interact/Bike/bike_hold12</menuPath>
<soundTime>0.0</soundTime>
<soundLevel>1.0</soundLevel>
<interest>0</interest>
<name>interact/bike/bike_hold12</name>
<startState>JMHBP_BIKEHELD</startState>
<nextState>JMHBP_BIKEHELD</nextState>
<resources class="enum-set" enum-type="Resource">LEFT_ARM,RIGHT_ARM,TORSO,LEFT_LEG,RIGHT_LEG</resources>
</AnimTransition>
<AnimTransition>
<menuPath>Interact/Bike/bike_hold24</menuPath>
<soundTime>0.0</soundTime>
<soundLevel>1.0</soundLevel>
<interest>0</interest>
<name>interact/bike/bike_hold24</name>
<startState>JMHBP_BIKEHELD</startState>
<nextState>JMHBP_BIKEHELD</nextState>
<resources class="enum-set" enum-type="Resource">LEFT_ARM,RIGHT_ARM,TORSO,LEFT_LEG,RIGHT_LEG</resources>
</AnimTransition>
<AnimTransition>
<menuPath>Interact/Bike/bike_leave</menuPath>
<soundTime>0.0</soundTime>
<soundLevel>1.0</soundLevel>
<interest>0</interest>
<name>interact/bike/bike_leave</name>
<startState>JMHBP_BIKEHELD</startState>
<nextState>IDLE</nextState>
<resources class="enum-set" enum-type="Resource">LEFT_ARM,RIGHT_ARM,TORSO,LEFT_LEG,RIGHT_LEG</resources>
</AnimTransition>
<AnimTransition>
<menuPath>Interact/Bike/bike_walk_start</menuPath>
<soundTime>0.0</soundTime>
<soundLevel>1.0</soundLevel>
<interest>0</interest>
<name>interact/bike/bike_walk_start</name>
<startState>JMHBP_BIKEHELD</startState>
<nextState>JMHBP_WALKING</nextState>
<resources class="enum-set" enum-type="Resource">LEFT_ARM,RIGHT_ARM,TORSO,LEFT_LEG,RIGHT_LEG</resources>
</AnimTransition>
<AnimTransition>
<menuPath>Interact/Bike/bike_walk_loop</menuPath>
<soundTime>0.0</soundTime>
<soundLevel>1.0</soundLevel>
<interest>0</interest>
<name>interact/bike/bike_walk_loop</name>
<startState>JMHBP_WALKING</startState>
<nextState>JMHBP_WALKING</nextState>
<resources class="enum-set" enum-type="Resource">LEFT_ARM,RIGHT_ARM,TORSO,LEFT_LEG,RIGHT_LEG</resources>
</AnimTransition>
<AnimTransition>
<menuPath>Interact/Bike/bike_walk_stop</menuPath>
<soundTime>0.0</soundTime>
<soundLevel>1.0</soundLevel>
<interest>0</interest>
<name>interact/bike/bike_walk_stop</name>
<startState>JMHBP_WALKING</startState>
<nextState>JMHBP_BIKEHELD</nextState>
<resources class="enum-set" enum-type="Resource">LEFT_ARM,RIGHT_ARM,TORSO,LEFT_LEG,RIGHT_LEG</resources>
</AnimTransition>
<AnimTransition>
<menuPath>Interact/Bike/bike_mount</menuPath>
<soundTime>0.0</soundTime>
<soundLevel>1.0</soundLevel>
<interest>0</interest>
<name>interact/bike/bike_mount</name>
<startState>JMHBP_BIKEHELD</startState>
<nextState>JMHBP_MOUNT</nextState>
<resources class="enum-set" enum-type="Resource">LEFT_ARM,RIGHT_ARM,TORSO,LEFT_LEG,RIGHT_LEG</resources>
</AnimTransition>
<AnimTransition>
<menuPath>Interact/Bike/bike_mounted12</menuPath>
<soundTime>0.0</soundTime>
<soundLevel>1.0</soundLevel>
<interest>0</interest>
<name>interact/bike/bike_mounted12</name>
<startState>JMHBP_MOUNT</startState>
<nextState>JMHBP_MOUNT</nextState>
<resources class="enum-set" enum-type="Resource">LEFT_ARM,RIGHT_ARM,TORSO,LEFT_LEG,RIGHT_LEG</resources>
</AnimTransition>
<AnimTransition>
<menuPath>Interact/Bike/bike_mounted24</menuPath>
<soundTime>0.0</soundTime>
<soundLevel>1.0</soundLevel>
<interest>0</interest>
<name>interact/bike/bike_mounted24</name>
<startState>JMHBP_MOUNT</startState>
<nextState>JMHBP_MOUNT</nextState>
<resources class="enum-set" enum-type="Resource">LEFT_ARM,RIGHT_ARM,TORSO,LEFT_LEG,RIGHT_LEG</resources>
</AnimTransition>
<AnimTransition>
<menuPath>Interact/Bike/bike_ride_start</menuPath>
<soundTime>0.0</soundTime>
<soundLevel>1.0</soundLevel>
<interest>0</interest>
<name>interact/bike/bike_ride_start</name>
<startState>JMHBP_MOUNT</startState>
<nextState>JMHBP_RIDING</nextState>
<resources class="enum-set" enum-type="Resource">LEFT_ARM,RIGHT_ARM,TORSO,LEFT_LEG,RIGHT_LEG</resources>
</AnimTransition>
<AnimTransition>
<menuPath>Interact/Bike/bike_ride</menuPath>
<soundTime>0.0</soundTime>
<soundLevel>1.0</soundLevel>
<interest>0</interest>
<name>interact/bike/bike_ride</name>
<startState>JMHBP_RIDING</startState>
<nextState>JMHBP_RIDING</nextState>
<resources class="enum-set" enum-type="Resource">LEFT_ARM,RIGHT_ARM,TORSO,LEFT_LEG,RIGHT_LEG</resources>
</AnimTransition>
<AnimTransition>
<menuPath>Interact/Bike/bike_ridenp</menuPath>
<soundTime>0.0</soundTime>
<soundLevel>1.0</soundLevel>
<interest>0</interest>
<name>interact/bike/bike_ridenp</name>
<startState>JMHBP_RIDING</startState>
<nextState>JMHBP_RIDING</nextState>
<resources class="enum-set" enum-type="Resource">LEFT_ARM,RIGHT_ARM,TORSO,LEFT_LEG,RIGHT_LEG</resources>
</AnimTransition>
<AnimTransition>
<menuPath>Interact/Bike/bike_ride_stop</menuPath>
<soundTime>0.0</soundTime>
<soundLevel>1.0</soundLevel>
<interest>0</interest>
<name>interact/bike/bike_ride_stop</name>
<startState>JMHBP_RIDING</startState>
<nextState>JMHBP_MOUNT</nextState>
<resources class="enum-set" enum-type="Resource">LEFT_ARM,RIGHT_ARM,TORSO,LEFT_LEG,RIGHT_LEG</resources>
</AnimTransition>
<AnimTransition>
<menuPath>Interact/Bike/bike_umount</menuPath>
<soundTime>0.0</soundTime>
<soundLevel>1.0</soundLevel>
<interest>0</interest>
<name>interact/bike/bike_umount</name>
<startState>JMHBP_MOUNT</startState>
<nextState>JMHBP_BIKEHELD</nextState>
<resources class="enum-set" enum-type="Resource">LEFT_ARM,RIGHT_ARM,TORSO,LEFT_LEG,RIGHT_LEG</resources>
</AnimTransition>
<AnimTransition>
<menuPath>bike_get</menuPath>
<soundTime>0.0</soundTime>
<soundLevel>1.0</soundLevel>
<interest>0</interest>
<name>bike_get</name>
<resources class="enum-set" enum-type="Resource"></resources>
</AnimTransition>
<AnimTransition>
<menuPath>bike_hold12</menuPath>
<soundTime>0.0</soundTime>
<soundLevel>1.0</soundLevel>
<interest>0</interest>
<name>bike_hold12</name>
<resources class="enum-set" enum-type="Resource"></resources>
</AnimTransition>
<AnimTransition>
<menuPath>bike_hold24</menuPath>
<soundTime>0.0</soundTime>
<soundLevel>1.0</soundLevel>
<interest>0</interest>
<name>bike_hold24</name>
<resources class="enum-set" enum-type="Resource"></resources>
</AnimTransition>
<AnimTransition>
<menuPath>bike_leave</menuPath>
<soundTime>0.0</soundTime>
<soundLevel>1.0</soundLevel>
<interest>0</interest>
<name>bike_leave</name>
<resources class="enum-set" enum-type="Resource"></resources>
</AnimTransition>
<AnimTransition>
<menuPath>bike_walk_start</menuPath>
<soundTime>0.0</soundTime>
<soundLevel>1.0</soundLevel>
<interest>0</interest>
<name>bike_walk_start</name>
<resources class="enum-set" enum-type="Resource"></resources>
</AnimTransition>
<AnimTransition>
<menuPath>bike_walk_loop</menuPath>
<soundTime>0.0</soundTime>
<soundLevel>1.0</soundLevel>
<interest>0</interest>
<name>bike_walk_loop</name>
<resources class="enum-set" enum-type="Resource"></resources>
</AnimTransition>
<AnimTransition>
<menuPath>bike_walk_stop</menuPath>
<soundTime>0.0</soundTime>
<soundLevel>1.0</soundLevel>
<interest>0</interest>
<name>bike_walk_stop</name>
<resources class="enum-set" enum-type="Resource"></resources>
</AnimTransition>
<AnimTransition>
<menuPath>bike_mount</menuPath>
<soundTime>0.0</soundTime>
<soundLevel>1.0</soundLevel>
<interest>0</interest>
<name>bike_mount</name>
<resources class="enum-set" enum-type="Resource"></resources>
</AnimTransition>
<AnimTransition>
<menuPath>bike_mounted12</menuPath>
<soundTime>0.0</soundTime>
<soundLevel>1.0</soundLevel>
<interest>0</interest>
<name>bike_mounted12</name>
<resources class="enum-set" enum-type="Resource"></resources>
</AnimTransition>
<AnimTransition>
<menuPath>bike_mounted24</menuPath>
<soundTime>0.0</soundTime>
<soundLevel>1.0</soundLevel>
<interest>0</interest>
<name>bike_mounted24</name>
<resources class="enum-set" enum-type="Resource"></resources>
</AnimTransition>
<AnimTransition>
<menuPath>bike_ride_start</menuPath>
<soundTime>0.0</soundTime>
<soundLevel>1.0</soundLevel>
<interest>0</interest>
<name>bike_ride_start</name>
<resources class="enum-set" enum-type="Resource"></resources>
</AnimTransition>
<AnimTransition>
<menuPath>bike_ride</menuPath>
<soundTime>0.0</soundTime>
<soundLevel>1.0</soundLevel>
<interest>0</interest>
<name>bike_ride</name>
<resources class="enum-set" enum-type="Resource"></resources>
</AnimTransition>
<AnimTransition>
<menuPath>bike_ridenp</menuPath>
<soundTime>0.0</soundTime>
<soundLevel>1.0</soundLevel>
<interest>0</interest>
<name>bike_ridenp</name>
<resources class="enum-set" enum-type="Resource"></resources>
</AnimTransition>
<AnimTransition>
<menuPath>bike_ride_stop</menuPath>
<soundTime>0.0</soundTime>
<soundLevel>1.0</soundLevel>
<interest>0</interest>
<name>bike_ride_stop</name>
<resources class="enum-set" enum-type="Resource"></resources>
</AnimTransition>
<AnimTransition>
<menuPath>bike_umount</menuPath>
<soundTime>0.0</soundTime>
<soundLevel>1.0</soundLevel>
<interest>0</interest>
<name>bike_umount</name>
<resources class="enum-set" enum-type="Resource"></resources>
</AnimTransition>
</NameMap>
</StateMachine>
And the Verbs file:
<vector>
<PropVerb>
<modelB>Bike</modelB>
<animA>interact/bike/bike_get</animA>
<animB>bike_get</animB>
<rot180Subj>false</rot180Subj>
<name>Bike/Get bike</name>
<subjectClass>mscope.things.Character</subjectClass>
<objectClass>mscope.things.Prop</objectClass>
</PropVerb>
<PropVerb>
<modelB>Bike</modelB>
<animA>interact/bike/bike_hold12</animA>
<animB>bike_hold12</animB>
<rot180Subj>false</rot180Subj>
<name>Bike/Hold 0.5 sec</name>
<subjectClass>mscope.things.Character</subjectClass>
<objectClass>mscope.things.Prop</objectClass>
</PropVerb>
<PropVerb>
<modelB>Bike</modelB>
<animA>interact/bike/bike_hold24</animA>
<animB>bike_hold24</animB>
<rot180Subj>false</rot180Subj>
<name>Bike/Hold 1 sec</name>
<subjectClass>mscope.things.Character</subjectClass>
<objectClass>mscope.things.Prop</objectClass>
</PropVerb>
<PropVerb>
<modelB>Bike</modelB>
<animA>interact/bike/bike_leave</animA>
<animB>bike_leave</animB>
<rot180Subj>false</rot180Subj>
<name>Bike/Leave</name>
<subjectClass>mscope.things.Character</subjectClass>
<objectClass>mscope.things.Prop</objectClass>
</PropVerb>
<PropVerb>
<modelB>Bike</modelB>
<animA>interact/bike/bike_walk_start</animA>
<animB>bike_walk_start</animB>
<rot180Subj>false</rot180Subj>
<name>Bike/Start walk with bike</name>
<subjectClass>mscope.things.Character</subjectClass>
<objectClass>mscope.things.Prop</objectClass>
</PropVerb>
<PropVerb>
<modelB>Bike</modelB>
<animA>interact/bike/bike_walk_loop</animA>
<animB>bike_walk_loop</animB>
<rot180Subj>false</rot180Subj>
<name>Bike/Walk with bike</name>
<subjectClass>mscope.things.Character</subjectClass>
<objectClass>mscope.things.Prop</objectClass>
</PropVerb>
<PropVerb>
<modelB>Bike</modelB>
<animA>interact/bike/bike_walk_stop</animA>
<animB>bike_walk_stop</animB>
<rot180Subj>false</rot180Subj>
<name>Bike/Stop walking with bike</name>
<subjectClass>mscope.things.Character</subjectClass>
<objectClass>mscope.things.Prop</objectClass>
</PropVerb>
<PropVerb>
<modelB>Bike</modelB>
<animA>interact/bike/bike_mount</animA>
<animB>bike_mount</animB>
<rot180Subj>false</rot180Subj>
<name>Bike/Mount bike</name>
<subjectClass>mscope.things.Character</subjectClass>
<objectClass>mscope.things.Prop</objectClass>
</PropVerb>
<PropVerb>
<modelB>Bike</modelB>
<animA>interact/bike/bike_mounted12</animA>
<animB>bike_mounted12</animB>
<rot180Subj>false</rot180Subj>
<name>Bike/Mounted 0.5 sec</name>
<subjectClass>mscope.things.Character</subjectClass>
<objectClass>mscope.things.Prop</objectClass>
</PropVerb>
<PropVerb>
<modelB>Bike</modelB>
<animA>interact/bike/bike_mounted24</animA>
<animB>bike_mounted24</animB>
<rot180Subj>false</rot180Subj>
<name>Bike/Mounted 1 sec</name>
<subjectClass>mscope.things.Character</subjectClass>
<objectClass>mscope.things.Prop</objectClass>
</PropVerb>
<PropVerb>
<modelB>Bike</modelB>
<animA>interact/bike/bike_ride_start</animA>
<animB>bike_ride_start</animB>
<rot180Subj>false</rot180Subj>
<name>Bike/Start Riding</name>
<subjectClass>mscope.things.Character</subjectClass>
<objectClass>mscope.things.Prop</objectClass>
</PropVerb>
<PropVerb>
<modelB>Bike</modelB>
<animA>interact/bike/bike_ride</animA>
<animB>bike_ride</animB>
<rot180Subj>false</rot180Subj>
<name>Bike/Ride</name>
<subjectClass>mscope.things.Character</subjectClass>
<objectClass>mscope.things.Prop</objectClass>
</PropVerb>
<PropVerb>
<modelB>Bike</modelB>
<animA>interact/bike/bike_ridenp</animA>
<animB>bike_ridenp</animB>
<rot180Subj>false</rot180Subj>
<name>Bike/Ride (not pedaling)</name>
<subjectClass>mscope.things.Character</subjectClass>
<objectClass>mscope.things.Prop</objectClass>
</PropVerb>
<PropVerb>
<modelB>Bike</modelB>
<animA>interact/bike/bike_ride_stop</animA>
<animB>bike_ride_stop</animB>
<rot180Subj>false</rot180Subj>
<name>Bike/Stop Riding</name>
<subjectClass>mscope.things.Character</subjectClass>
<objectClass>mscope.things.Prop</objectClass>
</PropVerb>
<PropVerb>
<modelB>Bike</modelB>
<animA>interact/bike/bike_umount</animA>
<animB>bike_umount</animB>
<rot180Subj>false</rot180Subj>
<name>Bike/Get off the bike</name>
<subjectClass>mscope.things.Character</subjectClass>
<objectClass>mscope.things.Prop</objectClass>
</PropVerb>
</vector>
What I've found about Puppet-Prop interaction animations thus far:
1) Puppet should start the animation sequence centered and in its default pose (IDLE state).
2) Prop should start displaced in relation to the puppet.
3) No transformation (ie, translation or rotation) of the Prop's root bone will work when executed on Moviestorm. For example, for the tilting of the bike, at first I used a rotation of the root bone to no avail. I needed to create a new bone (and made it the parent for every else bone) at the same position of the root bone to this only purpose:
2017-02-14_075504.jpg 39.21KB
1 downloads
This means the prop can be moved only by using one of these approaches:
- flagging it as mobile prop, but, CAVEAT EMPTOR: puppet won't follow him!
- placing it (and the puppet) on a navmesh. I've been wondering if making a navmesh part of it will work... Have to try.
I don't know whether this is always the case or there are some conditions to be met for the transformations of the prop's root bone being executed (in a similar fashion as it happens with the puppet's: they're ignored unless they concur with a transformation of any leg bone in any keyframe of the animation)
4) Both rotations and transformations can be applied to the puppet's root bone and they will work... somehow. No issues at all with rotations. But translations is a completely different thing, because of this apparent disagreement in the orientation of the x & y axis.
I made a prop that was carried,the staff in my giant fantasy pack (that consists of only the staff) which was carried and used in a jumping animation. That should be the same concept as riding a bike, unless I'm confused and missing something. I never had to transform any root bone transformations. It followed along the lines of the the held prop tutorial with animations for the puppet and prop with the same name put in the appropriate folders....but...I think you may be missing the setting of the verbs in Moviestorm if there is any movement at all of the root bone from it's original position to the end position.
In a held prop animation you shouldn't (though from a technical point of view I think they're not strictly forbidden) apply any transformation to the puppet's bone root, but this is an character-prop interaction animation. In this case, some translations (and rotations) of the puppet's root bone were required throughout the animation of the puppet mounting the bike:
https://drive.google...aWVIRFJGU2pPWVU
And here you are a clip demo'ing the axis disagreement (sequence: -Y -X +X +Y Note the puppet's pointing in the expected direction of the translation - also pointing with a finger extended means a movement along the X axis, and two fingers extended, the Y axis; a thumb up means a movement in the positive direction, and a thumb down, in the negative direction):
https://drive.google...aUk2QnZBZm5FbUE
And the same once the .caf file is applied the transformation to every keyframe of the root bone:
TranslationXMoviestorm <- TranslationYFragMotion
TranslationYMoviestorm <- -1 * TranslationXFragMotion
https://drive.google...SV9ySm9BR3RSVGc
The current look of the Cal3D Toolbox with the new functionality for batch transformation of animation files:
2017-02-14_132355.jpg 42.54KB
3 downloads