Labels

Monday, 28 November 2011

More Character Stuff

Here is some of the concepts I've developed over the last week. First of all, there are some mood boards and visual boards for the environment, the creature and the human character. 

 


Just a little bit on how these three tie together: 

While not entirely based on Earth, the world these characters come from is a much more mythical one, which the people, natures and the creatures are all very closely linked. Our limited story is that of a lone hunter/trader and his mount who roam the natural tundra-esque scapes of their world together. At the moment there is not much more than this - a visual style and a relationship established between the three. While the environment won't be a large part of my project as such, I'll try to incorporate a little of it into the final piece.

So here's the character stuff in it's current iterations. I've been just generating some ideas so I can jump to the next step.




Change of Direction...!

Although I've not been the best at keeping this blog up to date with my most current thoughts and progress on my project, it's appropriate to say that after crit week my project has had a change of direction, but not a complete change of heart. I've managed to channel the questions that intrigued and troubled me the most into a more suitable project.

Worrying about tackling the technical side of a technical artist was a great focus up to now, but I've always wondered - where does the "artist" of technical artist come into play? Why is it more suitable for a person with an artistic background (with a little bit of programming know-how) to be in this role rather than the reverse (a programmer who dabbles in art).

This could easily turn into some psychology project, but I'm going to steer it away less from the person and make it more about the role. What makes a technical artist? Why is it so diverse? Why is it so hard to define? Where can the technical artist express their arty side - the creative side? Is it purely about communication of ideas between groups? Can a technical artist be independent? Is it entirely a group effort role?

Now the characters I design will only be a vessel for showcasing my work, though it doesn't mean that detracts from their artistic integrity!

So watch this space while I update it with thoughts guiding me in my new direction. For now however, I better crack on with the work. Up and away!

Sunday, 20 November 2011

Character Stuff

So, it was suggested that I jump into sketching and sketch out some character concepts.
First of all, I looked at existing media for some inspiration. The idea behind this is that I would take an already imagined and fleshed out concept and adapt it to a style that suited me. I looked at myths, fairy tales and stories, but despite there being a wealth of these ideas out there, I found a lot of the actual characters in these stories to be mostly uninteresting. I watched Suzie Templeton's interpretation of Peter and the Wolf - a stop motion film made in 2006 and liked how she modernised the story slightly, as well as putting twists on it. The visual style was stunning, so I drew a sketch to explore the idea:



Ultimately though, I felt uncomfortable working with an idea that wasn't mine, and felt I might have already biased myself towards her remake - and therefore decided to ditch the idea. Overall, as I feel I have the freedom to do whatever I want creatively, the idea of limiting myself so early felt a bit disappointing, so I decided to ditch the idea altogether.


So my next step was to throw together some pictures of stuff I liked into a "style" board.

My problem was, I couldn't find a whole lot of examples for what I wanted it to look like! My main inspiration was Rango, Uncharted 3 and a showreel of a modeller called Ricardo Bonisoli. So instead of struggling finding what I wanted to achieve, I just set ahead and tried it out myself. What I wanted was something Amy Hennig (Creative Director of Naughty Dog) referred to as "stylised realism" - that is, something that is rendered realistically but can be stylistic in form, shape and all other aspects. Here's my interpretation.



Here I took an eye and tried to render some basic textures around it, like the reflection of the eye, the depth of the eyeball, the bumpiness of the skin, the soft and long wiry hairs around the face and the shiny flesh of the eyeball. I wanted to make it a little grittier than depicted here, but decided I was moderately happy with my result as a test.

Next step was to try and create some characters. After a little more soul-searching, I broke down the project into the things that I wanted to achieve technically and found that if I were to create a character (bipedal) and their mount (at least quadrupedal - if not something else) I could cover a lot of the aspects I wanted to create! Hair, fur, cloth, textures and a lot of nice rigging techniques could be included - as well as there being less of a struggle to establish a relationship between the characters through personality. It should be pretty obvious how they interact through their visual appearance this way, so I could make a set of characters that were consistent and interesting!

I thought about nomads travelling in the desert, and I threw together a little sketch:

Although I know that there is little development behind this sketch other than my thinking, it helped visualise the relationship and characters I was looking for, as well as lead me in a direction that I so badly needed. This should mean there should be less struggling from this point on. Onwards and upwards!

Change of direction

Sorry blog for not updating you in a while. The reason for this is I've had some feedback after crit that suggested that I change a lot of my direction. I'm still moving ideas and such about for a slightly revised set of aim and objectives, but in the meantime I have been keeping myself busy. Here is a dump of some of the stuff I've done so far:

First of all, I've been learning MELscript. While I've been taking notes and learning a lot of examples from the book, I'll list the examples I've worked on here.

//Create a sphere named "mySphere", catch the return value of the nodes (creation and translate), create arrays for translate, rotate and scale, catch the data and query the values of the translate,
//rotate and scale of the current sphere. Scale cannot be caught when it is absolute.
string $name = "mySphere";
string $names[] = `sphere -n $name -p 0 0 0 -ax 0 1 0 -ssw 0 -esw 360
-r 1 -d 3 -s 8 -nsp 4 -ch 1`;
float $trans[] = `xform -q -t $names[0]`;
float $rots[] = `xform -q -ro $names[0]`;
float $scls[] = `xform -q -s $names[0]`;
//print some of the values caught and queried
print $trans[1];
print $scls[2];
print $rots[0];


vector $vects = <<3.1,7.6,1.008>>;
print ($vects + "\n");
print (($vects.y + "\n");




string $name = "mySphere";
string $names[] = `sphere -n $name -p 0 0 0 -ax 0 1 0 -ssw 0 -esw 360
-r 1 -d 3 -s 8 -nsp 4 -ch 1`;
vector $tranV = `xform -q -t $names[0]`;
vector $rotV = `xform -q -ro $names[0]`;
vector $scalV = `xform -q -s $names[0]`;
string $name3 = "mySphereThree";
string $names[] = `sphere -n $name3 -p 0 0 0 -ax 0 1 0 -ssw 0 -esw 360
-r 1 -d 3 -s 8 -nsp 4 -ch 1`;
xform -ws -t ($tranV.x) ($tranV.y) ($tranV.z) -ro ($rotV.x) ($rotV.y) ($rotV.z)
-s ($scalV.x) ($scalV.y) ($scal.z) $names3[0];


proc cmMyProc ()
{
//These values will be used to translate the sphere:
int $num = 7;
float $dec = 3.267;
float $sum = $num + $dec;
//Declare variables contraining the primitive names
string $ball = "myBall";
string $box = "myBox";
//Create and translate the sphere using xform
string $sphereNodes[] = `sphere -n $ball -p 0 0 0 -ax 0 1 0 -ssw 0 -esw 360
-r 1 -d 3 -s 8 -nsp 4 -ch 1`;
xform -t $num $dec $sum $sphereNodes[0];
//Create and translate the cube by querying the sphere translations
string $cubeNodes[] = `polyCube -n $box -w 2 -h 2 -d 2 -sx 1 -sy 1 -sz 1 -ax 0 10 0 -cuv 4 -ch 1`;
vector $tranV = `xform -q -t $sphereNodes[0]`;
xform -ws -t ($tranV.x) ($tranV.y) ($tranV.z) $cubeNodes[0];
select -cl;
}
//Run the procedure
cmMyProc;


proc string[] cmMyProc (int $num,float $dec,string $ball,string $box)
{
    float $sum = $num + $dec;
   string $sphereNodes[] = `sphere -n $ball -p 0 0 0 -ax 0 1 0 -ssw 0
   -esw 360 -r 1 -d 3 -s 8 -nsp 4 -ch 1`;
   xform -t $num $dec $sum $sphereNodes[0];
   string $cubeNodes[] = `polyCube -n $box -w 2 -h 2 -d 2 -sx 1 -sy 1
   -sz 1 -ax 0 1 0 -cuv 4 -ch 1`;
   vector $tranV = `xform -q -t $sphereNodes[0]`;
   xform -ws -t ($tranV.x)($tranV.y)($tranV.z) $cubeNodes[0];
   select -cl;
   string $names[] = {$sphereNodes[0],$sphereNodes[1],
   $cubeNodes[0],$cubeNodes[1]};
   return $names;
}
string $return[] = cmMyProc (7,3.267,"myBall","myBox");
print $return;


//Global procedure to query xforms of targetm and return xform string
global proc string cmQryXforms (string $target,string $constrain)
{
    //Query all three transforms
    float $cmQueryTrans[] = `xform -q -t $target`;
    float $cmQueryRot[] = `xform -q -ro $target`;
    float $cmQueryScale[] = `xform -q -s -r $target`;
    //Create strings that can be combined in a final xform command
    string $string1 = (" -t " +$cmQueryTrans[0]+ " " + $cmQueryTrans[1] + " " + $cmQueryTrans[2]);
    string $string2 = (" -ro " +$cmQueryRot[0]+ " " + $cmQueryRot[1] + " " + $cmQueryRot[2]);
    string $string3 = (" -s " +$cmQueryScale[0]+ " " + $cmQueryScale[1] + " " + $cmQueryScale[2] + " ");
    //Combine the strings into the final xform command, and return
    string $return = ("xform " + $string1 + $string2 + $string3 + $constrain + ";");
    return $return;
}


//Run the procedure, catch the return, and print final xform command
 string $xformGo = cmQryXforms ("myBall", "myBox");
print ($xformGo + "\n");


//Local procedure to use as xform tool to transform objects to target
proc cmXformTool ()
{
 //List the selected transforms nodes:
 string $selTrans[] = `ls -sl`;
 string $target = $selTrans[0];
 string $constrain = $selTrans[1];
    //Query all three transforms
    float $cmQueryTrans[] = `xform -q -t $target`;
    float $cmQueryRot[] = `xform -q -ro $target`;
    float $cmQueryScale[] = `xform -q -s -r $target`;
 //Create strings that can be combined in a final xform command
    string $string1 = (" -t " +$cmQueryTrans[0]+ " " + $cmQueryTrans[1] + " " + $cmQueryTrans[2]);
    string $string2 = (" -ro " +$cmQueryRot[0]+ " " + $cmQueryRot[1] + " " + $cmQueryRot[2]);
    string $string3 = (" -s " +$cmQueryScale[0]+ " " + $cmQueryScale[1] + " " + $cmQueryScale[2] + " ");
 //Combine the strings into the final xform command, and return
 string $xformGo = ("xform " + $string1 + $string2 + $string3 + $constrain + ";");
 select -cl;
 eval ($xformGo);
}
//Run the procedure
cmXformTool;


//Local procedure to use as xform tool to transform objects to target
proc cmXformTool ()
{
 //List the selected transforms nodes:
 string $selTrans[] = `ls -sl`;
 //Error check for selection
 int $sizeSelect = `size ($selTrans)`;
 if ($sizeSelect != 2)
  error "Select a target object followed by an object to constrain.";
 string $target = $selTrans[0];
 string $constrain = $selTrans[1];
    //Query all three transforms
    float $cmQueryTrans[] = `xform -q -t $target`;
    float $cmQueryRot[] = `xform -q -ro $target`;
    float $cmQueryScale[] = `xform -q -s -r $target`;
 //Create strings that can be combined in a final xform command
    string $string1 = (" -t " +$cmQueryTrans[0]+ " " + $cmQueryTrans[1] + " " + $cmQueryTrans[2]);
    string $string2 = (" -ro " +$cmQueryRot[0]+ " " + $cmQueryRot[1] + " " + $cmQueryRot[2]);
    string $string3 = (" -s " +$cmQueryScale[0]+ " " + $cmQueryScale[1] + " " + $cmQueryScale[2] + " ");
 //Combine the strings into the final xform command, and return
 string $xformGo = ("xform " + $string1 + $string2 + $string3 + $constrain + ";");
 select -cl;
 eval ($xformGo);
}
//Run the procedure
cmXformTool;


/*




BOOLEAN SCRIPTS AHEAD - USE WITH CAUTION




*/


float $A = 7.2;
float $B = 3.5;
if ($A > $B) print "A is greater than B!\n";


//randomises and checks numbers
$A = `rand 0 10`;
$B = `rand 0 10`;
 print ("A is " + $A + "\n");
 print ("B is " + $B + "\n");
if ($A > $B) print "A is greater than B!\n";
else print "A is less than B!\n";


/*Set procedure argument to 1 or 0:
 Note!: Rands #s, 0 = Both 0 */


proc string cmCondition (int $change){
//Use condition to determine values:
float $A;
float $B;
if ($change == 1) {
 $A = `rand 0 10`;
 $B = `rand 0 10`;
}
else {
 $A = 0.0;
 $B = 0.0;
}
//Print values inside variables:
 print ("A is " + $A + "\n");
 print ("B is " + $B + "\n");
//Runs three conditionals to compare values:
 string $return;
 if ($A > $B) $return = "A is greater than B!";
 else if ($A == $B) $return = "A is equal to B!";
 else $return = "A is less than B!";
return $return;


}


//Run procedure:
string $result = cmCondition (0);
print ($result + "\n");


//Change the integer value in the procedure argument:
proc string cmfindNum (int $num) { //Open Procedure...
 //Run warning if numbers are not 5, 10, 15 or 20:
  if (($num != 5) && ($num != 10) && ($num != 15) && ($num != 20));
   warning "Input a multiple of 5 under 25!";
  //Run switch statement to set string return
  string $return;
  switch ($num) {//Open switch...
   case 5:
    $return = "Your number is 5.";
    break;
   case 10:
    $return = "Your number is 10.";
    break;
   case 15:
    $return = "Your number is 15.";
    break;
   case 20:
    $return = "Your number is 20.";
    break;
  } //Close switch
 return $return;
 } //Close procedure.
//Run procedure to catch return and print:
string $result = cmfindNum (1);
print ($result + "\n");




//Change the short primitive name in the procedure argument:
proc string[] cmCreatePrim(string $primitive){ //Open procedure...
//Run warning if numbers are not 5,10,15 or 20.
 if (($primitive != "sph") &&
  ($primitive != "cub") &&
  ($primitive != "con") &&
  ($primitive != "cyl"))
  warning "Use short primitive name (sph, cub, con, or cyl).";
//Switch statement to create prim and set string array return
 string $return[];
 switch ($primitive) {//Open switch...
 case "sph":
  $return = `sphere`;
  break;
 case "cub":
  $return = `polyCube`;
  break;
 case "con":
  $return = `polyCone`;
  break;
 case "cyl":
  $return = `cylinder`;
  break;
 } //Close switch
return $return;
} //Close procedure
//Run procedure to catch return array and print:
string $names[] = cmCreatePrim ("sph");
print ("Nodes created: " + $names[0] + "," + $names[1] + "\n");


//While Loop example creating sphere;
int $i = 0;
while ($i <= 10)
{
 string $name = "mySphere";
 string $names[] = `sphere -n $name -p 0 0 0 -ax 0 1 0 -ssw 0 -esw 360
  -r 1 -d 3 -s 8 -nsp 4 -ch 1`;
 setAttr ($names[0] + ".ty") $i;
 select -cl;
 $i = $i + 2;
} //Close Loop.


//Shift select primitives to delete history and freeze:
string $selObjs[] = `ls -sl`;
for ($obj in $selObjs){ //Open Loop
 delete -ch $obj;
 makeIdentity -apply true -t1 -r 1 -s 1 -n 0 $obj;
} //Close loop.
Other than that I've been writing a bit of my own scripts. Here are two such scripts. The first was written by myself entirely, and the second I got the help from Neil McNaughton of Ruffian to help write the code and talk me through it. :)


//////////////////////////////////////////////////////////////////////////////////////////////////////////
//
//
//     This script creates a no-flip knee setup for your bipedal character.
//
//     How to run this script:
//      1.Load the script
//      2. Specify right or left side with "ikNoFlipKnee right" or ikNoFlipKnee left"
//      3. Have Fun!
//
//////////////////////////////////////////////////////////////////////////////////////////////////////////


global proc ikNoFlipKnee(string $legSideLong)
{


 //RECORD ERRORS IN THIS VARIABLE
 int $legWarning = 0;  // 0 = No Errors
       // 1 = Error Found


 // DETERMINE WHETHER LEFT OR RIGHT LEG IS CURRENTLY BEING SETUP
 // CHECK TO ENSURE ARGUMENT IS CORRECT
 string $legSide;
 if (($legSideLong != "left") && ($legSideLong != "right"))
 {
  $legWarning = 1;
  warning "Unkown argument. Please specify either left or right. ie: cgTkSetupLeg left; \n";
 } else
 {
  if ($legSideLong == "left")
  $legSide = "l";
  if ($legSideLong == "right")
  $legSide = "r";
 }


 // CHECK TO ENSURE THAT ALL REQUIRED OBJECTS EXIST IN THE CURRENT SCENE
 if ($legWarning == 0)
 {
  if (!( (`objExists ($legSide + "Hip")`)
   &&  (`objExists ($legSide + "Knee")`)
   &&  (`objExists ($legSide + "Ankle")`)
   &&  (`objExists ($legSide + "Ball")`)
   &&  (`objExists ($legSide + "Toe")`)
   &&  (`objExists ($legSideLong + "FootController")`)))
  {
   $legWarning = 1;
   warning "Unable to find all required objects to setup leg. Please ensure all objects are named properly. \n";
  }
 }


 //IF NO ERRORS ARE ENCOUNTERED, CONTINUE WITH SETUP
 if ($legWarning == 1)
 {
  warning "The leg setup has encountered an error. Check script editor for details. \n";


 } else
 {
  print "All prerequisites were found. Setup will continue. \n";


  }


  //ORIENT THE JOINTS
select -r ($legSide + "Hip");
joint -e  -oj xyz -ch -zso;


//CREATE IK HANDLE


select -r ($legSide + "Hip");
select -tgl ($legSide + "Ankle");
ikHandle -n ($legSide + "KneeIK") -sol ikRPsolver -s 0;


//ADJUST POLE VECTOR


select -r ($legSide + "KneeIK");
setAttr ($legSide + "KneeIK.poleVectorX") 0.1;
setAttr ($legSide + "KneeIK.poleVectorY") 0;
setAttr ($legSide + "KneeIK.poleVectorZ") 0;
setAttr ($legSide + "KneeIK.twist") 90;


//MOVE FOOT CONTROLLER TO POSITION


//ADD ATTRIBUTES TO FOOT CONTROLLER (including offset)
select -r {$legSideLong + "FootController"};
addAttr -ln Knee -at "float" -k 1 -r 1 -w 1;
addAttr -ln Offset -at "float" -k 1 -r 1 -w 1;


//FREEZE TRANSFORMS AND DELETE HISTORY OF FOOTCONTROL


//select -r ($legSideLong + "FootController");
FreezeTransformations;
DeleteHistory;


//CREATE PLUS MINUS AVERAGE NODE


shadingNode -asUtility plusMinusAverage -n ($legSide + "LegIKPlusMinus");


//CONNECT NODES UP


connectAttr -force ($legSideLong + "FootController.Knee") ($legSide + "LegIKPlusMinus.input1D[0]");
connectAttr -force ($legSideLong + "FootController.Offset") ($legSide + "LegIKPlusMinus.input1D[1]");
connectAttr -force ($legSide + "LegIKPlusMinus.output1D") ($legSide + "KneeIK.twist");


//SET, LOCK AND HIDE OFFSET


select -r ($legSideLong + "FootController");
setAttr ($legSideLong + "FootController.Offset") 90;
setAttr -lock true -keyable false -channelBox false ($legSideLong + "FootController.sx");
setAttr -lock true -keyable false -channelBox false ($legSideLong + "FootController.sy");
setAttr -lock true -keyable false -channelBox false ($legSideLong + "FootController.sz");
setAttr -lock true -keyable false -channelBox false ($legSideLong + "FootController.v");
setAttr -lock true -keyable false -channelBox false ($legSideLong + "FootController.Offset");


//CREATE IKS FOR REST OF FOOT


select -r ($legSide + "Ankle");
select -tgl ($legSide + "Ball");
ikHandle -n ($legSide + "AnkleIK") -sol ikSCsolver -s "sticky";


select -r ($legSide + "Ball");
select -tgl ($legSide + "Toe");
ikHandle -n ($legSide + "FootIK") -sol ikSCsolver -s "sticky";


//ATTACH FOOT CONTROLLER


parent ($legSide + "KneeIK") ($legSideLong + "FootController");
parent ($legSide +  "AnkleIK") ($legSideLong + "FootController");
parent ($legSide + "FootIK") ($legSideLong + "FootController");


select -r ($legSideLong + "FootController");


//LET USER KNOW SCRIPT HAS BEEN RUN


print ("The " + $legSideLong + " no-flip knee has been created.");

And the second script:


// generate a random set of transform data  
float $tMin = 1.0;
float $tMax = 12.0;
float $tRand[] = {rand($tMin, $tMax), rand($tMin, $tMax), rand($tMin, $tMax)};
float $rMin = 1.0;
float $rMax = 359.0;
float $rRand[] = {rand($rMin, $rMax), rand($rMin, $rMax), rand($rMin, $rMax)};
float $sMin = 0.4;
float $sMax = 2.0;
float $sRand[] = {rand($sMin, $sMax), rand($sMin, $sMax), rand($sMin, $sMax)};


// make a sphere
string $buffer[] = `sphere`;
string $randomSphere = $buffer[0];


// set the random values into the sphere's transform
xform -ws -t $tRand[0] $tRand[1] $tRand[2] -ro $rRand[0] $rRand[1] $rRand[2] -s $sRand[0] $sRand[1] $sRand[2] $randomSphere;
 
// create a new default sphere that we can use to snap to the random one
string $buffer[] = `polySphere -n "copyCatObject"`;
string $copyCatObject = $buffer[0];


// query the position/rotation/scale of the random sphere and store values
float $trans[] = `xform -q -t $randomSphere`;
float $rots[] = `xform -q -ro $randomSphere`;
float $scls[] = `xform -q -s $randomSphere`;


// set the position/rotation/scale of the copyCatSphere to match the random sphere
xform -ws -t $trans[0] $trans[1] $trans[2] -ro $rots[0] $rots[1] $rots[2] -s $scls[0] $scls[1] $scls[2] $copyCatObject;
}


I've also been doing some character stuff and rigging trials. Might record these in action and post them up later.

Wednesday, 9 November 2011

Although I've not been the best at keeping this blog up to date with my most current thoughts and progress on my project, it's appropriate to say that after crit week my project has had a change of direction, but not a complete change of heart. I've managed to channel the questions that intrigued and troubled me the most into a more suitable project.

Worrying about tackling the technical side of a technical artist was a great focus up to now, but I've always wondered - where does the "artist" of technical artist come into play? Why is it more suitable for a person with an artistic background (with a little bit of programming know-how) to be in this role rather than the reverse (a programmer who dabbles in art).

This could easily turn into some psychology project, but I'm going to steer it away less from the person and make it more about the role. What makes a technical artist? Why is it so diverse? Why is it so hard to define? Where can the technical artist express their arty side - the creative side? Is it purely about communication of ideas between groups? Can a technical artist be independent? Is it entirely a group effort role?

Now the characters I design will only be a vessel for showcasing my work, though it doesn't mean that detracts from their artistic integrity!

So watch this space while I update it with thoughts guiding me in my new direction. For now however, I better crack on with the work. Up and away!

Tuesday, 8 November 2011

Project Proposal

Although it may look like I've been doing very little for the last week or so, I've actually been writing up the proposal (for module AG1064A) for my project, which will hopefully share a lot in common with the proposal that is being produced for AG1086A.

While the proposal for AG1064A is currently being drafted, I thought I might upload a version of it to show the general direction of my project. Though this is subject to change, it is a good way of seeing how my project has developed over time and how feedback given has been addressed.

The documents can be seen by clicking on the links listed below:


Project Proposal
Learning Contract
Project Gantt Chart

Crit Sessions

I know I've not posted in my blog for a while, but there is more to come - I promise! For now, I'm just going to cover the crit sessions I supervised today and my thoughts and feelings on how it went:

Once again, it was the same setup as last time. There were six students in total to go through in a two hour period and the session was supervised by myself and another fourth year student.

Compared to the previous pitch session, I felt I had more control and was more confident speaking to students about their work. I felt it was easier to offer critique this time, perhaps because the students had further developed their ideas and had work to go along with it. I tried as best I could to keep a student on track with what is required of their unit at the end of the day. The advice that was offered tended to be a lot more generalist rather than focus on singular modules and problems within them (though any serious issues were addressed when possible). I made sure to inform students where I thought they were doing well, but also give them advice and tasks to work towards. I also noticed that students tended to be stuck on small details rather than seeing the bigger picture or were struggling with technical issues rather than artistic ones. While it is equally important to understand technique and trying to learn key skills, it is crucial to develop artistic skills too.

For the pitch session, I watched the time and made sure that each student did not exceed their 20 minute slots but in the end there was half an hour to spare. I felt that I cut the students short so on this session I was more liberal when it came to watching the time, as I had hoped that it would work out better. Unfortunately, it turned out that we ran about 30 minutes over the limit, so next time I will endeavour to make sure that the students have a 20 minute slot and must manage their time accordingly.

Another issue I experienced was understanding the student's distinct modules and their deliverables. It would have helped if they were to prepare a powerpoint covering their modules, what they have to deliver and any previously covered content summarised, as not to waste time going over concepts which we already know (unless things have changed). This also might have fixed the issue of a lot of the work being viewable on the current computers. I advised the students to take screenshots of their work in progress so critique and advice can be given. Next time, the students should be more prepared with backups and work saved in common file formats which can be viewed on any computer.

Overall, I felt a lot more confident this time giving advice and guidance to the students both for general work and specific problems. I also felt that I offered them reasonable solutions, told them to scale back or return to an idea when they should or encourage them to work in a particular direction appropriately. However, I did make sure that the advice given to them was not concrete, and any major changes, decisions or problems in their work should be discussed with their module or personal tutor first. I also offered them help with Maya in particular in the Maya software clinics, so that I could help them out 1:1 with any technical issues they may have in their work.