After nearly 3 years of MotionBuilder in both preproduction & full blown production, my team has collected a hefty list of Mobu’s kinks & quirks. Some of these we have solutions/wrappers for, others we are actively working through, and some we’ve brought up to the powers at be.
- Camera “roll” is a separate property, not part of the camera’s rotation matrix.
A camera can be animated with rotation in X Y & Z and then another property "Roll" can be animated, which doesn't update the XYZ rotations of the camera. At first glance, you may be looking at a camera and seeing rotation, but not seeing the rotation matrix change. This can be very confusing! Always check the Roll property to see if it's animated before investigating camera rotation issues.
- Script/process failures are not always obvious. Can lead to artists working in broken scenes without knowing about it!
Maya and Max have handy little status bars at the bottom left of the interface that turn red/yellow/pink if processes fail and are reported in their respective script editors. MotionBuilder does not have one of these, so your artists may not always know when things break! We've implemented a system at Volition where FBHUD objects are generated with red text in the viewport that notify users of errors in their scenes. This is hooked into the traceback/exception handler and is surprisingly easy to setup! Post about that coming in hot, so be prepared. Careful about cleaning this up tho!
- Watch out for hidden properties
Watch out for "hidden" properties that don't appear in the Properties pane as well as watch out for interactions between .Show and .Visibility E.G. creating a FBLight via scripting will instantiate a light, but it won't appear in the 3d view. You can even select it and inspect its 'Visibility' property in the Properties pane to see that it defaults to True, yet it isn't in the 3d view until you set its "Show" to True also…which doesn't appear for the light be default in the Properties pane by default.
- Do you have story mode active when you don’t mean to?
- You might be tempted to use anim layers while in story mode, doesn’t work. Use subtracks.
- Constraints cannot be added to story tracks.
At Volition, we utilize the FBCharacterFace constraint for our face animation. Unfortunately, it's treated as a constraint in MotionBuilder and thus cannot be added directly to a story track. To get around this issue, instead of animating the object directly, all animation is stored on a proxy FBModelNull. Using a FBConstraintRelation we then send the data to the FBCharacterFace. A simpler way, and if not for some quirks of out pipeline, would be to add the animatable properties on the FBCharacterFace to the story track by way of a FBCharacterExtension. Got a property you want to animate/represent in story mode? Add it to the extension!
- Config files can get corrupted easily. If Mobu crashes on startup, delete them and Mobu will automatically create default files.
Config files meaning window layout files, keyboard shortcut presets etc Do not delete binary files. *This may be a problem localized to Volition as we edit those on start up occasionally with new settings.
- pyfbsdk does not like unicode strings.
If a string you're working on setting is failing or you get a TypeError, try recasting the string. str() is your friend.
- Deleting in MotionBuilder can be tricky, and prone to crashes. To prevent a lot of these issues, we’ve written a bit of code to safely delete objects.
There are numerous blog posts about deleting objects in Mobu ( one of which was my own ). It's a tricky issue, but hopefully the code example above will help you out in stabilizing that portion of your workflow.
- Relation constraints are great but are limited in exposure and can be tricky to set up. Use a serializer to write one for you. Expect another post about this soon as this topic is worthy of its own story.
- Be sure to clean up/disconnected HUD objects from cameras while deleting them. Not doing so can cause Mobu to crash.
- Some intensive operations require Parallel Pipeline & Evaluation toggles to be False in order to succeed. Decorators are rad for this…
- Mobu does not like RLE Compressed TGA’s, but work fine with other TGA types. At Volition, we convert all TGA’s to PNG using PIL before the texture is loaded in Mobu.
- If you’re querying animation over time, avoid use of FBPlayerControl & FBScene().Evaluate(). Instead, evaluate just the FCurve you want.
We've run into this problem a lot in creating interactive interfaces for face animation tools, custom property sliders etc. It's tempting to just evaluate the whole scene to be sure all the data is valid and up to date. However, this can cause playback issues or worse, crashes. Check out the gotcha gist for an example of how to solve.