Labels

Sunday, 15 April 2012

Update for 16 April



So, my control rig was a little broken, and needed to be fixed. Here is the video update showing the rig in progress with the control rig. The script has been modified to look for anything with the prefix "rig" for the control, tokenise it (break it into strings with "_" ), rebuild the joints, and connect any with similar names after the prefix. This means that I can make severe modifications to the rig, but only need to transfer the bones that will be skinned - i.e. the controller bones (FK/IK/auto dynamics and others will not be included).

The issue so far with my setup is that it does not look for any specific hierarchy to copy to, unlike my previous script - causing issues if there is more than one similar rig in the scene or another rig with any joints named similarly.

Here is the working script:
 <code>

///////////////////////////////////////////////////////////////////////////////////////////////
//    Sophie Brennan - Control Rig Setup
//
//  How to use this script:

//   1. Make sure your group node containing your rig is called "grp_controlRig"
//   2. Make sure each skeleton has the joints named to match with the prefix "rig" and
//    "jnt" for the control and export rig respectively. Also make sure that the joints are
//    in the exact same hierarchy as unwanted translations will occur if the original
//    translations/rotatations are different.
//   3. When running the rig, please specify whether you are breaking or joining
//     connections, i.e. sbControlRig "break"; or sbControlRig "connect";
//
//
/////////////////////////////////////////////////////////////////////////////////////////////////

global proc sbControlRig (string $specifyFunc)
{

 if (($specifyFunc != "break") &amp;&amp; ($specifyFunc != "connect"))
 {
  $doWarning = 1;
  warning "Unknown argument. Please specify either break or connect. ie: sbControlRig break; \n";
 } else
 {
  $doWarning = 0;
  print "Function specified - continuing with script. \n";
 }

 string $rigJoints[] = `listRelatives -c -ad -type "joint" "grp_controlRig"`;
 string $buffer[];
 string $expPrefix = "jnt";
 string $expJnt;
 string $delim = "_";
 int $first;



 if ($specifyFunc == "connect")
 {

     for ($obj in $rigJoints)
{
 // split the joint name in this loop by underscores into $buffer variable
 tokenize $obj "_" $buffer;


 //rebuild the string replacing the prefix

 $first = 1;
 for ($str in $buffer)
 {
  if($first) { $expJnt = $expPrefix; }
  else { $expJnt += ($delim + $str); }
  $first = 0;
 }

 //check the object exists and connection attributes if it does

 if ( objExists($expJnt) )
 {
 connectAttr ($obj+".r") ($expJnt+".r");
 connectAttr ($obj+".t") ($expJnt+".t");
 print ("Rig joint " + $obj + " connected to drive " + $expJnt + "\n");
 }
 else
 {
  print ("Export joint does not exist: '"+$expJnt+"'\n");;
 }
}
    }

 else if ($specifyFunc == "break")
 {

    for ($obj in $rigJoints)
{
 // split the joint name in this loop by underscores into $buffer variable
 tokenize $obj "_" $buffer;


 //rebuild the string replacing the prefix

 $first = 1;
 for ($str in $buffer)
 {
  if($first) { $expJnt = $expPrefix; }
  else { $expJnt += ($delim + $str); }
  $first = 0;
 }

 //check the object exists and connection attributes if it does

 if ( objExists($expJnt) )
 {
 disconnectAttr ($obj+".r") ($expJnt+".r");
 disconnectAttr ($obj+".t") ($expJnt+".t");
 print ("Rig joint " + $obj + " disconnected from " + $expJnt + "\n");
 }
 else
 {
  print ("Export joint does not exist: '"+$expJnt+"'\n");;
 }
}

    }

 else
 {
 //Do nothing
 print "Argument not specified - please specify break or connect. /n";
 }
}</code>

The problem with this system however, might prove making an independent hip controller difficult. SDK on things like the hands have not been done yet (though to save time they will be done via a script I will write - which should be fairly easy to do, as I've been writing scripts to set up IK/FK joints and other tedious tasks) as I finalise and import all the various pieces of the character's mesh.

The main problem with my scripts at the moment is that they are only useful for 1. my use and 2. use with the rig setup shown. While this speeds up my process, it would be almost useless for a studio, which needs adaptable and non-specific scripts for studio-wide use.

For the auto-hood system used, I have driven the hair curve with controllers, where the joints are affected by dynamics. While this produces some really nice secondary motion - collision is a huge issue. I tried to set up rigid bodies for collisions, but because the meshes intersect they are not able to have these dynamics applied. Overall, FK animation may be more efficient but it was a nice experiment and is still available in-case the animator might wish to use it. The method used was observed and de-constructed from Harry Gladwin-Geoghegan's freely available dino rig online, where it was adapted to the needs of my rig.

Things to be done

- fix the hip joint
- find way of attaching the bag
- SDK/various other controllers


Playing with a skin shader and SSS. (subsurface scattering)

Sunday, 18 March 2012

Update on Project

Hey I haven't actually put up my progress on my art in a while, so I'll throw up what I've got at the moment and explain it.

First of all, I'm still sculpting and detailing my human character, though I have the base shape all blocked in and sloidifie






 ///////////////////////////////////////////////////////////////////////////////////////////////
//                Sophie Brennan - Control Rig Setup
//
//        How to use this script:
//            1. Make sure your group node containing your joints for exportation is called
//                "grp_exportSkeleton"
//            2. Then make sure your group node containing your rig is called "grp_controlRig"
//            3. Make sure each skeleton has the same number of joints in the exact same place.
//            4. When running the rig, please specify whether you are breaking or joining
//                 connections, i.e. sbControlRig break; or sbControlRig connect;
//
//
/////////////////////////////////////////////////////////////////////////////////////////////////

global proc sbControlRig (string $specifyFunc)
{

    string $legSide;
    if (($specifyFunc != "break") && ($specifyFunc != "connect"))
    {
        $doWarning = 1;
        warning "Unknown argument. Please specify either break or connect. ie: sbControlRig break; \n";
    } else
    {
        $doWarning = 0;
        print "Function specified - continuing with script. \n";
    }
  
    string $bones[] = `listRelatives -c -ad -type "joint" "grp_exportSkeleton"`;
    string $joints[] = `listRelatives -c -ad -type "joint" "grp_controlRig"`;
    int $bonesLength = `size $bones`;
    int $jointsLength = `size $joints`;
    int $i;
  
  
    if ($specifyFunc == "connect")
    {
  
        for ($i = 0 ; $i < $bonesLength ; $i++ )
        {
        connectAttr ($joints[$i]+".r") ($bones[$i]+".r");
        connectAttr ($joints[$i]+".t") ($bones[$i]+".t");
        }
    }

    else if ($specifyFunc == "break")
    {

        for ($i = 0 ; $i < $bonesLength ; $i++ )
        {
        disconnectAttr ($joints[$i]+".r") ($bones[$i]+".r");
        disconnectAttr ($joints[$i]+".t") ($bones[$i]+".t");
        }
  
    }
  
    else
    {
    //Do nothing
    print "Argument not specified - please specify break or connect. /n";
    }
}

Friday, 9 March 2012

Crit Sessions Semester Two

Yesterday was crit day, in which myself and another fourth year student took a group of around 8 other students (from the years below) and offered advice and critique on their work.

Incase you're wondering where is my pitch session - I was unable to attend it due to being at Animex 2012 - the session was never resceduled.

First of all, we had a different group of students than in the first semester, so a vast majority of the work was new to me. Due to some problems beforehand, where students would interupt and talk out of turn, we informed the group that we would adhere to the strict timing of a 5 minutes presentation and 5 minute question session, and that students would wait their turn beforefore they could ask questions. Me and my other supervising 4th year would then offer feedback and open the group to discussion of their work. This enabled us to keep our group and presentations structured, and that each student would have equal oppertunity to present. Luckily, this rule was adhered to, as the students were serious and respectful of their own and their peer's presentation.

We also decided that we would allow the first year students to present first, and go chronologically from that, to save on unnesscary repitition (i.e. this is x module with y hand-ins), and would give each student more time to talk about their own progress and work, rather than the course.

With the student's feedback, I endeavoured to keep the critique useful - by pointing out their weaknesses, but offering them advice in what is the best way to approach them and improve their work. A lot of the students had worked hard on their project, though it was obvious when a few were behind. We made our best effort to make this clear to them without discouraging them. Once again, because I did not do first and second year at Abertay University, it was harder to know what was expected of the students, and what they were graded on - it would have helped to have looked at their briefs beforehand to get an idea of what might be expected and when.

Overall, the prensetations went quite well, were on time and we were able to offer feedback that was relevent and encouraging. Issues noted were possibly being a little too easy or lax on students who were falling behind, and care must be taken to make them aware of this without discouraging them. Group discussion beyond our feedback was lacking too, and the pitch session might have benefited more if we encouraged feedback from other students - though the 5 minutes question time was often utilised to its fullest. As there are no more crit and pitch sessions, it is worth reflecting on the whole experience, from the three sessions I monitored.

Firstly, I think I have developed group management skills, and am able to speak with authority amoung my peers. My awareness of time management and the importance of it has also improved greatly from the first pitch session in week four. Feedback given is a lot more relevent and though I often drifted towards technical solutions, my fourth year project has helped me understand all elements of a project and address them appropriately.

One final good thing to note is that I offered direct help to the students by inviting them along to my Maya Clinic, where I can help them further. This has proved useful not only for them (as I teach them), but for me as it allows me to develop my comminication and teaching skills - also very important in the field of technical art.

Wednesday, 22 February 2012

Videos

I promised some videos and here they are:

First of all - a video showcasing the soft-eyes rig. Obviously looking at it, it immediately needs a lot of tweaking to look right - but the principle it there. It is driven by a combination of blendshapes (corrective ones too), expressions (linking the blendshapes and connecting the controllers) and SDK to drive the motion of the eyelids with the rotational value of the joint. There is 3 joints in the eye, one of each eyelid and one for the eyeball itself. Doing this excersise let me get to grips with a lot of facial workaround as well as linking up blendshapes to be driven by controllers. When it comes to producing the character, I'd like a rather strong joint-based controlled system, as blendshapes can't give you complete control over the character (especially in this case as our creature has a rather long snout).


Secondly, we have a really quick turntable of the rough human sculpt I'm working on. This helps me imagine the form a lot better as I lay the clothes on top of him. I'd like to spend more time detailing this, but as I don't really need to it's more effecient to move on now that I have the shape correct.

Thursday, 16 February 2012

Animex 2012

Hey blog!



The lack of activity lately is due to the fact that for the entire of last week I attended Animex, a festival for games and animation/film held down in Teeside University, Middlesbourgh. I originally intended to do work down here, bringing my laptop along - but upon arrivial I discovered that there was too much to do that was not to be missed out on. I attended talks by Valve, Naughty Dog and Epic, as well as talks by Framestore, MPC and Double Negative - visual effects companies. I also attended a workshop that was relevant to my dissertation - titled "Engage your left brain - practical maths and physics for digital artists". Overall, the festival was a very enjoyable experience, and although I did not managed to do a lot in terms of my university dissertation I learnt a lot about the realities of work and also a lot of interesting tips, tricks and solutions for specific problems encountered in these fields. Finally, I learnt that my portfolio is rather weak, and it really needs to be beefed up upon graduation - something my project will help me achieve.

I could write a whole entry on my experience at Animex, but this is not really the place to do it - as although it wasn't entirely helpful to my degree at hand - it was certainly extraordinarily eye-opening in terms of what I can expect due the summer - when I'm dropped into the big bad world of work. 

In the meantime, I have done some quick rigging tests with corrective blendshapes and a soft eye rig (driven by a combination of joints, expression and blendshapes). I will post this test up here.

In the coming week I hope to complete my human character's sculpt and begin rigging and texturing - a very time-consuming part of the process. 

Saturday, 4 February 2012

Week 18+

Start of a new semester!

Okay, so since submission I've done the following:

  • Character development has advanced again, this will be detailed below and goals will be made
  • The project, and specifically objective 2.0 has been modified to suit the aim a lot more appropriately - clarified down there a little
  • The beginnings of the judgement criteria questionnaire has been written up
  • Expert candidates have been contacted
  • Have began learning about shaders, also detailed further in the post
  • Feedback has been received on my initial proposal
  • Feedback has been received on second proposal
Character work since then:

First of all, some quick modelling was done to get the composition of the scene set out. Here is the character in relation to the creation and the corresponding layout of the final scene below. 




The creature was explored some more, this was more along the lines of something I wanted, but it's still needing finalised at this point.
I also created some quick thumbnails to explore character costumes before taking it on to the final stage of the finalised model sheet.

Character clothes thumbnails to rough out design
 
 When deciding upon the character as it finally stood, I had to consider how I might construct and build the character, as well as material types. No colour tests were done as I'm currently hoping to get my monitor colours calibrated. I found when drawing that neither of my monitors currently represent true monitor colours, and thus they need calibrated. Luckily, a friend of mine is willing to lend me theirs so I can continue on with my project accurately.

Final Model Sheets
Zbrush Front

Zbrush Side
As mentioned before, I had to take the character into considering when bringing it into Zbrush. I decided the only sensible part of his outfit to be cloth simulation was his robe, as I hope to drive the hood with a hair system within maya (allowing automatic overlapping animation and collisions to save time. I then took the model planes into ZBrush and laid out zspheres to map the shapes.





Now it's completely on to sculpting and building out the model, while using subtools to create the cloth. I will create the skull separately and import it into the final model to be attached via the rig. The horns, clothes, and other details will be added as subtools, then retopologised.

The character is currently being sculpted, but I do not feel comfortable showing it as it currently is in the blog, when the sculpt is more complete, it'll update it with a progress shot.

Learned about shaders:

A friend has been giving me introductions into shader language for games - specifically HLSL (high level shader language) and render monkey. In the meantime, I've been picking up linear algebra to improve my 3D math, which will hopefully aid me in my scripts as well.

I now understand the difference between pixel and vertex shaders, as well as the various elements within those shaders that are required to render a frame. While this learning is ongoing, I don't know how applicable these skills will be in the final project, but they are certainly helping me with my general understanding of 3D.

(Discovering that XYZ was linked to RGB was a satisfying breakthrough! No more guessing which means which in 3D space!)

The project and the new method of evaluation!

An initial version of the judgement criteria has been drafted. I have a lot of thoughts on this to write down, mostly in consideration of art, tech and the delicate balances that have to be considered when judging art. I hope to write a fuller post on the conclusion of this later on, in a more general post. Needless to say, it's not easy to put technical art in a box. I've been trying to ask around within the community for opinions, but it's something I must also discover for myself!

As always, onwards and upwards - here we go!

Wednesday, 11 January 2012

Media Tests and Experiments

This is a compilations of the various media tests that I have researched before starting my project. Please understand that all of these examples are from tutorials and workbooks, and therefore they are not entirely original work. However, it is through the reconstruction of these tutorials that I will learn the techniques and knowledge that I need to complete my project from a practical standpoint.

Each video has narration. I try to make them as quick as possible to demo my understanding of what I learned through the tutorial and what that video will aid in the future. However for anything I did not mention in the media tests/experiments in the video, I have annotated in this post.


Cloth tests:


First of all, I watched a video that helped me understand the basics of cloth. I was unable to use Cloth 101, a gnomon workshop DVD as it detailed a system of cloth that no longer exists in maya today. Therefore, not having any other information available from the library, I sought out tutorials on youtube.

What is interesting to note of Maya's ncloth, is that is a system dedicated to using 4-sided regular polygon shapes to simulate cloth. It has all the bells and whistles of the classic cloth system, but does NOT work with nurb or sub-divisional shapes in Maya.

Here are the tests:

It is important to learn cloth, as I have planned the use of it in my final asset. I hope to carry out more specific examples in my media tests, more akin to something I'll be doing, but for now I'll just get to grips with the basics.

Maya's native ncloth system does not seem too difficult to understand and carry out, so I hope it will be one of the easier aspects of the artefact's creation and from doing these tests I'm not so worried about the final.

Rigging Tests:

Rigging is essentially putting strings on the puppet that is the 3D model. It is essential to get the character to move, but can be quite technically involved, sometimes even incorporating maths techniques like vector maths and such. 

Rigging is the one of the core skills of technical artists. While there is much more to technical art than rigging, TAs are often referred to as rigging artists instead. There is some confusion to the role, and today is expands beyond just rigging. However, a lot of complex rigging techniques are used in some of the biggest films today. Some of the techniques below, however, are very standard and are some of the most basic rigging skills a TA can have.







Currently, the third test does not have audio, as the recording messed up half way through. In short, it is just me going over an IK/FK switch, where there are 3 sets of leg joints (in this case). One we can control, one that is set with IK(inverse kinemetics) and FK (forward kinemetics). There are some orient constraints set to an attribute on the FK/IK switch that allows the animator to interpolate between the two. This is useful because it allows more flexibility when animating, as the animator is not restricted to only one method of animation.

Hair/Fur Tests: