Demo Reel 2010
Maya,Portfolio,Scripting,Shared,modCharSetup — redesigndavid @ 9:19 pm

Animate Blendshapes Weights per Vertex
Maya — redesigndavid @ 3:57 pm

I found a way to animate blendshapes’ weights, without any plugin, merely using connections. I’m posting a tutorial soon. You think you can figure out a way to accomplish this?

I will post a tutorial in two weeks time.

The technique would be applicable to more than just weights for blendshapes. It might even be possible to control weights for skinCluster joints too (if that helps for anything? Yeah, it should.) Some other possible applications would be blendshapes for the way Eddie Murphy turned into Nutty Professor.

Thanks everyone!!!! :) Hope to hear from you!

Add Joints Per Vertex
Maya — redesigndavid @ 5:27 pm

There are two methods to make an a mesh follow the vertexes of another mesh. One is to use a wrap deformer or add the influencing mesh as an influence in a skinCluster with use components enabled. The problem with wraps is it could get a bit slow. The problem with the next is somehow the post normalization available in Maya2011 doesn’t work with it. I decided to write a script that create joints and make the follow each vertex on the influencing mesh. Theoretically, you’ll have the best of all words.


proc jointsOnVerts (string $polygon) {
    $grp = `createNode transform -n ($polygon+"vtxGRP")`;
    $size = size(`polyInfo -faceToVertex $polygon`);
    for ($i=0;$i<int($size);$i++){
        $trans = `createNode transform`;
        $pos = `xform -q -ws -t ($polygon+".vtx["+$i+"]")`;
        xform -ws -t $pos[0] $pos[1] $pos[2] $trans;
        $fol=`createFolliclePolygon $trans $polygon`;
        delete $trans;
        $joint = `createNode joint -n ($polygon+"vtx"+$i)`;
        parent $joint $fol[0];
        setAttr ($joint+".t") 0 0 0;
        setAttr ($joint+".r") 0 0 0;
        setAttr ($joint+".jo") 0 0 0;
        parent $fol[0] $grp;
    }
}

proc string[]  createFolliclePolygon  (string $posTransform, string $nurbsSurface) {
    // make vector product nodes to get correct positions of the transform node
    $vecprod = `createNode vectorProduct`;
    setAttr ($vecprod+".operation") 4;
    connectAttr ($posTransform+".worldMatrix") ($vecprod+".matrix");
    connectAttr ($posTransform+".rotatePivot") ($vecprod+".input1");

    // connect the correct position to a closest point on surface node created
    $cpos = `createNode closestPointOnMesh -n ($posTransform+"_CPOS")`;
    connectAttr ($nurbsSurface+".worldMesh") ($cpos+".im");
    connectAttr ($vecprod+".output") ($cpos+".inPosition");

    // create a follicle node and connect it
    $folTransform = `createNode transform -n ($posTransform+"follicle")`;
    $fol = `createNode follicle -n ($posTransform+"follicleShape") -p $folTransform`;
    connectAttr -f ($fol+".outTranslate") ($folTransform+".translate");
    connectAttr -f ($fol+".outRotate") ($folTransform+".rotate");
    connectAttr -f ($nurbsSurface+".outMesh") ($fol+".inputMesh");
    connectAttr -f ($nurbsSurface+".worldMatrix[0]") ($fol+".inputWorldMatrix");

    setAttr ($fol+".parameterU") (`getAttr ($cpos+".parameterU")`);
    setAttr  ($fol+".parameterV") (`getAttr ($cpos+".parameterV")`);

    //create a blend between two attributes, a constant and the parameterU output of the cpos to control the follicle's parameter U
    $blendU = `createNode blendTwoAttr`;
    setAttr ($blendU+".input[0]") (`getAttr ($cpos+".parameterU")`);
    connectAttr ($cpos+".parameterU") ($blendU+".input[1]") ;
    connectAttr ($blendU+".output") ($fol+".parameterU");

    //return strings
    select -r  $folTransform $fol $cpos $blendU ;
    $list = `ls -sl`;
    select -cl;
    return $list ;
}

Blending Spline IKs and Ribbon Setups
Maya — redesigndavid @ 3:37 pm

I was unhappy with the controls I was giving the tentacles of our squid/octopus-looking monster. I decided to recreate them. This time, I’ll avoid as many constraints as I possibly could. And I’ll notate as I go through everything.

Right from the start, we wanted to give each tentacle an ability to pose in all sorts of ways. The control types that came to mind were either a spline IK or a ribbon controller. There are pros and cons for both.

The ik spline is awesome. It is widely used for lots of setups. I’ve seen cat tails and pony tails set up in this manner.

Essentially, ik splines (like most ik systems) handle the rotations of your joints. It handles them so that they would always fall exactly where your curve is.

My problem with using this for our tentacles is its lack of ability to twist in a detailed manner. If you wonder why CG systems haven’t developed enough to meet this requirement, you are asking the wrong question. The lack of proper twisting for spline IK’s makes sense. Splines, after all, cannot twist–just as a point contains no information of orientation and a line has no idea of where its flat surface may be.

This lack is solved by a ribbon setup. A ribbon, after all, is what you get when you extrude a spline in a direction giving it an ability to twist. A ribbon setup is also awesome. There’s a gazillion things you could do with a ribbon setup and it all depends on how much you control you want to have. In essence, you’ll have a bunch of joints or transforms follow specific points on a surface in position and orientation. If you twist that surface, those joints would all twist for you. And the surface can have as little as two controllers to make it bend, twist or whatever or just as many joints as you have, which is stupid. This of course depends on the amount of control you want to have.

The problem with the ribbon setup is, since joints would always follow specific points on the surface, when those surfaces extend too much, you’ll get stretching. Something you might want to have at times, but not all the time. This stretching can also occur for controllers you place in the middle of the surface. If it was a ribbon setup for the spine of a human character and you a middle controller somewhere in the abdomen, moving this controller up the chest would make the lower part of the abdomen stretch while crunching the part that goes into the chest. This might be important for toony animations but it does destroy realism for realistic characters. On the other hand, an IK spline, controlling nothing but rotations, won’t have this problem. The space between joints would remain the same all throughout the animation regardless of the surface’s stretching.

I wanted to combine both. I was thinking of doing it like how they combine IK and FK setups in an IK-FK blend, but it was obvious it wasn’t enough. If the ribbon setup is curling up a branch or a cylinder of some sort, and we switch to the IK spline, we’ll have the joints cut through the cylinder. It’ll be like an ugly morph where each point would just look for its corresponding target point and make a bee line towards it—a straight unrealistic, pass-through-anything-that-gets-in-the-way path. In the same way, if our tentacle has to stretch (or relax) it needs to be intelligent enough to do all this while in the space of the surface.

So the idea I had was to have a ribbon setup with each joint’s position depend on the UV coordinates provided by a blend between a constant and the UV coordinates that’s closest to a corresponding joint in an IK spline setup. Whew that was a mouthful. LOL!

To say that piece by piece, it goes: We have a ribbon setup. In that ribbon setup are joints that follow specific points on a surface. They know which specific points on that surface because of a UV input. If that input is constant, they’ll just follow that point on the surface regardless. But we’ll make that input a blend between two values. The first value would be the original constant, a value that would tell the joint its rightful point on the surface. While the second value the blend blends to is the closes UV point to a respective joint on an IK spline setup that also follows the surface.

That last bit is still a mouthful. It almost seems like a parallel story line that needs further breaking up. While we were working on the ribbon setup, there’s another set of joints. These joints are an exact replica of the original, except for their names obviously. These joints are connected to special nodes that try to find information for points on surfaces that are closest to positions. The information we are looking for are the UV coordinates these IK joints are closest to. By the way, we make sure this IK spline is following the surface exactly by duplicating an isoparm on the surface, with construction history kept on.

So that’s the idea. How’s it done? Well, I wrote a script for it.

The two procedures are:

proc jointsOnSurfaceToSplineRibbonBlend (string $jointList[], string $nurbsSurface, string $blendNode)  {
//init
if (!`objExists "follicleGRP"`) createNode transform -n "follicleGRP";
if (!`objExists "iksGRP"`) createNode transform -n "iksGRP";

if (!`attributeExists "blend" $blendNode`) {
addAttr -ln "blend" -at double -min 0 -max 1 -dv 0 $blendNode;
setAttr -e-keyable true ($blendNode+".blend");
}

// make ik equivalent of joints
for ($i=0; $i < `size $jointList`;$i++) {
$dup = `duplicate -n ($jointList[$i]+"ik") -po $jointList[$i]  `;
if ($i>0) parent $dup ($jointList[$i-1]+"ik");
else parent $dup "iksGRP";
}

// duplicate curve
$dupCurve =`duplicateCurve -ch 1 -rn 0 -local 0 ($nurbsSurface+".v[0.5]")`;

//create ik spline
string $ikHandle[];
select -cl;
$ikHandle = `ikHandle -curve $dupCurve[0] -sol ikSplineSolver -ccv false -pcv false -ns 3 -startJoint ($jointList[0]+"ik") -endEffector ($jointList[size($jointList)-1]+"ik")`;

//create follicles for each joint
for ($each in $jointList) {
$folAr = `createFollicle ($each+"ik") $nurbsSurface`;
// make those follicles become controlled by the blendNode
// note: we made sure that the createFollicle proc has the blendNode as the fourth (or index 3) element in the array return variable
connectAttr ($blendNode+".blend") ($folAr[3]+".attributesBlender");
parent $each $folAr[0];
parent $folAr[0] "follicleGRP";
}

// clean ups

}

proc string[]  createFollicle  (string $posTransform, string $nurbsSurface) {
// make vector product nodes to get correct positions of the transform node
$vecprod = `createNode vectorProduct`;
setAttr ($vecprod+".operation") 4;
connectAttr ($posTransform+".worldMatrix") ($vecprod+".matrix");
connectAttr ($posTransform+".rotatePivot") ($vecprod+".input1");

// connect the correct position to a closest point on surface node created
$cpos = `createNode closestPointOnSurface -n ($posTransform+"_CPOS")`;
connectAttr ($nurbsSurface+".ws") ($cpos+".is");
connectAttr ($vecprod+".output") ($cpos+".inPosition");

// create a follicle node and connect it
$folTransform = `createNode transform -n ($posTransform+"follicle")`;
$fol = `createNode follicle -n ($posTransform+"follicleShape") -p $folTransform`;
connectAttr -f ($fol+".outTranslate") ($folTransform+".translate");
connectAttr -f ($fol+".outRotate") ($folTransform+".rotate");
connectAttr -f ($nurbsSurface+".local") ($fol+".is");
connectAttr -f ($nurbsSurface+".worldMatrix[0]") ($fol+".inputWorldMatrix");

setAttr ($fol+".parameterU") (`getAttr ($cpos+".parameterU")`);
setAttr  ($fol+".parameterV") (`getAttr ($cpos+".parameterV")`);

//create a blend between two attributes, a constant and the parameterU output of the cpos to control the follicle's parameter U
$blendU = `createNode blendTwoAttr`;
setAttr ($blendU+".input[0]") (`getAttr ($cpos+".parameterU")`);
connectAttr ($cpos+".parameterU") ($blendU+".input[1]") ;
connectAttr ($blendU+".output") ($fol+".parameterU");

//return strings
select -r  $folTransform $fol $cpos $blendU ;
$list = `ls -sl`;
select -cl;
return $list ;
}

To use the code, you’ll need to have an unlimited version of Maya. Run those commands so they are registered in Maya’s brains. Then you will need a surface.

080410 0737 11 Blending Spline IKs and Ribbon Setups

Make sure that this surface is longer in the parameter U of its UV coordinates rather than its V parameter. The script I wrote is designed to allow it to go both ways, but just for simplicities sake, I did it this way. Create joints on the middle surface and a control curve somewhere. I used snap to grid to make sure my joints are right at the center of the surface’s V parameter.

080410 0737 21 Blending Spline IKs and Ribbon Setups

Then, run this command.

$jointList = {"joint1","joint2","joint3"}; // this is a list of the joints in order. You could choose to use 'ls –sl' for this if you want.
$nurbsSurface = "nurbsPlane1"; // name of the transform node of the surface
$blendNode = "nurbsCircle1"; // name of the control curve to which the blend will be added.
jointsOnSurfaceToSplineRibbonBlend $jointList $nurbsSurface $blendNode ; // this is the actual command with the variables added in proper order

You can set up clusters to control your nurbs surface or you could drag its control points just to test them out. Make the stretch and control as much as you want. Then change the values of the “blend” attribute you have in the nurbsCurve you created. Watch the joints (now no longer in a hierarchy) stretch and relax in the space of the surface.

Download Beta Version JD-redesignImages
JD redesignImages — redesigndavid @ 12:06 pm

blueprint1008 thumb Download Beta Version JD redesignImages

The images has, of course, nothing to do with the download. The download contains the latest version of my first plugin, JD-redesignImages. Learn more about it from this post.

JD-redesign-images (16)

JD redesignImages
JD redesignImages — redesigndavid @ 6:52 pm

wordpress.jpg

WordPress has never been so amazing!

With JD redesignImages, you can avoid hotlinked images on your site. Cuz if we all play our part, we can make the world a better place. Let’s say, you have a blog. You won’t spend all your time reading your own blog’s articles. That’ll bore you to death! You probably know all of them by heart anyway, unless you stole those too!

Instead, you’d probably be reading somebody else’s blog. And often, you’d like to write something about somebody’s artwork and in the process beautify your own drab blog with a sample image (or gallery depending on how low your morals are). Then, you have two choices. One, you either download the image–or gallery, we talked about this already–unto your HD and re-upload them unto your blog. This takes time. After which, you lay them on your post, write your thoughts (pretend you are original) and publish. If you are lucky, the images would fall snug fit in your theme’s layout.

If you are not, you’ll have adjust things by either forcing them to display with an akward image resolution. Or you resize them with your favorite image editing program, and upload them a second time.

See my hassle-full point? Having a hotlinked-image-free site has been top New Year Resolutions for bloggers (maybe? if they care). But they all succumb to the alternative, a much simpler “Just Hotlink It” motto.

JD redesignImages primary objective is to rid your sight of this sacrilegious practice. And with all good things, they come with bonuses. Not only will it cleanse your site, it will also resize your images proportionately, and apply optional filters like grayscale, brightness, contrast, tint and blur. Why would you wanna do something like this? Well, it saves time and money! That should be enough reason!

How do I use it?

After installing and activating the plugin, go to your settings tab from your admin panel and look for JD redesignImages.

jd images settings link JD redesignImages

You can change the maximum width images would be displayed in your site. You could also change the maximum width linked images would display.

jd images settings1 JD redesignImages

Optionally, you can change the suffixes of the images that would be downloaded into your wordpress uploads directory. You can also choose to have certain filters be applied before they are saved.

Everytime a post or page is published, updated, edited, or shown on your website, JD redesignImages would check for two things: hotlinked and oversized images. For every image that meets the criteria, it applies the filters set above. <a href=”"> and <img src=”"> tags would then be updated to point to the new images saved in your “uploads folder” (images that are _suffixed according to your settings).

Having too many filters enabled may slow down publishing, updating, editing or showing of pages or posts. Server speed would play a factor. Blogs on cheap hosting would suffer more. Choose to enable filter with discretion.

Auto Image Size Reduction Using PHP
JD redesignImages — redesigndavid @ 2:49 pm

big wave thumb Auto Image Size Reduction Using PHP

Bravo! Bravo! I knew I can do it. Stayed up late last night, learning PHP code. Haha! I’m no George Malley (from Phenomenon, John Travolta), who devoured an English-Spanish dictionary on a 20 minute drive to a sick lady they all thought was possessed (stomach flu can be the devil), but last night, I set out to accomplish something and today I woke up to find out that it actually worked.

I am very much in love with my plain and simple theme. But what readers do not see is underneath this smooth exterior, there’s a violent monster ruthlessly cleaning up content, a.k.a. wordpress’s plugin system. To give you a brief picture, let me explain how images are handled in my blog.

First of all, I am extremely lazy. I hate downloading images off unassumming websites, just to re-upload them into mine. I find this completely unnessary. If we are to steal images, I say, why not do it in style? So I spent hours and hours (ironic huh? lazyness pushing me to work for hours! happens all the time) looking to a plugin that would automatically download remote images. The answer? wp super images.

I know I out moved a lot of you guys. I had been searching for the plugin and most of the forums show unresolved queries for a such and such plugin. I found it. Here it is. I think, it’s lack of popularity might be due to its EASL developers, Chinese if I’m right.

So that’s one part that’s cool! The plugin downloads images from “img” tags and links to images (eg a href equals blah blah). It treats both queries separately too. So if you wanna have a hand on things like me, it’ll be easy for you.

Secondly, once you have all your images on your local server (was that a misnomer or whats that you call names for ironic things like huge minitures), you need to make sure they are never too big for your theme. I have nCode Image Resizer for that.

nCode Image Resizer is another awesome simple program. My problem is resizing is done using javascript. That means readers would first download the huge files and then javascript would check them for obesesity and only then will it reduce them. Not good! Now, I remember there was a popular non-wordpress-exclusive script that generates thumbnails off images with width and height arguments. TimThumb. Last night, I decided to write php functions on for my theme that would measure images widths. Once it finds obese pics, it’ll make some calculations to find the proper height for the new girth a.k.a BMI and then replace the src links from my image tags to incorporate timthumbs new diet dimensions.

And viola! I can upload as many pics as I want. Pics of all sizes.  And my theme would search them out, weigh them and resize them if neccessary. I’ll have a plugin released maybe next week, if time permits.


add_action('the_content', 'JD_treatcontent');

function JD_treatcontent ($the_content) {

	//this looks for all img tags from the_content
	preg_match_all('/<img[^>]+>/is',$the_content, $result);

	//creates two arrays, newimgtags is empty, originalimgtags contains the img tags
	$originalimgtags = $result[0];
	$newimgtags = array();

	//each tag is passthru jd_capimagesize function and results is sent to the empty array newimgtags
	foreach ($originalimgtags as $key=>$imgtag) {
		$newimgtags[$key] = JD_capimagesize($imgtag);
	}

	//each instance from the original list of tags is replaced with the new one
	$post->post_content = str_replace($originalimgtags,$newimgtags,$the_content);

	return $post->post_content;

}

function JD_treatimages ($post_ID) {

	$post = get_post($post_ID);
	$the_content = $post->post_content;

	//this looks for all img tags from the_content
	preg_match_all('/<img[^>]+>/is',$the_content, $result);

	//creates two arrays, newimgtags is empty, originalimgtags contains the img tags
	$originalimgtags = $result[0];
	$newimgtags = array();

	//each tag is passthru jd_capimagesize function and results is sent to the empty array newimgtags
	foreach ($originalimgtags as $key=>$imgtag) {
		$newimgtags[$key] = JD_capimagesize($imgtag);
	}

	//each instance from the original list of tags is replaced with the new one
	$post->post_content = str_replace($originalimgtags,$newimgtags,$the_content);

	//database is updated
	global $wpdb;
	$postary=add_magic_quotes(array("content"=>$post->post_content));
	$wpdb->query("UPDATE `wp_posts` SET `post_content` = '{$postary["content"]}' WHERE `ID` = '{$post_ID}';");

}

function JD_capimagesize($content) {

	//lists arrays of urls, widths and heights
	$images=JD_GetImgUrlFromHtml($content,"url");
	$widths=JD_GetImgUrlFromHtml($content,"width");
	$heights=JD_GetImgUrlFromHtml($content,"height");

	//cleans up width and height tags from images, and gets new urls from JD_capimage
	$newimages=array();
	foreach ($images as $key=>$url)
	{
		$images[$key]= 'src="'.$images[$key];
		$newimages[$key]='src="'.JD_capimage($url);
		$widths[$key]= 'width="'.$widths[$key].'"';
		$heights[$key]= 'height="'.$heights[$key].'"';
	}

	//finishes clean up and replaces old url with new ones
	$content=str_replace($images,$newimages,$content);
	$content=str_replace($widths,'',$content);
	$content=str_replace($heights,'',$content);
	return $content;
}

function JD_capimage($url) {
	$size = getimagesize($url);
	$uploads=wp_upload_dir();

	if ($size[0] > 500) {
		$proportion = 500 / $size[0];
		$height = floor($size[1] * $proportion);

		$url = get_bloginfo('template_directory') . '/timthumb.php?src=' . $url . '&w=500&h='.$height.'&zc=1';

	}
	return $url;
}

function JD_savefile($newurl,$filename)
{
	$content=@file_get_contents($newurl);

	$fp=fopen($filename,"w+");
	if (fwrite($fp,$content))
	{
		fclose($fp);
		return $filename;
	}
	else
	{
		fclose($fp);
		return false;
	}
}

function JD_GetImgUrlFromHtml($text,$request)
{
	preg_match_all("'<img[^>]*?>'si",$text,$n);
	$oldimgsrc=array();
	$oldwidth=array();
	$oldheight=array();
	foreach ($n as $m)
	{
		foreach ($m as $x)
		{
			preg_match('#src[[:space:]]*=[[:space:]]*[\'|"]?([[:alnum:]:@/._-]+[?]?[^\'|"]*)"?#ie',$x,$y);
			$oldimgsrc[]=$y[1];

			preg_match('#width[[:space:]]*=[[:space:]]*[\'|"]?([[:alnum:]:@/._-]+[?]?[^\'|"]*)"?#ie',$x,$y);
			$oldwidth[]=$y[1];

			preg_match('#height[[:space:]]*=[[:space:]]*[\'|"]?([[:alnum:]:@/._-]+[?]?[^\'|"]*)"?#ie',$x,$y);
			$oldheight[]=$y[1];
		}
	}
	switch ($request) {
    		case "src":
        		return $oldimgsrc;
        		break;
    		case "width":
       		 	return $oldwidth;
      			break;
    		case "height":
        		return $oldheight;
        		break;
		}
	return $oldimgsrc;
}

Splitting XYZ from BlendShape Targets
Maya — redesigndavid @ 4:39 pm

I was reading an article about an awesome book about facial character setup titled Stop Staring. It’s pretty old. Definitely worth the buy!

It describes a method of having to divide the axises of displacement caused by targets.

It works simple. Consider a blendshape deformer that makes a vertex move from point A to point B.

pointA 250x250 Splitting XYZ from BlendShape TargetspointB 250x250 Splitting XYZ from BlendShape Targets

We will instead make 3 versions of the target shape. With each copy containing displacement coming from only one axis.

xaxis 250x250 Splitting XYZ from BlendShape Targets

yaxis 250x250 Splitting XYZ from BlendShape Targets

zaxis 250x250 Splitting XYZ from BlendShape Targets


This step is achieved using a script.

global proc isolateAxisBlend (string $base, string $ini_target, string $axis) {
    $object = `duplicate -n ($ini_target+"_dup_"+$axis) $ini_target`;
    $obj = $object[0];

        for ($i=0;$i<4570;$i++) {
        $xform_base = `xform -q -t ($base+".vtx["+$i+"]")`;
        $xform_obj = `xform -q -t ($obj+".vtx["+$i+"]")`;

        switch ($axis) {
            case "yz" :
                xform -t $xform_base[0] $xform_obj[1] $xform_obj[2] ($obj+".vtx["+$i+"]");
                break;
            case "xz" :
                xform -t $xform_obj[0] $xform_base[1] $xform_obj[2] ($obj+".vtx["+$i+"]");
                break;
            case "xy" :
                xform -t $xform_obj[0] $xform_obj[1] $xform_base[2] ($obj+".vtx["+$i+"]");
                break;
            case "z" :
                xform -t $xform_base[0] $xform_base[1] $xform_obj[2] ($obj+".vtx["+$i+"]");
                break;
            case "x" :
                xform -t $xform_obj[0] $xform_base[1] $xform_base[2] ($obj+".vtx["+$i+"]");
                break;
            case "y" :
                xform -t $xform_base[0] $xform_obj[1] $xform_base[2] ($obj+".vtx["+$i+"]");
                break;
        }

    }

}

Usage: To use this procedure, copy, paste and run it from the script editor to load the procedure into memory. You’ll need a base shape and a target shape. In MAYA’s MEL command line (or through the script editor), type isolateAxisBlend “nameOfBaseMesh” “nameOfTargetMesh” “axis”. For example:

isolateAxisBlend "baseMesh" "targetMesh" "x";
isolateAxisBlend "baseMesh" "targetMesh" "y";
isolateAxisBlend "baseMesh" "targetMesh" "z";

Try this:

  1. Create two polygon spheres named “baseMesh” and “targetMesh”.
  2. Select “targetMesh” and go to component mode. Select all vertices and scale it so it is twice bigger in all axises. (Remember to do it in component mode and to not freeze transforms.)
  3. Execute the code in the example above.
  4. There will be three new shapes named “targetMesh_x”, “targetMesh_y” and “targetMesh_z”. You can delete “targetMesh”.
  5. Select “targetMesh_x”, “targetMesh_y”, “targetMesh_z”, and “baseMesh” in that order. We will set up a blendshape node. Go to Animation–>Create Deformers–>Blend Shape.
  6. Create a locator. Select the locator and then the blendshape node. If you followed this tutorial to the letter you can just type the following on MEL command line. “select -r locator1 blendShape1;”
  7. Go to Windows–>General Editors–>Connection Editor. Connect the three axises of translation to the three weights in the blendShape.

Moving the locator would now control all three axises of the target. Verts would no longer move from one point to another, but rather flow the way the animator wants it. On characters, especially facial blends, you get an even bigger variety of targets.

Small Developer, Big World
Scripting — redesigndavid @ 9:08 am

8946 universe thumb Small Developer, Big World

Programming is all around us. Developers fuel the iPhone and it’s competition, Android. Developers also are the ones responsible for jailbreaking the iPhone.

We need developers to write programs for our work, for our banks, for the games we play and for movies we watch. Their work is ubiquitos.

And it fattens my heart to know the written word is no longer just a means to communicate between humans, but it is also a means to control applications and, by extension, worlds of organized knowledge.

I am a developer with no formal training. I love it. I breath scripting and taste it in my sweat when I run. And the more I program, the more I realize that everything I’ve done, doesn’t even come close to the world of possibilities. Heck, everything created by all of humanity is still insignificant. Especially in comparison to the bench mark set by reality. Developers can only attempt to go to the correct direction. The feeling is as big as a googolplex.

If you don’t already know, a googol is a number starting with one an followed by hundred zeros. Big, huh? A googolplex is another number again starting with one, but this time followed by googol of zeros. A philosopher/scientist once supposed it was practically impossible to write one googolplex on paper because there isn’t enough room in this world to fit it in. I think that’s dumb. Haha! But the world of possibilities is to me just as big. Carl Sagan wrote in his book, “a googolplex is precisely as far from infinity as is the number one.” That’s how I feel.

Each language I encounter is a beckon call to attempt the impossible. And yet for every success, you realize that even the word “impossible” is a construct, an ever so elusive construct that will always stay in the horizon of your line of sight no matter how far you run.

I offer this line to the developer community and to the shoes the size of the universe we are trying to fit our shoes in.

print "hello world!";

modCharSetup version 1
modCharSetup — redesigndavid @ 2:34 pm

downloadModCharSetup modCharSetup version 1

First release of the modCharSetup (short for Modular Character Setup) for Maya is now available for download. Please peruse modCharSetup 101 to learn how to use it.

To download the file click here: withImage

To install, just unzip the download. Inside you will see a file named autoinstall.cmd. Run this file by double clicking on it. It will install and place all the neccessary scripts in their proper places. In Maya (after a restart, if autoinstall.cmd was invoked while Maya was running), just look for the command line. Make sure you set it to MEL, instead of Python. Type modCharSetup. Press enter. Anytime in the future you wish to run modCharSetup, just type the same command or turn it into a shelf icon.

The modCharSetup window should now appear. The last icon brings you to the modCharSetup category in this site. Please fill me in everything regarding your experience with the script.

Page 1 of 212
This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License.
(c) 2010 redesigndavid.me | powered by WordPress with Barecity
אורן יומטוב