A couple of months ago I had someone (Patrice Berube) e-mail me a question about some of the behavior in the autoswim fish rig. Been pretty busy with work and all so never got around to posting about the issue . . .
Basically, the problem was when one animated the frequency of the swimming fish (whole or part), over the frames where the animation occurs the sine wave function would freak out, go super fast, super slow, backwards, etc.
Since the rig was made remotely for a studio, I never really got a chance to play with it too much once I made it and no one ever brought up the issue (I actually knew more or less what the animation would be, and animating the frequency never really entered into it. I also suspect that a lot of the animation was done on the FK controls). But once Patrice pointed out what the issue he was having, the problem became more clear.
Essentially, through all of the expressions and such, time was constant (or moving constantly), but changing the frequency as time progressed would give kind of random values as you passed through the progression of frames (essentially, the sin values no longer had any sensible relationship to the values from the previous frame). My first reaction was, "uh oh! This will take some of that crazy math stuff to solve". But as we batted around a couple of emails about, we both kind of arrived at a similar solutions that were a bit more palatable (though I'd still like to know a math-y solution, I can't be bothered at this point).
Here's the problem illustrated:
As you can see, the values that are coming out of the sine function (which is the basis for the joint rotation) are fine if you don't animate the freq. Predictable values, each frame (in this case) changing by a value of 1 in oscillating directions.
But when you animate the freq it looks like it should make sense, but the values kind of suck. Starts out fine (delta of 1. Look I'm using mathy terms!), but then the changes become really unpredictable, sometimes almost 2, sometimes about zero. So the animation would look crazy.
As it turns out the solution Patrice and I both realized independently (with Patrice actually implementing it, rather than just thinking about it :) is that rather than getting hard-core on the math, you could simply take the constant time out of the equation and not worry so much about animating the frequency. Instead, if you create an attribute to take the place of time (I thought to call it "time", he thought to call it "swimspeed". His is better) and simply animate that to make your fish swim, it would solve the problem. So in your expressions you'd simply replace "frame" with $swimspeed (which pulls the value of that attr), you could speed up or slow down the sine wave without fussing with the global frequency. A linear curve for "swimspeed" equals some version of normal time and messing with that curve will give you faster or slower time (as far as the fish rig is concerned).
Note that you'd still have problems if you tried to animate the frequency of the individual controls (because those frequencies would be animated relative to the new "swimspeed" attr). But that's less of an issue. You can just set those frequencies to be whatever you'd like, per control and control the rest of the animation globally.
Hope that helps anyone having this issue and big thanks to Patrice for pointing it out and working through the problem!
Thursday, May 10, 2012
Saturday, March 31, 2012
holds and stuff
Had a former student (and colleague!) ask me about some of the in/outs of the business side of things, as he was transitioning from full-time to freelance. The basic questions were: what can I do to turn holds into jobs? Are recruiters worth the time? What about Employer of Record places vs. SCorp/LLC for billing and taxes?
Seemed like useful info to put out there generally, so here's (approximately) what I replied:
"""
re: holds . . .
There's probably not much you can do about this. There are loads of reasons shops hold you rather than book. Most of the time they're feeling out people's availability before the client commits to them, so nothing you do would get a booking from them before they're guaranteed work. Some shops are just dicks and really push for a first hold from everyone in town like their hair's on fire. Then they never get back in touch with anyone if the job falls through or they go a different direction. Talked to producers about that from certain shops and they're like "yup. Sorry about that. They made me do it" Sometimes you're the backup, sometimes you're the primary target. You just never know. So my strategy is to not stress it too much and just give holds (if they insist I'll tell them where they are on the ladder, 1st, 2nd etc). The first person to put the money on the table wins. I'll call and offer challenges as a courtesy, but I never try to cherry pick jobs anymore. Too volatile. Pay me and I'm yours:) what a whore. But I'm usually on at least one hold, most of the time on two, occasionally on 3 or 4. That can get a bit hectic, but again I don't stress it too much. Most of the time one comes through and I give the courtesy of letting everyone else know. Communication with the producers and coordinators isn't a bad idea, they're the one's with the lists of names to call when a job comes up!
re: freelancing and improving your odds
The trick is to just work around wherever and whenever you can. I'm on a gig at XXXXX now (one of the shops I've been on hold with for about 50 times but was always booked elsewhere) and I know like 10 people there now from other random gigs or who just got off gigs with friends of mine, etc. So working breeds work. The folks I'm working with now will spread out and assuming I don't f&;^k up too bad, will remember me for a while and put my name in the hat wherever they move to. And I'll do the same. Before you know it, you'll know someone at just about every shop in town.
re: recruiters and reps
Recruiters are absolutely worthwhile. If only to get you INTO the places in the first place. At that point, it's the same as if you got the job yourself. Sometimes recruiters will get you mixed up with weird, painful little one off jobs, but even those pay the bills and you never know whether it'll be worth it or not in the long run, but money's money. It's a nice little backup, since you don't owe them anything while they try to drum up work. They also usually take their cut from the company or are fine pumping up your rate a bit to cover their fee if they can't. So you never really lose there.They can also help track down payments even if they didn't get you the gig (for some small percentage). I'd rather pay $150 or so to collect $5K and not have to be the heavy in some business relationship gone pear-shaped.
Probably also worth getting yourself an scorp or LLC for billing purposes. F^%k those EOR's. I literally just got an LLC (had billed through a rep of mine for years, but it became a tax problem for her) just for the job I'm on now. And it paid for itself in about 1 1/2 weeks of work. XXXX(EOR) wanted 20% out of the first $10K (and 10% thereafter)! 20%! For submitting an invoice and not much else. As I said, f&;*k them. LLC's are easy. Scorps are bit more of pain re: taxes and such, but I know plenty of people who have em. I had my accountant help me but have friends who have done it online also.
That help?
Send me your contact info and reel and I'll pass it on when I can (cuz that's how it works!).
"""
So there it is.
Some caveats: Obviously names of studios and stuff have been redacted. Always wanted to redact something. . .
I'd also bet that there are some gotchas re: the specific implications of LLC's/S-Corps etc. As I said, I had my accountant do it. Safer and easier and not much more expensive.
Bottom line re: holds, bookings, freelancing in general. . . If you're pretty good at what you do and (much) more importantly a pleasant person to be around, your dance card will fill up eventually. I've been in conversations with producers who will say things like "Nope. We can't hire her, she made some offensive statement around the EP. He hates her" or "Awww. So and so. He's such a good guy. Let's call him in" or "We had this one dude in and he looked like he was on crack. Not doing that again". Seriously. You will spend a LOT of time with the people you work with. Being a diligent worker and a nice person goes like 75% of the way to getting calls back and kickin ass at what you do doesn't hurt. If you are GREAT at what you do AND you're a good person to be around, you will work constantly, at least in any city that has a reasonable amount of work (I'm not making any assertions about my skills or how pleasant I am to be around:) But I can remember the name of every crazy talented, cool co-worker I've worked with over the years. It's not a big list, but I know that all of them work whenever and pretty much wherever they want (not to delve too deep into their inner wishes or anything . . .). I'd recommend (or hire) any of them in a heartbeat. Just saying. Work hard and be nice. It'll be like the shampoo commercial "she told her friend and she told her friend, and so on and so on. . . " Am I dating myself with that reference?
Be honest about what you can and can't do. Get help when you're in the weeds and be honest about how long things will take you. If you having a crappy experience, tough it out (unless it's crazy or abusive) and cross that name off your list of places you'll work in the future. It's really not that hard and if you like variety (and pressure) freelancing can be a fun lifestyle. Sometimes.
Happy hunting!
Seemed like useful info to put out there generally, so here's (approximately) what I replied:
"""
re: holds . . .
There's probably not much you can do about this. There are loads of reasons shops hold you rather than book. Most of the time they're feeling out people's availability before the client commits to them, so nothing you do would get a booking from them before they're guaranteed work. Some shops are just dicks and really push for a first hold from everyone in town like their hair's on fire. Then they never get back in touch with anyone if the job falls through or they go a different direction. Talked to producers about that from certain shops and they're like "yup. Sorry about that. They made me do it" Sometimes you're the backup, sometimes you're the primary target. You just never know. So my strategy is to not stress it too much and just give holds (if they insist I'll tell them where they are on the ladder, 1st, 2nd etc). The first person to put the money on the table wins. I'll call and offer challenges as a courtesy, but I never try to cherry pick jobs anymore. Too volatile. Pay me and I'm yours:) what a whore. But I'm usually on at least one hold, most of the time on two, occasionally on 3 or 4. That can get a bit hectic, but again I don't stress it too much. Most of the time one comes through and I give the courtesy of letting everyone else know. Communication with the producers and coordinators isn't a bad idea, they're the one's with the lists of names to call when a job comes up!
re: freelancing and improving your odds
The trick is to just work around wherever and whenever you can. I'm on a gig at XXXXX now (one of the shops I've been on hold with for about 50 times but was always booked elsewhere) and I know like 10 people there now from other random gigs or who just got off gigs with friends of mine, etc. So working breeds work. The folks I'm working with now will spread out and assuming I don't f&;^k up too bad, will remember me for a while and put my name in the hat wherever they move to. And I'll do the same. Before you know it, you'll know someone at just about every shop in town.
re: recruiters and reps
Recruiters are absolutely worthwhile. If only to get you INTO the places in the first place. At that point, it's the same as if you got the job yourself. Sometimes recruiters will get you mixed up with weird, painful little one off jobs, but even those pay the bills and you never know whether it'll be worth it or not in the long run, but money's money. It's a nice little backup, since you don't owe them anything while they try to drum up work. They also usually take their cut from the company or are fine pumping up your rate a bit to cover their fee if they can't. So you never really lose there.They can also help track down payments even if they didn't get you the gig (for some small percentage). I'd rather pay $150 or so to collect $5K and not have to be the heavy in some business relationship gone pear-shaped.
Probably also worth getting yourself an scorp or LLC for billing purposes. F^%k those EOR's. I literally just got an LLC (had billed through a rep of mine for years, but it became a tax problem for her) just for the job I'm on now. And it paid for itself in about 1 1/2 weeks of work. XXXX(EOR) wanted 20% out of the first $10K (and 10% thereafter)! 20%! For submitting an invoice and not much else. As I said, f&;*k them. LLC's are easy. Scorps are bit more of pain re: taxes and such, but I know plenty of people who have em. I had my accountant help me but have friends who have done it online also.
That help?
Send me your contact info and reel and I'll pass it on when I can (cuz that's how it works!).
"""
So there it is.
Some caveats: Obviously names of studios and stuff have been redacted. Always wanted to redact something. . .
I'd also bet that there are some gotchas re: the specific implications of LLC's/S-Corps etc. As I said, I had my accountant do it. Safer and easier and not much more expensive.
Bottom line re: holds, bookings, freelancing in general. . . If you're pretty good at what you do and (much) more importantly a pleasant person to be around, your dance card will fill up eventually. I've been in conversations with producers who will say things like "Nope. We can't hire her, she made some offensive statement around the EP. He hates her" or "Awww. So and so. He's such a good guy. Let's call him in" or "We had this one dude in and he looked like he was on crack. Not doing that again". Seriously. You will spend a LOT of time with the people you work with. Being a diligent worker and a nice person goes like 75% of the way to getting calls back and kickin ass at what you do doesn't hurt. If you are GREAT at what you do AND you're a good person to be around, you will work constantly, at least in any city that has a reasonable amount of work (I'm not making any assertions about my skills or how pleasant I am to be around:) But I can remember the name of every crazy talented, cool co-worker I've worked with over the years. It's not a big list, but I know that all of them work whenever and pretty much wherever they want (not to delve too deep into their inner wishes or anything . . .). I'd recommend (or hire) any of them in a heartbeat. Just saying. Work hard and be nice. It'll be like the shampoo commercial "she told her friend and she told her friend, and so on and so on. . . " Am I dating myself with that reference?
Be honest about what you can and can't do. Get help when you're in the weeds and be honest about how long things will take you. If you having a crappy experience, tough it out (unless it's crazy or abusive) and cross that name off your list of places you'll work in the future. It's really not that hard and if you like variety (and pressure) freelancing can be a fun lifestyle. Sometimes.
Happy hunting!
Friday, March 09, 2012
Using Bump and/or Normal Maps for Pose Space "Deformations"
That's a mouthful. Basically, this is a kind of addendum to the last post about animated textures. . . Similar, but different.
The idea is that you can add cool little details to your character (or whatever) using bump and/or normal maps. But you may not want these details all the time (think frown lines on a forehead, or muscle striations on a character when he flexes his muscles). So the trick is to hook the texture up like you would a pose space deformation, only being activated when you want it to be, in certain poses.
This is NOT so much about creating bump and normal maps, just about how you'd use them in this scenario.
Maya/Rigging: Using "Animated" Bump and Normal Maps from zeth willie on Vimeo.
The idea is that you can add cool little details to your character (or whatever) using bump and/or normal maps. But you may not want these details all the time (think frown lines on a forehead, or muscle striations on a character when he flexes his muscles). So the trick is to hook the texture up like you would a pose space deformation, only being activated when you want it to be, in certain poses.
This is NOT so much about creating bump and normal maps, just about how you'd use them in this scenario.
Maya/Rigging: Using "Animated" Bump and Normal Maps from zeth willie on Vimeo.
Animating textures on your rig
Been asked a few times lately about using animated textures on a rig and how to control those textures. Like with most things in Maya there are a bunch of ways to do this . . . you could apply different textures to duplicates of geometry and literally swap geo for any given frame of texture you want, but that's a) a pain to set up and b) kinda like shooting a fly with bazooka. Heavier in your scene and more a pain to deal with. Instead, in this vid I'll go over a couple of different ways to use the ".frameExtension" of an image sequence to control what shows up as our texture. I also briefly discuss a more complicated way of doing the same thing using nuke and UV maps, which I covered in another tutorial.
BTW, I talk about using this on a face in the video, but you could obviously use this on any kind of shader connection for any part of an object. Faces are just the most obvious. . .
Maya/Rigging: Using Animated Textures from zeth willie on Vimeo.
BTW, I talk about using this on a face in the video, but you could obviously use this on any kind of shader connection for any part of an object. Faces are just the most obvious. . .
Maya/Rigging: Using Animated Textures from zeth willie on Vimeo.
Wednesday, February 29, 2012
Triple Switch!
That's gonna be the title for my new movie. . . Or the managerial move I make that loses my kid the little league championship game. . . Or a utility node in Maya.
The triple switch is such a weird node. . . Not sure I've ever seen anyone use it in production. But in certain circumstances it can be useful and on rare occasions can be very handy indeed.
Basically the idea of the node is that you can create a geometry-specific attribute of a single material. So, fer example, you could put one shader on 100 objects and have, say, the color be different for each object. Still using just one shader, mind you. . . the color is different for each object, but all the other attrs of the shaders behave as normal. Here's the vid about how that works.
Maya: Using the Triple Switch utility node from zeth willie on Vimeo.
It's kind of hard to imagine getting the most out of this node without some coding, since by definition the node becomes more useful the more stuff (and therefore connections) you have in your scene. . . Here's the code I used to set up the basic random color thingy from the video. To use it, hook the triple switch up to the material, apply the material shader to the objects. Select the TS, then the objects and run the code. Obviously, if you want different results (which you should, probably) then adjust whatever parameters and values you'd like:
EDIT: Here's the code I used to create the distance setup. Seems a bit wonky to do things this way, but it more or less works . . . The point here being that since you can use an attr to drive the triple switch, you can control that attr with any of the usual (or unusual means) you control attrs in Maya. For this one you'll need to create a ".tightenFalloff" attr on the measure object first. (BTW, you actually don't need to drive an attr with the distance numbers, you could just plug them into the triple switch directly, but that's a little mysterious for anyone who might use this. The point, again, was simply to illustrate that you don't need colors to drive the triple switch):
The triple switch is such a weird node. . . Not sure I've ever seen anyone use it in production. But in certain circumstances it can be useful and on rare occasions can be very handy indeed.
Basically the idea of the node is that you can create a geometry-specific attribute of a single material. So, fer example, you could put one shader on 100 objects and have, say, the color be different for each object. Still using just one shader, mind you. . . the color is different for each object, but all the other attrs of the shaders behave as normal. Here's the vid about how that works.
Maya: Using the Triple Switch utility node from zeth willie on Vimeo.
It's kind of hard to imagine getting the most out of this node without some coding, since by definition the node becomes more useful the more stuff (and therefore connections) you have in your scene. . . Here's the code I used to set up the basic random color thingy from the video. To use it, hook the triple switch up to the material, apply the material shader to the objects. Select the TS, then the objects and run the code. Obviously, if you want different results (which you should, probably) then adjust whatever parameters and values you'd like:
//triple switch should already be created and connected to shader
//select triple then objects
string $sel[] = `ls -sl`;
int $sizeObj = size($sel);
string $triple = $sel[0];
for ($i=1; $i<$sizeObj; $i++) {
string $me = $sel[$i];
select -r $me;
//these are the per object attrs we're adding
addAttr -at "float" -k 1 -ln "redMult";
addAttr -at "float" -k 1 -ln "greenMult";
addAttr -at "float" -k 1 -ln "blueMult";
//these are the random values for those attrs
float $rRand = `rand .75 1.25`;
float $gRand = `rand .75 1.25`;
float $bRand = `rand .75 1.25`;
//assign the values to the attrs
setAttr ($me + ".redMult") $rRand;
setAttr ($me + ".greenMult") $gRand;
setAttr ($me + ".blueMult") $bRand;
//connect the objects to the TS
string $child[] = `listRelatives -c $me`;
string $shape = $child[0];
string $meShape = ($shape + ".instObjGroups[0]");
connectAttr ($meShape) ($triple+".input["+($i-1)+"].inShape");
//connect the attrs to the TS at the same index the obj is connected
connectAttr ($me + ".redMult") ($triple+".input["+($i-1)+"].inComp1");
connectAttr ($me + ".greenMult") ($triple+".input["+($i-1)+"].inComp2");
connectAttr ($me + ".blueMult") ($triple+".input["+($i-1)+"].inComp3");
}
}
EDIT: Here's the code I used to create the distance setup. Seems a bit wonky to do things this way, but it more or less works . . . The point here being that since you can use an attr to drive the triple switch, you can control that attr with any of the usual (or unusual means) you control attrs in Maya. For this one you'll need to create a ".tightenFalloff" attr on the measure object first. (BTW, you actually don't need to drive an attr with the distance numbers, you could just plug them into the triple switch directly, but that's a little mysterious for anyone who might use this. The point, again, was simply to illustrate that you don't need colors to drive the triple switch):
///////////////////////
//color by distance
//////////////////////
{
//triple switch should already be created and connected to shader
//select triple then measure object, then textured objects
string $sel[] = `ls -sl`;
int $sizeObj = size($sel);
string $triple = $sel[0];
string $mObject = $sel[1];
for ($i=2; $i<$sizeObj; $i++) {
string $me = $sel[$i];
string $meDist = $me + "Distance";
select -r $me;
addAttr -at "float" -min 0 -max 1 -k 1 -ln "distance";
//create distance node
shadingNode -asUtility distanceBetween -n $meDist;
connectAttr ($me + ".worldMatrix") ($meDist + ".inMatrix1");
connectAttr ($mObject + ".worldMatrix") ($meDist + ".inMatrix2");
connectAttr ($me + ".rotatePivotTranslate") ($meDist + ".point1");
connectAttr ($mObject + ".rotatePivotTranslate") ($meDist + ".point2");
//connect the distance to a mult node
shadingNode -asUtility multiplyDivide -n ($me+"mult");
connectAttr ($mObject+".tightenFalloff") (($me+"mult")+".input1X");
connectAttr ($meDist+".distance") (($me+"mult")+".input2X");
//connect the dist node to the attr on the object
connectAttr (($me+"mult")+".outputX") ($me+".distance");
string $child[] = `listRelatives -c $me`;
string $shape = $child[0];
string $meShape = ($shape + ".instObjGroups[0]");
connectAttr ($meShape) ($triple+".input["+($i-2)+"].inShape");
connectAttr ($me + ".distance") ($triple+".input["+($i-2)+"].inComp1");
connectAttr ($me + ".distance") ($triple+".input["+($i-2)+"].inComp2");
connectAttr ($me + ".distance") ($triple+".input["+($i-2)+"].inComp3");
}
}
Tuesday, February 28, 2012
Geo caching for easier animation
Some students of mine were doing things that suggested geo-caching to me and I just used this on a job, so I was all like "wooohooo!". And then I made this video.
Basically talks about the general idea of geo-caching and then I show one example of what I used this on recently. General gist of it: Maya, Geometry, Cached.
Slightly less general gist: You'd use this to lighten some of the processing load in your scene, either by allowing you to eliminate heavy rigs or allowing you to use light version of your characters (i.e. just geo) for multiple instances of an animation. Basically baking animation into the geo itself for use later in various ways. So check it:
Edit/Addendum - Totally did not get back around to the bit about why the eyes and teeth didn't come along for the ride in the geo cache! Oops. That's Ok. The reading will do you good.
Here's the deal. . . geo won't get written to the cache (at least the default Maya cache) if it doesn't have something driving the shape node itself (like skinning or other deformers). Simply translating or rotating the geo won't cut it since that stuff operates on the transform node and leaves the shape node to rest a bit. Soooo. . . since I usually connect things like eyes and gums/teeth into the rig via some combo of parenting to groups and constraining those groups (it's easy, clean), when I try to include those in the cache, they sit completely still, unaffected by caching party going on around them. So the easiest way around that is to just bind them to a joint, either existing or created just for that purpose. If you do it carefully, you won't even have to weight them (bind them separately from the rest of the geo, just to one selected joint). But they'll then be included in the caching. The other option is to set up some kind of follicle system on your cache-catching rig, the simple one, whereby you'd use follicles or rivets to stick things like the eyes and teeth to the cache-animated geo. A bit wonkier, but whatever gets ya through the night, amiright?
Basically talks about the general idea of geo-caching and then I show one example of what I used this on recently. General gist of it: Maya, Geometry, Cached.
Slightly less general gist: You'd use this to lighten some of the processing load in your scene, either by allowing you to eliminate heavy rigs or allowing you to use light version of your characters (i.e. just geo) for multiple instances of an animation. Basically baking animation into the geo itself for use later in various ways. So check it:
Edit/Addendum - Totally did not get back around to the bit about why the eyes and teeth didn't come along for the ride in the geo cache! Oops. That's Ok. The reading will do you good.
Here's the deal. . . geo won't get written to the cache (at least the default Maya cache) if it doesn't have something driving the shape node itself (like skinning or other deformers). Simply translating or rotating the geo won't cut it since that stuff operates on the transform node and leaves the shape node to rest a bit. Soooo. . . since I usually connect things like eyes and gums/teeth into the rig via some combo of parenting to groups and constraining those groups (it's easy, clean), when I try to include those in the cache, they sit completely still, unaffected by caching party going on around them. So the easiest way around that is to just bind them to a joint, either existing or created just for that purpose. If you do it carefully, you won't even have to weight them (bind them separately from the rest of the geo, just to one selected joint). But they'll then be included in the caching. The other option is to set up some kind of follicle system on your cache-catching rig, the simple one, whereby you'd use follicles or rivets to stick things like the eyes and teeth to the cache-animated geo. A bit wonkier, but whatever gets ya through the night, amiright?
Subscribe to:
Posts (Atom)
