# Automobile Rigging

by JaschaW posted 652 days ago | 2 comments

Hey all,

I'm curious to find out different methods that are used for automobile rigging, particularly auto-rotating wheels.

When rigging a car, a "nifty" feature to add is when you translate the master controller, the wheels "auto-rotate". Now after working out what the radius of the wheels are and how many units does the controller have to translate to get one full rotation the problem comes in, when you start rotating the master controller the wheels start flipping weirdly. A method that counters that is explained in this video: https://www.youtube.com/watch?v=QpDc93br3dM basically using vectors for the wheels to aim at. This method works really well, but I am curious to know if a similar result can be achieved without the use of expressions?

posted 539 days ago

Hi guys, I'm also very interested in a full nodal setup for auto rotating wheels. Strange this post is 113days old and not much interest in it.

Anyway, I tried to replicate step-by-step the expression mentioned in the video with a nodal setup, but I don't quite understand what's happening at some point.

[here's the node setup] (https://www.dropbox.com/s/qge43oouhrrhows/node_wheel_exp.jpg)

float \$radius = 25; //it will be a distance measuring wheel radius (or diameter) using the distance tool node, so the rig can be scaled

vector \$moveVectorOld = `xform -q -ws -t "rightWheelOld"`; vector \$moveVector = `xform -q -ws -t "R_Wheel"`; vector \$dirVector = `xform -q -ws -t "rightWheelDir"`; //this are the main vectors we can find using worldspace matrix and plug it into a decompose matrix node

vector \$wheelVector = (\$dirVector - \$moveVector); vector \$motionVector = (\$moveVector - \$moveVectorOld); //this is a simple subtraction between vectors, it can be done with the plusMinusAverage node using output 3D of the vector into input 3D of the pMA node //the result will be the two new vectors, each one from the output 3D of each pMA node

float \$distance = mag(\$motionVector); //this is the magnitude (or the length) of the \$motionVector found before, we can find it using the distanceBetween node of the same two vectors we used before to find the \$motionVector. The output will be a 2D distance.

\$dot = dotProduct(\$motionVector, \$wheelVector, 1); //this is the dot product normalized of the two vectors, which can be done with the vectorProduct node with 'dot product' as operation, and 'normalize output' check on. The output will be a xyz type of data, but only one value is needed since are all the same.

R_Wheel.rotateZ = R_Wheel.rotateZ + 360 / (6.283\$radius) * (\$dot\$distance) * (Root_CTRL.rightWheelAuto); //this can be done using math with some multiplyDivide nodes, but what about the operation output to the .rotateZ connection? doesn't it create a cycle?

xform -t (\$moveVector.x) (\$moveVector.y) (\$moveVector.z) rightWheelOld; //what this does exactly? Does it take the \$moveVector xyz and replace the translate values of the rightWheelOld group with them? Or it is an operation?

if (frame==0) { R_Wheel.rotateZ = 0; } //This can be done with a condition node, but what's the equivalent of frame keyword in nodes? Also, what's the connection with the part before?

I guess that's all, thanks guys!

posted 650 days ago

I'm currently rigging a vehicle and by no means an expert rigger but FWIW, I use SDK (Trans Z of master ctrl & wheel rot) and then and extend the anim curve - Never had any flipping at all