shhLIFE!: Animation, Rigging, and a whole lotta talkin.

js_matchObj scripts added to Downloads page.

I received an email yesterday from a person who purchased the Animator Friendly Rigging series and found that two mel scripts were missing:

js_matchObj.mel and js_matchObjUI.mel.

I’ve heard of others missing these as well, so I added them to the downloads page, along with js_iterator.mel.

If you’re missing them.. enjoy!

note: you must be logged in to download.

js_matchObj.zip (95)

Happy new years!

Happy new years!!

Hope it’s a great and relaxing one for you!

Automated “Animator Friendly Rigging” – Free Character Scripts / Plugins Downloads for Maya

One of the things I’ve learned over the years is that it’s important to share your ideas as much as possible.  That’s how innovation happens.  It’s how things progress.  It’s how we learn.  I’ve never been afraid to put my own ideas out there because I know I’ll get back more in return.

As soon as I released my DVDs on character rigging, I started seeing them pop up on warez & pirating sites.  People have been sharing them with friends, downloading them from various locations, burning dvds, etc.  While it directly takes away from my own pocket, there’s nothing I can do to stop it so I don’t stress about it.

I figure, as long as people are out there using this stuff, then it’s a good thing.  If they really appreciate it, then maybe someday they’ll send me a thank you email, or a postcard, or 10 bucks, or whatever.  Or they’ll tell others to go buy my stuff.  Or they’ll buy me a beer at siggraph.

Today I got an email from someone who actually created an automated way to create the “Animator Friendly Rigging” rig that I developed for the AFR series dvds.

Automated “Animator Friendly Rigging” – Free Character Scripts / Plugins Downloads for Maya.

Some people would probably think that I’d be offended by this, or ask him to take it down.  After all, they’re techniques I developed, right?  This stuff contains scripts that should really only be available through the DVD series.  It’s my intelectual property he’s messing with!

But I’m not, I’m actually quite stoked that he liked my stuff enough to spend the time to try and automate it.  It means that my ideas aren’t nuts and that they’re worth following.

My whole point of the DVDs wasn’t to say “this is the be-all end-all of rigging technology”, but to say “hey.. this is how I like to THINK about rigging.  You should, too!”

If you just download this script and create a rig with it.. yeah, you’ll have a pretty sweet rig with lots of functionality.  But you won’t have learned the point of the DVD, and that’s how to THINK about rigging.

So, here’s what I say.. download the tool.  Try it out.  See how you like the rig.  If you dig it, or at least intrigued by it.. then go purchase the DVD and see why certain choices were made.  Learn about the process, because in the end.. THAT’s what you need to do to be a good character td.

Speaking of Animation

Speaking of Animation.

A few animators from Dreamworks have started their own animation blog and so far it looks pretty cool!  Go check it out!

Woo! :)

Rigging Bundle – Outline

A number of people have asked what specifially is covered in my two DVDsIntegrating a Creature Rig Withing a Production Pipeline and Fast Animation Rigs, so here ya go!

Integrating a Creature Rig Into a Production Pipeline

  1. Definition of a “Pipeline”
    1. Examples: Film, Modeling, Shot
    2. Determining how animation rig itself fits into the rest of the pipeline
    3. Animation-based transfer
    4. Control-based transfer
  2. Definition of a “creature”
    1. Creating a node to represent the “creature”
    2. Defining Types of nodes
  3. Orienting Joints
    1. Manually Re-orienting joints
    2. Automatic re-ordering
  4. Animation Control Concepts
    1. Iconic Representation
    2. Limiting Selection and keyability
    3. Rotation Order
    4. Extra Gimbal Control
    5. Customized PickWalking
  5. Automatic vs Manual Shoulder Control
    1. History of the discussion
    2. Constraint based control
    3. SetDrivenKey based control
  6. Creating a “realistic” forearm
    1. Radius and Ulna
    2. Creating the Control Structure
  7. FK/IK Back Control
    1. History
    2. Creating the spline IK
    3. Adding Stretching
    4. Creating the IK Control Structure
    5. Adding FK
    6. Adding Twist
    7. Adding Stretch Warning
  8. Procedural Animation Rigs
    1. What is a procedural rig?
    2. Creating the rig
    3. Updating the rig
  9. Included MEL Scripts
    1. endName.mel
    2. jsChannelCtrl.mel
    3. jsConstObj.mel
    4. jsCreateCreature.mel
    5. jsDefineCreature.mel
    6. jsGetShape.mel
    7. jsListCreatures.mel
    8. jsMovIn.mel
    9. jsMovOut.mel
    10. jsOrientJointUI.mel
    11. jsPickWalk.mel
    12. jsRenameWindow.mel
    13. jsRotateOrder.mel
    14. jsScaleJointsByCurve.mel
    15. jsUnlockTransforms.mel

Fast Animation Rigs – Bridging the Gap between Speed and Functionality

  1. Fast Animation Rigs
    1. Global Concepts
      1. Display Layers
      2. Easily identifiable Controls
      3. Appropriate Rotation Orders
      4. Tidy Scene
    2. Leg Control – fast reverse foot setup
    3. Isolation of Movement
      1. History
      2. Head
    4. FK/IK Arms
      1. Maya’s fk/ik toggle
      2. jsFkIKSetup – a better solution
    5. Misc Speed Techniques – What’s fastest?
      1. Direct Connections
      2. Expressions
      3. Point Constraint
      4. Drive from same source
      5. Math Nodes
    6. Other Speed Techniques
      1. Object visibility
      2. Shaded Mode
      3. Nurbs vs Polys
      4. Keeping track of FPS
  2. Pipeline Methodology
    1. File Structure
      1. Base Directory
      2. Revision System
      3. Resolution System
      4. Updating
    2. Incremental Rigging – Blocking, Animating, Finessing
      1. Switching Between Rigs
      2. File Referencing
      3. Transferring Animation
  3. Fast Animation Technique
    1. Gather Information
    2. Thumbnail
    3. Staging
    4. Blocking
    5. First pass
    6. Second pass
    7. Third Pass
    8. Facial
    9. Secondary/External
  4. Included Mel Scripts
    1. jsAddBoolAttr.mel
    2. jsAddMessageAttr.mel
    3. jsAddStringAttr.mel
    4. jsAlignToJoint.mel
    5. jsChooseItem.mel
    6. jsCopyAnim.mel
    7. jsCopyPos.mel
    8. jsCopyRot.mel
    9. jsDuplicateControl.mel
    10. jsErrorMsg.mel
    11. jsFindChildJoint.mel
    12. jsFindConnected.mel
    13. jsFindFkIkChars.mel
    14. jsFixPrefix.mel
    15. jsFkIkArmRig.mel
    16. jsFkIkSetup.mel
    17. jsFkIkSetupEverything.mel
    18. jsFkIkWin.mel
    19. jsGetRefFile.mel
    20. jsMakeFkIkConnections.mel
    21. jsreferenceRig.mel
    22. jsReferenceRigUI.mel
    23. jsRigUI.mel
    24. jsToggleFkIk.mel
    25. moveIkToFk.mel

Google Wave Invites Available!

Heya folks! Just found out that I’ve got some google wave invites available.. please comment here if you want one!

google_wave_logo

First Come First Serve!


Update: 0 invites left!  All gone!

Jeffrey Katzenberg Plans on Living Happily Ever After

Jeffrey Katzenberg Plans on Living Happily Ever After | Fast Company.

This is a nice interview with JK, our main head honcho at Dreamworks Animation.

The first time I ever spoke to Jeffrey was when I was applying for a job at Dreamworks.  I was actually still living in New Zealand finishing up on The Lord of the Rings.  I believe it was a saturday morning, and I was at home showering before heading in to work.  I heard the phone ring & my wife poked her head in the bathroom to say “There’s a call for you.”

“Who is it?”  I asked, massaging shampoo into my hair.

“Jeffrey Katzenberg?” She said.

I nearly slipped in the tub and cracked my skull.

“WHAT?!?!”

“Yeah, some guy named Jeffrey Katzenberg.  Who is he?”

“KATZENBERG?  JEFFREY KATZENBERG CALLED HERE?”

“Yeah.. and he is….”

“KATZENBERG!  SPIELBERG!  GEFFEN!   DREAMWORKS!  SKG!  KATZENBERG!”  I sputtered and slipped and rinsed and threw on a towel and somehow managed to answer the phone.  “Mr. Katzenberg.. *squeek* Hello sir, how are you…”

We spoke for a bit about the company, what Dreamworks was doing, how exciting it is here, and other things.  I think the conversation lasted all of two minutes, but in that time I was immediately impressed with Jeffrey’s passion for animation, his excitement about the studio, and I knew I wanted to work here.

I’ve been fortunate to have been in meetings with Jeffrey a few times in my nearly 6 years at Dreamworks, and have to say that even though it’s nerve-wracking at times (he IS the big boss, after all), he’s always been really engaging, intelligent, honest, and 99.9% of the time completely correct.  I really value his notes and love the dedication he has to his staff.

Anyway, the article great read & really gives some good insight into his head.  Enjoy!

Testing Time-Management Strategies – WSJ.com

Testing Time-Management Strategies – WSJ.com.

As most of you know, I’ve been spending the past year or so working on time management techniques, trying to figure out ways to keep creative, but still get work done quickly and efficiently.

In my new role, I find that I spend quite a bit of time juggling meetings, animating, giving notes, exploring ideas, family, and trying to find time to relax and work out.  It’s not easy, and things can easily get dropped or fall behind.

I’ve explored a few ways of keeping track of things, and what I’m working with now is a somewhat modified GTD technique, or Getting Things Done for those of you who haven’t heard of GTD before.  It’s a pretty cool technique for managing time developed by David Allen.

It’s working relatively well for me, but I still have yet to find a complete email/iphone/os X/linux workflow that I love with it.

I’ve also attempted the Pomodoro technique a few times, which I really like when I have a whole saturday to work straight ahead on 4 or 5 items.

The main thing that’s keeping me on track is trying to keep my email inbox to 0.  My goal is to do it every day, but some days that’s just impossible.  If I can’t hit it every day, I try and make SURE I do it by the end of the week.

Anyway, the Wall Street Journal has put together an article talking about time management.. it’s pretty interesting.  Check it out!

Track your Magic The Gathering Collection with OOCalc – Part III

Now on to part III of my series on using OOCalc to track your Magic The Gathering card collection.  If you’ve missed parts 1 and 2, you may want to check them out, since part 3 builds upon those two bits.

Seriously, go read them.  You’ll be missing out on some pretty neato spreadsheet magic.

Go on, it’s okay.  I’ll wait.

Okay, you done?  Great!

In part III, we’re going to create the Collection bit of the spreadsheet where we get the value of our cards and calculate how much our collection is worth!

Oh man, can’t wait to sell the whole thing and buy a new Apple Tablet.

Yeah, I know they don’t “officially” exist yet, but I’m allowed to dream, aren’t I?

Okay, our current spreadsheet has two Sheets.. a blank Collection sheet, and our Pricelist that we downloaded and imported in part 2.

The Collection sheet is going to have the following columns: Card Name, Count, and Value. These should be pretty self explanatory, but just to make sure everyone is on the same page here..

Card Name will be the name of the card I want the value of.  It should match one of the names from the Pricelist sheet.

Count is the number of these cards that I have.

Value is going to be the associated price of the Card Name from the Pricelist sheet, multiplied by the Count.

So far so good?  Great!  Here’s an image of my spreadsheet so far with those headings placed at A1, B1, and C1.

collection1

Let’s go ahead and just enter the name of a card in A2.  For the fun of it, let’s pick a card that’s worth quite a bit of money.  How about.. Ancestral Recall from the Alpha series of cards.

Select A2 and type:

Ancestral Recall (A)

Obviously nothing happens yet, because we haven’t told C2 to get the price.  We’ll use the VLOOKUP function here to make the query.

Select C2 and type:

=VLOOKUP(A2;Pricelist.A2:B14317;2;1)

collection2

Remember.. the first field is the cell we want to grab and the second field is the array we’re going to search.  The third is the column within that array that we’re going to return, and the fourth is whether or not we’re sorting.  Since our pricelist is sorted alphabetially, we’re going to enter “1″ for the sort value.

Notice something special in the second field.. we’re specifying a specific sheet to search for the array: Pricelist.A2:B14317.  This tells oocalc to go to a different sheet than the one we’re currently on.  If we didn’t do this, we would be searching the current sheet, and that wouldn’t do us any good at all.

We’re not quite finished yet, we still need to enter a Count.  Let’s pretend that we actually were really lucky and found 4 of these Ancestral Recall (A) cards.  Go ahead and enter 4 in B2.

Notice the value didn’t update, so we need to update the VLOOKUP function to multiply the value by the count.  Change VLOOKUP to:

=VLOOKUP(A2;Pricelist.A2:B14317;2;1) * B2

collection3

Not bad!  However, we still need to make a few more adjustments.  First, remember in part 1 when we copied and pasted our function it would offset the search values?  That’ll happen again if we copy C2 to C3.  Give it a shot and see what you get:

C2: =VLOOKUP(A2;Pricelist.A2:B14317;2;1) * B2

C3: =VLOOKUP(A3;Pricelist.A3:B14318;2;1) * B3

Some of the offsetting is fine.. A2 to A3 and B2 to B3 for example.  But the Pricelist.A2:B14317 being changed to Pricelist.A3:B14318 isn’t going to work.  Again, we need to use the $ symbol to lock down the cells we don’t want to adjust.

Change C2 to:

=VLOOKUP(A2;Pricelist.A$2:B$14317;2;1) * B2

Now you can copy and paste the field without it doing the wrong thing.

BUT you notice that if you DO paste into C3 without putting the name of anything in A3, you get a big lovely #N/A.  That means that the function is working, but it’s not returning a valid value.  That’s pretty ugly, isn’t it.  Let’s fix the display by telling the function to just return a blank string if there’s noting in A3.  We can do that using a Conditional!

We’re going to use an IF statement to check and see if A3 is blank.  If it is, we’ll display a blank value.  If not, then we’ll use our VLOOKUP function.

IF works like this:

IF ( Test; Then_value; Otherwise_value).

For example, if you had a value of “foo” in A1 and put this function in B1:

=if (A1=”foo”;”doo”;”darn”)

B1 would see that A1 does indeed = “foo”, so it would return “doo”.  If we did:

=if(A1=”poo”;”doo”;”darn”)

and A1 was still “foo”, then the expression would see that A1 didn’t equal “poo”, so it would return “darn”.

Does that make sense?

Here’s how we’re going to change our expression in C2:

=IF(A2=”";”";VLOOKUP(A2;Pricelist.A$2:B$14317;2;1) * B2)

Then copy and paste this into C3.  Notice the #N/A is gone?  That’s because we’re using the IF statement to check and see if A2 is blank.  Since it is, then this reuturns a blank string.  That looks much better!

Now let’s go ahead and enter another expensive card name in A3.. this time let’s use.. Badlands (A).

collection4

Notice the Value didn’t update.  That’s because we didn’t enter a count number.  If we simply change the value of count to 1, you’ll see the Value gets updated correctly:

collection5

Wouldn’t it be great if by default the count assumed it was always 1?  We can certainly do that by adding another function into our Value function.. MAX.

MAX will take a list of numbers and return the maximum number.  For example:

MAX(1;50) = 50

MAX(0;10;20;-5) = 20

MAX(.5;.7;150;10010) = 10010

Since we know that most of the time we’ll have 1 or more cards, we can assume that our anything lower than 1 should be returned as… 1.  So all we need to do is change the part of our function where we get the count from B2 to MAX(1;B2).  Then if B2 is 0, it will still return 1.  If it’s 10, then the funciton will return 10.  Sweet!

Go ahead and change C2 to the following function and then paste it into C3:

=IF(A2=”";”";VLOOKUP(A2;Pricelist.A$2:B$14317;2;1) * MAX(1;B2))

Notice that C3 now returns the proper value of the card.. and if you change B3, it will still add up correctly.

Nice!

The last bit of the tutorial is probably the coolest.. I can’t wait for you to see it! :)

You’ve probably noticed while scrolling through the list of card names that some of the Magic cards can be quite hard to spell..

It would be really easy to accidentally type in a name wrong and get the wrong value, or no value at all.  We could put in some crazy checking, but with 14,316 cards.. I’d much rather there was an easier way to search and enter card names.

Luckly, there is!

We can use the Validity feature of OOCalc!  It’s a great tool that lets you specify what exactly can be allowed to be entered into a cell.  We’ll use it on the Card Name column to ensure that only the cards shown in the Pricelist can be entered!

To do this, select A2.

Go Data -> Validity

collection6

This will bring up the Validity window:

collection7

Here, you can tell oocalc exactly what type of item to allow in the cell.  The coolest thing is that you can choose a Cell Range.  That’s right.. we can pick the range of cells that are in our Pricelist that have the actual names of the cards.  Not only will this limit the input to only allow those names.. but it will actually create a dropdown option box so the person entering the names can just simply pick the one they want!

Yeah, that’s a LOT of italics, but it’s so cool!

Go ahead and tell it to allow a Cell Range:

collection8

Now enter the range:

Pricelist.A$2:A$14317

Make sure Show Selection List is on.

collection8a

Click OK

You’ll notice that there’s now a pulldown next to A2.  Go ahead and click on it.. you’ll get a pulldown of all the items in the pricelist!

collection10

Just pick the one you want and you’re done!

The rest is up to you.. just copy and the rows as you need them and you’ll be able to get the values of each card!

Enjoy!