Monday, June 30, 2014
Python Auto Rig Script
Finished work on a new Auto Rig script created entirely in Python. This version includes a fully customizable temp rig setup, and a bone swap function that correctly orients all bones to each other so that they are perfectly mirrored and aligned so that you should never encounter a shifting problem when adding IK pole vectors. In addition to this video, I have since created a function for the tool that allows you to save the pose of setup and recreate it if you need to add or remove certain elements you may have included. I will be sure to post a follow up video soon.
Saturday, August 31, 2013
2013 Demo Reel
A new demo reel showing my latest works in Maya with rigging characters and experimenting with MEL script.
Wednesday, August 21, 2013
AutoRigging Script Work in Progress
A video highlighting the capabilities of my AutoRigging script so far. The entire code is currently 2500 lines long and only covers the initial setup of the bones in an arm setup.
Monday, March 11, 2013
IK / FK Snapping
A quick demonstration video utilizing a few of the concepts I have been working on in regards with rigging. This video features a look at Spacial Toggling and IK / FK Snapping using Maya's mel script.
Also, here is the script I created in order to achieve the IK / FK Snapping:
int $lArmIKFK = `getAttr ctr_l_hand_attributes.ik_to_fk_snap`;
if ($lArmIKFK == 2) {
//FK to IK Variables
float $lFKUpperArmRX = `getAttr ik_l_shoulder_jnt.rx`;
float $lFKUpperArmRY = `getAttr ik_l_shoulder_jnt.ry`;
float $lFKUpperArmRZ = `getAttr ik_l_shoulder_jnt.rz`;
float $lFKForearmRX = `getAttr ik_l_elbow_jnt.rx`;
float $lFKForearmRY = `getAttr ik_l_elbow_jnt.ry`;
float $lFKForearmRZ = `getAttr ik_l_elbow_jnt.rz`;
float $lFKWristRX = `getAttr ik_l_wrist_jnt.rx`;
float $lFKWristRY = `getAttr ik_l_wrist_jnt.ry`;
float $lFKWristRZ = `getAttr ik_l_wrist_jnt.rz`;
//FK to IK Function
setAttr ctr_l_fk_upperArm.rx $lFKUpperArmRX;
setAttr ctr_l_fk_upperArm.ry $lFKUpperArmRY;
setAttr ctr_l_fk_upperArm.rz $lFKUpperArmRZ;
setAttr ctr_l_fk_forearm.rx $lFKForearmRX;
setAttr ctr_l_fk_forearm.ry $lFKForearmRY;
setAttr ctr_l_fk_forearm.rz $lFKForearmRZ;
setAttr ctr_l_fk_wrist.rx $lFKWristRX;
setAttr ctr_l_fk_wrist.ry $lFKWristRY;
setAttr ctr_l_fk_wrist.rz $lFKWristRZ;
}
else if ( $lArmIKFK == 1) {
//IK to FK Variables
string $lIKWristMover[] = `listConnections ctr_l_hand_attributes.l_ik_wrist`;
string $lFKWristTarget[] = `listConnections ctr_l_hand_attributes.l_fk_wrist`;
string $lIKPVMover[] = `listConnections ctr_l_hand_attributes.l_ik_PV`;
string $lFKPVTarget[] = `listConnections ctr_l_hand_attributes.l_fk_PV_LOC`;
float $lFKWristPos[] = `xform -q -ws -rp $lFKWristTarget[0]`;
float $lFKWristRot[] = `xform -q -ws -ro $lFKWristTarget[0]`;
float $lFKPVPos[] = `xform -q -ws -rp $lFKPVTarget[0]`;
//IK to FK Function
move -ws -rpr $lFKWristPos[0] $lFKWristPos[1] $lFKWristPos[2] $lIKWristMover[0];
xform -ws -ro $lFKWristRot[0] $lFKWristRot[1] $lFKWristRot[2] $lIKWristMover[0];
move -ws -rpr $lFKPVPos[0] $lFKPVPos[1] $lFKPVPos[2] $lIKPVMover[0];
}
int $lArmIKFK = `getAttr ctr_l_hand_attributes.ik_to_fk_snap`;
if ($lArmIKFK == 2) {
//FK to IK Variables
float $lFKUpperArmRX = `getAttr ik_l_shoulder_jnt.rx`;
float $lFKUpperArmRY = `getAttr ik_l_shoulder_jnt.ry`;
float $lFKUpperArmRZ = `getAttr ik_l_shoulder_jnt.rz`;
float $lFKForearmRX = `getAttr ik_l_elbow_jnt.rx`;
float $lFKForearmRY = `getAttr ik_l_elbow_jnt.ry`;
float $lFKForearmRZ = `getAttr ik_l_elbow_jnt.rz`;
float $lFKWristRX = `getAttr ik_l_wrist_jnt.rx`;
float $lFKWristRY = `getAttr ik_l_wrist_jnt.ry`;
float $lFKWristRZ = `getAttr ik_l_wrist_jnt.rz`;
//FK to IK Function
setAttr ctr_l_fk_upperArm.rx $lFKUpperArmRX;
setAttr ctr_l_fk_upperArm.ry $lFKUpperArmRY;
setAttr ctr_l_fk_upperArm.rz $lFKUpperArmRZ;
setAttr ctr_l_fk_forearm.rx $lFKForearmRX;
setAttr ctr_l_fk_forearm.ry $lFKForearmRY;
setAttr ctr_l_fk_forearm.rz $lFKForearmRZ;
setAttr ctr_l_fk_wrist.rx $lFKWristRX;
setAttr ctr_l_fk_wrist.ry $lFKWristRY;
setAttr ctr_l_fk_wrist.rz $lFKWristRZ;
}
else if ( $lArmIKFK == 1) {
//IK to FK Variables
string $lIKWristMover[] = `listConnections ctr_l_hand_attributes.l_ik_wrist`;
string $lFKWristTarget[] = `listConnections ctr_l_hand_attributes.l_fk_wrist`;
string $lIKPVMover[] = `listConnections ctr_l_hand_attributes.l_ik_PV`;
string $lFKPVTarget[] = `listConnections ctr_l_hand_attributes.l_fk_PV_LOC`;
float $lFKWristPos[] = `xform -q -ws -rp $lFKWristTarget[0]`;
float $lFKWristRot[] = `xform -q -ws -ro $lFKWristTarget[0]`;
float $lFKPVPos[] = `xform -q -ws -rp $lFKPVTarget[0]`;
//IK to FK Function
move -ws -rpr $lFKWristPos[0] $lFKWristPos[1] $lFKWristPos[2] $lIKWristMover[0];
xform -ws -ro $lFKWristRot[0] $lFKWristRot[1] $lFKWristRot[2] $lIKWristMover[0];
move -ws -rpr $lFKPVPos[0] $lFKPVPos[1] $lFKPVPos[2] $lIKPVMover[0];
}
Thursday, February 14, 2013
Real Time Secondary Motion Script
This was the script I used to get secondary motion on the attributes of the Panda Rig. It is quite long, but the resulting real time secondary action in the viewport is fun to look at and gives the animator a good sense of what the animation will look like. 32 total lines of code for the angler on the top of the Panda's head alone.
if (Angler_Attribute_Control.AutoOverlap == 1){
hairSystemShape2.currentTime += 1;
float $refresh_rx = Angler_1_Control.rotateX;
float $refresh_ry = Angler_1_Control.rotateY;
float $refresh_rz = Angler_1_Control.rotateZ;
float $refresh_rx = Head_Control.rotateX;
float $refresh_ry = Head_Control.rotateY;
float $refresh_rz = Head_Control.rotateZ;
float $refresh_rx = Neck_Control.rotateX;
float $refresh_ry = Neck_Control.rotateY;
float $refresh_rz = Neck_Control.rotateZ;
float $refresh_rx = Upper_Torso_Control.rotateX;
float $refresh_ry = Upper_Torso_Control.rotateY;
float $refresh_rz = Upper_Torso_Control.rotateZ;
float $refresh_rx = Spine_Rotation_Control.rotateX;
float $refresh_ry = Spine_Rotation_Control.rotateY;
float $refresh_rz = Spine_Rotation_Control.rotateZ;
float $refresh_tx = COM.translateX;
float $refresh_rx = COM.rotateX;
float $refresh_ty = COM.translateY;
float $refresh_ry = COM.rotateY;
float $refresh_tz = COM.translateZ;
float $refresh_rz = COM.rotateZ;
float $refresh_tx = Master_Movement_Control.translateX;
float $refresh_rx = Master_Rotation_Control.rotateX;
float $refresh_ty = Master_Movement_Control.translateY;
float $refresh_ry = Master_Rotation_Control.rotateY;
float $refresh_tz = Master_Movement_Control.translateZ;
float $refresh_rz = Master_Rotation_Control.rotateZ;
}else if (Angler_Attribute_Control.AutoOverlap == 0){
hairSystemShape2.currentTime = time;
}
if (Angler_Attribute_Control.AutoOverlap == 1){
hairSystemShape2.currentTime += 1;
float $refresh_rx = Angler_1_Control.rotateX;
float $refresh_ry = Angler_1_Control.rotateY;
float $refresh_rz = Angler_1_Control.rotateZ;
float $refresh_rx = Head_Control.rotateX;
float $refresh_ry = Head_Control.rotateY;
float $refresh_rz = Head_Control.rotateZ;
float $refresh_rx = Neck_Control.rotateX;
float $refresh_ry = Neck_Control.rotateY;
float $refresh_rz = Neck_Control.rotateZ;
float $refresh_rx = Upper_Torso_Control.rotateX;
float $refresh_ry = Upper_Torso_Control.rotateY;
float $refresh_rz = Upper_Torso_Control.rotateZ;
float $refresh_rx = Spine_Rotation_Control.rotateX;
float $refresh_ry = Spine_Rotation_Control.rotateY;
float $refresh_rz = Spine_Rotation_Control.rotateZ;
float $refresh_tx = COM.translateX;
float $refresh_rx = COM.rotateX;
float $refresh_ty = COM.translateY;
float $refresh_ry = COM.rotateY;
float $refresh_tz = COM.translateZ;
float $refresh_rz = COM.rotateZ;
float $refresh_tx = Master_Movement_Control.translateX;
float $refresh_rx = Master_Rotation_Control.rotateX;
float $refresh_ty = Master_Movement_Control.translateY;
float $refresh_ry = Master_Rotation_Control.rotateY;
float $refresh_tz = Master_Movement_Control.translateZ;
float $refresh_rz = Master_Rotation_Control.rotateZ;
}else if (Angler_Attribute_Control.AutoOverlap == 0){
hairSystemShape2.currentTime = time;
}
Panda Rig
Finished this a while ago, but I wanted to give a screenshot of all the controls that went into this very intricate rig. I will probably post a short video about the attributes in the near future, but for now, gaze at the controls. This rig utilized a lot of scripting in order to achieve real time secondary motion similar to the video I posted here. I will post the script soon to show how long it was.
Panda character by Amanda Wallenhorst (http://amandawallenhorst.wordpress.com/)
Global Game Jam: Cell
A few weeks ago, I participated in an event called Global Game Jam. It is a competition where you join a team and create a game from scratch in 48 hours. After a severe lack of sleep on the part of myself and my team, we have completed the game with some fantastic results. So without further ado, I present to you all...Cell. Information about the team and the download link for the game can be found here.
Subscribe to:
Posts (Atom)
