Dragon Automata
Procedural Animation in Houdini
My inspiration comes from RadugaGrad’s Youtube Video which shows his process of making an automata dragon, and I decided to make one in Houdini.
* See the process and technical guide below.
Technical Guide
Sampling:
Min ray samples: 12
Max ray samples: 16
Samples: 4
Diffuse Quality: 1
Diffuse Limit: 1
Global Quality: 1
Noise Value: 0.01
Rendering Statistics:
Renderer: mantra BPR
Average render time: 8.6 min/frame
Image Resolution: 1280 x 720
Number of Lights: 1 sunlight and 1 environment light
Geometry Complexity: 18067 prims, 25558 points
I draw my blueprints for each part of the automata separately, filling the shape with white color and make the background black. Then I will import my blueprints for each part into trace nodes. Then use resample nodes to reduce the number of points.
I build the mainframe of the dragon automata first. I use simple tubes and spheres to build the film. I mainly use Sin($F) and Cos($F) to animate the parts. I use the function “point("../obj",n1,"P",n2)” to get the (x,y,z) location of a certain point.
Then I reference each piece of the automata to the location of their joint. Before I move each piece to the joint’s location, I have to transform it to make sure the origin is where the joint will be at.
Then I was having trouble animating each part properly. To solve the problem, I have to make sure each part is driven by the motion of the tube of the frame. The goal is to get the angle A, which represents how much the tube rotates compared to its joint. Here we can see the joint is the origin (x0, y0), the length D of the tube is already known, the tip point location of the rod is (x1, y1) which can be known by using function “point("../obj",n1,"P",n2)”. Then use the format angleA = arccos(cosA) = arccos((x1-x0)/D) to calculate angle A. The if loop here I just used to make sure the returned angle can bring its “-” when y1<y0, which will reflect the correct rotation of the tube.
To make a chain of gears, I rotate the first one, then use the formular: ch("../rotateGreenGear/rz") * (number of former gear teeth) / (number of current gear teeth) to rotate the next gear.