Archive for June, 2009

More about Occlusion(part II)

Wednesday, June 17th, 2009

3D collab class I helped with

The shot above was from the 3D collab class I helped with last quarter.

Since there were all Animation kids in their class, they needed some VSFX help.

I helped them set up almost everything such as lighting, shading, render passes, and compositing.

And a interesting stuff for me was to set up the Occlusion pass with correct refraction in it.

Usually when render the occlusion pass, we exclude all the “glass” and any other “transparency” objects from the render layer.

However, the master layer has been rendered with all the objects(including the refracted objects behind the machine’s glass containner in the shot above), so when it comes to the Occlusion pass, if the Occlusion haven’t been refracted, the final comp will not look correctly.

There are two ways to add the occlusion into the master layer.

1. One easy way to do it is using Mental Ray’s Mia-x material, and turn on the Ambient Occlusion on:

AO in Mia material

AO in Mia material

And all the occlusions will be rendered in the master layer.

2. If user were not using Mia material, it will be a huge pain to change all the shaders to Mia materials..

So the second way to achieve the “occlusion with refraction” is to :

a. Assign the “miLabel” to objects in the scene.

b. Don’t exclude the glass container of the machine. Instead, assign a miLable to the glass such as 2, then set the mib_AO shader’s attribute “ID Nonself” the same as the glass’s miLabel(in this case is 2). When set up like this,  the glass container will not cause any occlusion to other objects in the scene.

c. Instead of connect the mib_AO shader to the surface shader directly, connect it to a mib_refract shader(can be found in the sample composition tab) like this:

use mib_refract shader

use mib_refract shader

set the Refraction value to 1(or lower than one for not 100% transparanted glass), and set the “Index of Refraction” value exactly the same as your glass shader’s IOR value in the master layer(You could even write an expression to connect this two values if you are geeky enough).

After this, we will get the “refracted Occlusion”:

Result of Refracted Occlusion

Result of Refracted Occlusion

Hope this will help.


A little more..

Also, with similar set up, we can play with Occlusion even more. For example, I created the model of the feathers by overlaping poly planes with transparency maps. And with proper set up, I can render the occlusion like this:

AO in Mia material

Feather AO by using similar set up

Give it a try if you want, it’s really fun ^______^.

More about occlusion (part I)

Tuesday, June 16th, 2009

For example, I have a scene in the image below:

screen shoot of the examplescene

screen shoot of the examplescene

when using the MR shader mib_amb_occlusion node, if we want to render a pass that has the occlusion of the sphere rendered with out display it, normally we can just turn the sphere’s “primary visibility” off. It fits 90% percent of this kind of situations.

However, if user want not only the sphere’s occlusion be rendered, but also none of the boxes generate occlusion, it will be problem because if I turn “primary visibility” of all the boxes off, nohing will be rendered, and if not, the occlusion of sphere on boxes and the occlusion of boxes themselves will be rendered altogether, below is the undesirable result I got if just turnning the “primary visiblitiy” off:

rendered image with spheres pri visibility off

rendered image with sphere's "pri visibility" off

Obviously, the occlusion inbetween the gaps of the boxes are sometimes not we want…

This is when the “ID Inclexcl” “ID Noself” attribute come into handy.
Actually, the djx blog has a really good explain to this:

click here

One important thing to notice is that the “miLabel” attribute is case sensitive.

And for sake of  saving time, I wrote a script for assign the “miLabel” attr to all the selected objects.

Again, since it’s a reall small script, I wrote it with Python in Maya:

Click here

Copy the code into the Python tab of the script editor and use it….

After assign the miLabel to the boxes and sphere, I assign all the boxes’ miLabel =3, and assign the miLabel of the sphere to 1.

Moreover, correspondingly, assign the mib_amb_occlusion shader like this:

assign the ID correctly

assign the ID correctly

Then we will get the desired result:

result of correct ID set up in the shader

result of correct ID set up in the shader

With this set up, we can have only the sphere’s occlusion that affect the evironment…..

A little script to add the light annotations

Thursday, June 4th, 2009

Inspired by my Friend Al Torres, I wrote a script to add annotations to all the lights in the scene.

Also, if lights’ names have been changed by usrs, re-run the script will update the annotations.

Since it’s very small script, and I don’t want people bother too much to install pymel, I wrote it with default python for Maya script.       This scriptif for usr has a lot of lights in the scene and might have a hard time to remember which light is for what…

Also, name the lights properly before using this script will be a good choice.

create annotations and updated names

annotations added and updated

Here is the script:

ling_addLights_annotation

Copy the codes and run in scripts editor. Hope this will help

Update: The last version of script has some bug: if a light in the scene has more than one children node, the script will not working due to my cheesy approach of finding the annotation node. For example:


Sometimes when duplicating the light an annoying camera node will be created

annoying camrea with the light

Sometimes Maya attaches a camera node to a light when duplicating it, the refined version of the script will delete the camera nodes attached to the light. Also, the script will check each children node of a light, make sure there is an annotation node in it. If yes, just update the light’s name when necessary. If not, create the annotaion.

Here is the refined version: ling_annotation_refine