djSetKeyframe.mel and “straight ahead” animation

david | animation,mel script | Tuesday, April 22nd, 2008

I usually animate in a straight ahead manner, where I create a pose... keyframe... move forward on the timeline... create the next pose and so on. Since there are no keys ahead of where I am working, the last pose is held when I move forward. I find it easy to do a first pass this way.

But the first pass is rarely final and when changing some animation in the middle of a sequence it is often easier to delete a block of keyframes rather than mess with the existing ones. But now the keyframes that come after the deleted section mean those poses are no longer held when I move forward in time.

djSetKeyframe.mel was written to enable a more "straight ahead" approach when making changes to these middle bits.

Say for example, I delete all the keyframes between frame 100 and 200 so I can redo that section. I would then start by setting a new keyframe at frame 199. Then I goto to the last keyframe before frame 100 and run djSetKeyframe 1 0; which copies that keyframe to frame 199 and sets the inbetween tangents to linear. This creates a "hold" until frame 199.

Now I can work forward as I did in my first pass. Each new keyframe I set using djSetKeyframe 1 0; to simultaneously update the hold frame at 199. Of course, at some point the new animation needs to blend back into the old, so then I just delete the keyframe at 199.

The numbers you see after the command in the above examples, change its behaviour. The first is the "push" flag; set to 0 behaves just like the channel box rmb-menu Key Selected. Set to 1 and it will also copy the new keyframe forward.

The second number is the "unlock tangent weights" flag. (I wish I knew how to make unlocked weighted tangents the default in maya) Set this 2nd number to 0 and you get the usual locked tangent weights, but set it to 1 and the weights will be unlocked as you create new keyframes.

djSetKeyframe.mel was written to be mapped to hot-keys (or marking menus if you prefer). I have djSetKeyframe 0 1; mapped to [s] and djSetKeyframe 1 1; mapped to [S].

NOTES and CREDITS: This script requires the installation of Hamish McKenzies zooToolbox. I have used a proc called zooSetkeyPush which is just one of many useful functions that are part of the marking menu built by zooSetKey.mel.

Download djSetKeyframe.rar from here. (see file header for full usage details)

An afterthought: As I re-read this tonight, I realize that I will probably be asked "Why dont you just use "step" tangents instead ?". The simple answer is... um... that's not the way I prefer to work. I like to be able to scrub through my animation as I am creating it so I can judge the momentum and flow of my action. I know this is a departure from the widely used workflow of blocking out the action using only poses and step tangents on the first pass. (And I was reminded of this recently while reading Cameron Fielding's blog where he links to a nice document by Mike Walling) Getting those key poses down is essential, I agree. I'm impatient though. I want to see it move too. This is what I have become used to.


david | mel script | Friday, April 18th, 2008

In my last post I wrote about two methods for getting the manipulator handle to change automatically when you select an object. Then, thanks to Brad Clark's post on cgtalk I discovered yet another way (actually the same technique as zooTriggered, but doesnt require the zooToolbox to be installed).

I thought it would be useful to put Brad's whichTool() proc into an easy to use mel script. I've called it djSwitchManipOnSelection.mel to stick with my usual naming, but really the guts of this are Brad's code and a bit from Hamish - thanks guys.

You need to source djSwitchManipOnSelection.mel, probably by adding a line to your userSetup.mel. Then you have a few commands you can use. Here is a basic work flow.

Select some objects. Then in the cmd window type djCreateDefaultToolAttr 0 to flag those objects for worldspace move (substitute 1 for object move, 2 for rotate, 3 for scale). An attribute called defaultTool is added to the objects and specifies the manipulator type, which you can change later if you wish.

djSwitchManipOnSelection 1 activates the manipulator switching scriptJob. Now a change of selection will check for the defaultTool attribute and change manipulator accordingly.

djSwitchManipOnSelection 0 deactivates manipulator switching.

djRemoveDefaultToolAttr removes the defaultTool attribute from selected objects.

These commands will be easier to use if you assign them to shelf buttons or marking menus.

Download djSwitchManipOnSelection.rar here.

default manipulators and zooTriggered

david | animation,mel script,tutorials | Wednesday, April 16th, 2008

Yesterday I learned something new. Stev Kalinowski posted this on CGTalk

In the attribute editor, under the Display rollout you set the "Show Manip Default" drop down list to Translate or Rotate for each control. Then to select objects hit "t" (Show Manipulators) instead of the move or rotate tool. Now when you select objects you'll get the manipulator you set for each control.

I tested it out using two objects called "translateMe" and "rotateMe" and I set the Show Manip Default attribute as shown here



Now, as long as I am in Show Manipulators mode (invoked with the "t" hotkey by default) then the manipulator handle will change based on my selection.

This is quite handy when animating, but it depends on being in the Show Manipulators mode, which I would not be as comfortable with alot of the time, since I frequently need to also use the translate, rotate and scale modes.

Well, there is another way to do the same thing using Hamish McKenzie's zooTriggered scripts.

I have written about using zooTriggered here, but if you read that quick walk-through, you might think it's use is restricted to selecting a control object to trigger the selection of another object(s). In fact zooTriggered can trigger almost any mel command(s) which means it can be used to activate a specified manipulator when you select an object.

Here's a really quick look.

Open the zooTriggered UI and in the View menu make sure "Edit zooTriggered command" is selected. Then add the objects you want to configure (to the top left pane). Then right-mouse-click in the lower pane and select either the "use move tool preset" or the "use rotate tool preset".


You should end up with something like this


Now enable the trigger by clicking the "load" button so that the "load status" bar changes to green


That's it. Now whenever you select the object, the manipulator tool you specified will become active.

There is a slight delay between your selection and the change of the manipulator, which is not the case with the Show Manipulators mode, but my preference is still the zooTriggered method since it allows me to stick with the regular translate, rotate, scale modes that I generally use.

mip_matteshadow and how I have used it

david | mentalray,rendering,tutorials | Tuesday, April 8th, 2008

In this post I will explain the way I have been using the mip_matteshadow shader in maya 2008 (along with some of the other mentalray "production" shaders). It is not going to be a step-by-step tutorial - and I'm certainly no "production" shader expert. I started by reading Zap's mental ray tips, and the Production Shader Wiki and the PDF manual. Then I did some experimenting to see how I could include these new methods in my work which, unlike Zap's examples, usually involves rendering CG characters in CG environments rather than live-action or photographic backgrounds.

Here is a simple example of how I have recently started using mip_matteshadow as a better alternative to maya's useBackground shader... (click here for the rest of the post) (more...)

cMuscleCreatorUI.mel modification

david | dj mod,mel script | Sunday, April 6th, 2008

I've been playing with the new maya 2008 ext 2 muscle system. The old ext 1 muscles are now refered to as "simple" so I was not surprised at the apparant complexity of the ext 2 Muscle Creator UI. It's going to take some getting used to.

One thing that bugged me right from the start was the size of the frames in the lower half of the "Edit" tab of the UI. The default muscles have 5 basic controls but the frame only shows 2 and you need to scroll to get to the others, as you can see in this snapshot of part of the UI


I found this to be a major stumbling block as I tried to navigate my way around the various muscle cross-section curves and controls.

To make it easier I had to edit cMuscleCreatorUI.mel and now the same part of the UI looks like this


This makes it much easier to find things.

You can get my modified cMuscleCreatorUI.mel from the downloads page. It's not quite perfect though. I struggle a bit with the mel for formLayout. If you collapse one of the other tabs in the UI those fields will revert to their smaller size. To get them back again you have to close and reopen the UI. Oh well. Better than nothing.

Downloads it here.

Powered by WordPress | Based on a theme by Roy Tanck