Wednesday, December 31, 2014

Setting up the Maya Environment

Happy New Years eve.

 I'm trying to get back on the tutorial kick again, this one was painful, and it's long, but I think there are some good nuggets here and there..

I'll add more to this as time and comments continues..

Thursday, August 28, 2014

testing out instagrams HyperLapse

Ok so instagram's Hyperlapse is not the same tech as Microsoft research's hyperLapse, but its free, and pretty cool.

What you are really getting out of the app is a somewhat steadied and smoothed out version of your video with the option to "time lapse it" but really this is more just speeding the footage up.  A big difference here is that the MS research will actually take out fast turns and bumps and look for a smoother path to follow. You don't get that with the instagram app, so any quick moves and changes are glaring . But hey, this app is free.. so you get what you get. 

 The most obvious difference from the start is that the output from the hyperlapse app is significantly reduced in size and quality.

The other thing is that the app seems to lock the exposure so you will not get good balance between darks and lights. I couldn't tell if there is an added filter to any of my videos. I don't think there is, I think it's just a result of the lock.   

I did find though that footage I shot on my bike handlebars , which is normally super jittery , was actually smoothed out pretty well.   

I filmed this kitesurfer this morning to see what some of the differences might be.. 
 For this clip I scaled down the "hand held" footage to match size and put them side by side. 
I have  an iphone4s so the native video size is 1920 X 1080 the instagram app scales the video down to 1280 X 720.

Monday, August 18, 2014

Resetting the pan zoom on a Maya camera

This seems to come up all the time.. so I'll share a quick script for resetting the pan and zoom of your current camera.
 for those that are interested, the settings for Pan and Zoom are on the camera's shape node under 2D Pan/Zoom 

Friday, August 15, 2014

Tab to create in Maya

This recently spawned in the "small annoying things" for Maya , and sparked a little buzz.

Creating nodes "nuke style" in the Node Editor is awesome.   So awesome that now everyone wants to do it every maya panel..   Sounds pretty good to me.

 For years I've had my ` key mapped to "set focus to command line"   and then typed in something like

`createNode multDoubleLinear`      For the longest time, that's the only way I used to actually create that node.. But the command line doesn't have autocomplete nor suggestion popups.

 As usual, someone has already tackled this and put it out there for public consumption.
 I haven't tried either of these scripts yet. but they look pretty cool

 active typing


Thursday, June 26, 2014

VP 2.0 (shaded mode) pushes objects

I still don't really use VP2.0 for the little things that drive you crazy, and this is one of them.

if you are in shaded mode in VP2.0 , for some reason, it pushes those objects in front of the grid in the ortho views.

 luckily this doesn't happen in "legacy" view.

( thanks Alex for reporting the issue )

Friday, May 23, 2014

Pay Day Standing tall

PayDay Standing tall from smann on Vimeo.

I was responsible for all the rigging and deformation controls.  For this version we had to kick it up a notch in all departments as the clients wanted as close to reality that they could get.    Numerous reference was taken of scrunched wrappers, various salt levels , stretched caramel, and various lighting scenarios.

My biggest challenge for me was the wrapper scrunching. Since all the assets were actually from our previous pay day commercials, there was a bit of salvage and recovery to keep things on time and budget, but also everything had to be upgraded.  The caramel geo and wrapper geo was double rez compared to previous, along with all the textures getting make overs.  For the salt , the amount and poly count was probably close to tripled.

  originally the salt was created as physical geometry , and although we could actually use it and push it through the pipeline, it really bogged everything down. There was a lot of debate about salt scale, placement, and amount, so I wrote a few tools for loading and affecting the salt for the anm/lgt team.I created a mirror rig of the caramel bar with salt and peanuts that could be used just to adjust the look of the salt.

 Once the salt levels were decided upon, we employed arnold asset files. Other than some weird interaction quirks they worked extremely well, and not only sped up rendering tremendously, but interaction speed in Maya was completely restored.  ( as long as you kept them in bounding box view)

 Other than doubling the poly count and resculpting the divots in the caramel, the process for the caramel was fairly similar to the previous jobs.  The divots this time were a progressive blend shape that the animator could draw on as the peanuts hit the bar. I had to make these twice so the broken half bars matched the full unbroken bar.  There was also a small curl that came off the front edges of the broken bar that had a simple joint rig to grow and animate it. 

 The wrapper got the most attention for this upgrade. The most important part was getting the wrapper to look like it wasn't stretching but scrunching and folding without distorting the textures too much.  I gave the animator a simple scrunch rig based on the original lower res geo, and then used that as a base to create the progressive blend shapes of the scrunch. To get better creasing and control over the wrapped I kicked the shapes into mudbox and back to maya to iterate through the shapes.   The connection to mudbox was great as I had already created the progressive blend in maya, but could just "send to Mudbox"  a target shape, sculpt it , then "send to Maya" and it just fell into place and the blend still worked and was updated.  This was great as I could quickly make changes and see if they worked or not and make sure the movement flowed correctly. 

This technique was especially helpful for the end position of the wrapper as it fell and hit the ground. The client wanted the wrapper to maintain rigid in its shape with folds and creases.  The animators rig was joint driven and looked like a spinal column with ribs( or ladder )  so they could tweak and bend the wrapper into a number of shapes, but it didn't have too much in the way of creasing.   I took the final position from the animation and sent it to mudbox and sculpted a shape that worked well enough, and then brought it back into the rig to augment the joints in finding the final position. I used bspirit.mel to convert the sculpt to the target shape that could be injected before the joints.   So the joint rig and blend shape could be used in conjunction.

 well, that's it..   Just a little bit into the inner workings of Pay day "standing tall" 


Friday, May 2, 2014

What's new and missing in MAYA 2015: keep faces together on extrude

So I can't really say why there is so much removed and moved in Maya 2015 but I can shed some light on how to get some of your options back.

 For 2015 the "keep faces together" radio button has been removed from the top of the polygon menus.Also, the extrude tool listed is the one for the modeling tool kit, not the original Maya extrude.

and for those of you don't want to commit to the modeling tool kit, this can be a bit of a pain.

You need to access the old extrude tool via the shift LMB over your geo marking menu. ( down for extrude Face)

 There is also no option in the extrude tools option box, which I'm gonna flag as a bug.

So you can just do you're extrude and then edit the extrude node in the channel box ( orange arrow below ), or you can use shift + cntrl + RMB and get the extrude options marking menu and "toggle keep faces together" Personally I  would rather this was "turn on, or turn off" as toggling assumes you already know the current state.  

I'm currently hunting down the env to set the default on this. ( for me its ON by default ) which I like.but from what I understand this is not true for everyone. 

 running "togglePolyMoveComponents" will toggle the actual ENV . so if you are currrently ON by default it will make it off by default, and OFF to ON . 

Tuesday, April 8, 2014

CHRLX 2014 reel

The latest REEL edit for CHRLX

CHRLX Reel 2014 from CHRLX on Vimeo.

 I'm responsible for the character rigging.

Tuesday, March 25, 2014

Overriding Maya's duplicate defaults for better stability

Everything in Maya is basically name based. Move the sphere named "ball" over by 24 units etc.

Amazingly you can break a lot of simplicity of Maya by simply having 2 objects named the same thing.
In the following, if you were to type "select ball" Maya will return an error: or "setAttr ball.ty 100;" or basically any command that doesn't use the full path of the object. which is very common.( in Maya default and in many online scripts)

// Error: line 1: More than one object matches name: ball
 "group1| ball"  & "group2|ball"

Obviously this is not ideal.
In my experience I've found it is just easier to give every node in Maya a unique name and avoid name clashing as much as possible.

 However. The duplicate and duplicate with transform in Maya no longer has any options that you can customize, and by default is not set to rename children.

so if you duplicate "group2|ball" you will get "group3|ball"   as it only cares about objects in the same parent space.

I'm not exactly why it was decided to remove the options for duplicate and duplicate with transform , but I'm not a fan.

So I hijack the scripts and put them in my prefs/scripts/ directory and let it ignore the embedded Maya commands.

for Duplicate do a "whatIs performDuplicate.mel" and copy paste that script into your prefs dir.
then edit that script with the info below


find the line that says :
int $renameChild = 0;
and replace the 0 with a 1
int $renameChild = 1;

for Duplicate with Transforms its a little easier, as it just uses the duplicate command , so you can add the following as a script in your prefs/scripts/ dir.

global proc DuplicateWithTransform ()
evalEcho("duplicate -rc -smartTransform")

the nice thing is, Duplicate Special still has an option box (for now) so if you want to duplicate a bunch of objects and retain non-unique child names, you can.

hope this helps

Friday, March 14, 2014

Smann's Toolbox Shelf for Maya

Okay, I hate the toolbox, I think it's a waste of space. So I started tinkering around with adding a shelf to it to make it more useful. 

 I've got everything working, now I'm just gonna try it out in production and see how it all holds up.

Right Now I'm over writing Maya's internal toobox,mel by putting mine in the prefs/scripts folder, but I think eventually I'd like to do it like addSideShelf.mel and have it just add to the toolbox rather than override.. but first I have to see how well this idea even works.

also, right now I only made 1 possible shelf available.. maybe down the line I'll add tabs.  but at some point the internal maya commend "shelfLayout" lost its ability to be vertical. 

Wednesday, February 19, 2014


again with the facebook requests!

in any case, super quick script for creating control curves based on selected objects and parenting the objects under them

// creates a nurbs curve with a parent, and parents the selected objects under it alla  a quick control //curve for animation.
global proc quickControl ()
string $sel[] = `ls -sl`;
for ($each in $sel)
    float $pos[] = `xform -q -ws -rp $each` ;
    float $rot[] = `xform -q -ws -ro $each`;
    select -cl;
    string $grp = `group -em -n ($each + "CONGR")`;

    string $control =` curve -n ($each + "CONTROL") -d 1 -p -4 0 -4 -p 4 0 -4 -p 4 0 4 -p -4 0 4 -p -4 0 -4 -p 0 0 -4 -p 3.134446 0 -3.134446 -p 4 0 0 -p 3.134446 0 3.134446 -p 0 0 4 -p -3.134446 0 3.134446 -p -4 0 0 -p -3.134446 0 -3.134446 -p 0 0 -4 -k 0 -k 1 -k 2 -k 3 -k 4 -k 5 -k 6 -k 7 -k 8 -k 9 -k 10 -k 11 -k 12 -k 13 `;
    parent $control $grp;

move -rpr -xyz $pos[0] $pos[1] $pos[2]  $grp;
xform -ws -ro $rot[0] $rot[1] $rot[2]  $grp;

parent $each $control;


Friday, February 7, 2014

Quick Script for making an ikSpline rig along selected curves

So  a friend of mine posted a question/request about needing a script to make joint chains on hair curves and then applying some sort of joint ikSpline rig to those curves, and then binding that to the respective geo.

 I was bored. Saw his post and said, sure,  why not.  I write this kind of stuff all the time, so why not expand a little and share.

So here is what I wrote, with over commenting.  

 maybe it will help someone, or they can get a laugh out of it as it is written in mel.

The use of this is based on a selection of curves, and those curves have matching geo with the suffix "GEO"
  It creates a joint chain of 10 joints and scales them to match the length of the selected curves, and then uses that curve as an ikSpline handle, and then does a simple bind of the joints to the geo.

The idea being that your geo is just named the same as the curve, plus GEO.
ie: "curve178' has  a corresponding geo named "curve178GEO"  To be fair, its not often we have this scenario where curves and geo match each other, but that's what cometRename is for.. and I do this a lot,  I know I don't want that geo named anything like that, but I'll temporarily name it that way to make the script slightly easier, and then after the fact I'll just name them back to something better. ( if it matters)

also, I didn't do any nice naming of anything in this script, its all whatever Maya wants to name it.. Generally I don't do that either. I give everything matching names that make sense and make it easy to find relationships later. ( visually / mentally ) . Naming nodes is really just to help us humans.    Cause really , it doesn't matter what anything is named , you can always follow the connections.( but clashing names are always bad, for humans and computers) .

global proc curveJointRig ()
string $crvs[] = `ls -sl`;
select -cl;
// create GOD group
string $grp = `group -em -n "GOD"`;
select -cl;
for ($crv in $crvs)
    // arclen creates a node called curveInfo and connects it to the given curve.   
    // the main use here is to get the length of the curve to figure out how long the joints 
    // should be, and to then use that to drive their stretch  
    //  for more info   `help -doc arclen`;
    string $cInfo = `arclen -ch -1 $crv`;
    float $dis = `getAttr ($cInfo + ".arcLength")`;
    float $jlen = ($dis / 10);
    string $jnts[];
    clear $jnts;
    int $i = 0;
    while ($i <= 10)
        // the joint command makes joint.. in this case I'm just putting them at 0 1 2 3 
        // as I don't know yet what length i want them to be.   for more info `help -doc joint`;
        string $jnt = `joint -p $i 0 0 `;
        $jnts[`size$jnts`] = $jnt;
        int $n = `size$jnts`;
        print ($jnt + "  " + $jnts[$n -1] + " /n");
        // I used catch here as I don't really care if it works or not, 
        //when making joints if the joint stays  selected while you create the next joint, 
       // it will automatically parent correctly also, I'm not doing any rotation axis settings here,, 
        // for more info `help -doc catch`;
        catch (`parent $jnt $jnts[$n -2]`);
        setAttr ($jnt + ".tx") $jlen;
    // make ikSpline handle    for more info `help -doc ikHandle`;
    ikHandle -sol ikSplineSolver -sj $jnts[0] -ee $jnts[(`size $jnts` -1)] -ccv false -pcv false -curve $crv;  
    // do some stretch rigging   yadda yadda yadda  joints on chain, scale with curve as it gets
    // longer and shorter based on the arclength dividing the original length of the curve and the     //current length, which is then plugged into the scaleX of the joints
    //( did not do any twist rigging here) this is a pretty standard practice. 
    // operation sets how the mult div works, 1 =mult, 2 = divide, 3= pow
    string $multA = `createNode multiplyDivide`;
    setAttr ($multA + ".operation") 2;
    connectAttr ($cInfo +".arcLength") ($multA + ".input1X");
    setAttr ($multA + ".input2X") $dis;
    string $multB = `createNode multiplyDivide`;
    setAttr ($multB + ".operation") 2;
    connectAttr ($multA + ".outputX") ($multB + ".input1X");
        for ($jnt in $jnts)
        connectAttr ($multB + ".outputX") ($jnt + ".sx");
     // some clean up  This is just grouping, and plugging the scaleX of the main group
     //  into the secondary mult that will keep things from exploding.
     // that only works if you parent the joints under the group as well.
    // this curve has no rig on it, so I put that in there as well, but normally I want put joints
    // on it, or clusters and those would go in the group, and not the curve
     parent $jnts[0] $grp;
     parent $crv  $grp ;
     connectAttr ($grp + ".sx") ($multB + ".input2X" );
      select -cl;

     // bind?  ( I really did the least amount of scripting possible here.. but it should give 
    // a base to start with     for more info use `help -doc skinCluster`;
     skinCluster -dr 7.5 -tsb $jnts ($crv + "GEO");

     select -cl;
     print ("finished " + $crv + " \n");


here is just the node graph of the curveInfo to the multDiv to the joints .

well, anyway, I hope that helps someone.. or gives them a laugh. .