May 202015
 

This is the last post of the semester long Houdini independent study project. But hey – it ain’t done! It ain’t done, it ain’t done. And I’m not done. There is way too much I want to do with this program. Many more projects will come.

For now, here are the last things I did.

This is what the bonfire looks like. I’ve varied the proportions, amount of deformity, twist, taper, and bend of the logs, as well as added more branches to flesh it out. The hope was to mask most of it with the fire effect on top, but that didn’t happen, and I’ll get to why later.

snow4

Underneath and around the fire I scattered a bunch of ashes. Made in a similar way to the big rocks.

snow5

I wanted to put a layer of snow on the flattest areas of the landscape using metaballs. It would be unrealistic for computation times to scatter thousands of metaballs all over the entire landscape, so I only picked one area, and used the super handy slope attribute calculated earlier to scatter points just on the flat planes.

snow1

Then copied metaballs onto those points. It looked pretty much like what I wanted from up here…

snow2

…but not from up close. This just won’t cut it. This is mostly a problem of my scene scale. I’ve made the terrain a lot smaller than it normally would be, thinking this would decrease computation times, but it made any effect difficult to bring to realism. Everything I tried adding looked slightly miniature: the metaballs, the particles, the fire, etc. – even when scaled down.

snow3

So I tried scaling the metaballs way down, increasing the number of scattered points way up, increasing the resolution of the resulting polygon mesh…

And then Houdini crashed several times, leading me to believe that I overdid it with the metaballs. So instead, I focused on just that focal area, and made some nicer-lookin snow around there.

snow6

And then added the shaders to everything. Shading is something I’m just beginning to get into inside Houdini, so these shaders are fairly basic for now. Here are the final renders.

snow10  snow12

I tried fiddling with fog: filling a volume with metaballs, making them render as fog, manipulating them with various noises to give pleasant variation and clumps.. and it worked to an extent. I also tried adding fire and smoke to the bonfire. It.. did not work.

And here’s my big mistake. Scale.

I haven’t figured out how to adjust the global scale of everything, haven’t found where/how to do that. As I mentioned earlier, my terrain is about 100x smaller than it should be. This, in turn, means that anything I add needs to be scaled way down – and effects such as fire and smoke just don’t work that way. You can’t scale down a fire effect and expect it to behave the exact same realistic way that it would when normally sized.

So that’s the result of my semester. Some successes, nothing great, nothing too pretty, but a lot of lessons. Here’s what I would do differently in the future:

1) Appropriate scope. This project was trying to achieve too much in too little time with too little knowledge. I already know what I want to do next – a bonfire. Just a medium shot of a nighttime bonfire. But I want to make it good, really really good. This environment was just.. too big. Too much.

2) Appropriate scale. Figure out the scale of the scene before starting.

3) Focus on what Houdini is best at. I personally really wanted to do procedural modeling and set dressing – and honestly, got a kick out of it! Loved it. But Houdini’s forte is effects, destruction, explosions, water, fire, realism. I should really learn that.

And that is that. I graduate in two days. And I have tons of things I want to do, this being just one of them.

May 052015
 

This week the trees are finally sprouting leaves and flowers in Rochester. I started learning about L-systems this week. Coincidence? Pre-planned? Coincidence. But appropriate.

These things, right here!

L-systems are recursion. Visual code, just like our very first Python project in Computer Science 1 class. They’re a rewriting system, consisting of an alphabet/vocabulary of symbols that make rule strings, and grow with each generation according to those rules. They can be very rigid and architectural, or organic and random. Very versatile; both design-y and artsy. But based on math, and created by a biologist/botanist. Often used to model organisms.. molecules.. fractals.. plants. Many other things. I got excited.

I’d say this here is a pretty darn good example of generations of a growing plant. Fairly random-lookin, fairly organic. If I can learn that, ‘twould be cool!

Why do I need L-systems all of a sudden? For the focal point of my piece – the bonfire. Branches, twigs. To start, I quickly mocked up some logs and arranged them in a bonfire:

lsys7

Now I need to make me some branches.

I’ll make this post into a handy reference for myself, for future endeavors involving L-systems. As I said, L-systems are created based on rules. There’s a base, then there are rules defining the iterations.

Example base:    X

Example rule:     X = ! /(3) T F[+X] ~F[-X] +X : 0.4

Unlike regular algebra, each symbol is read and interpreted left to right. This one would read as: the thickness decreases, as the limbs roll 3 degrees counterclockwise, and curve down due to gravity, do a step, twist randomly, do a step and another turn and step – and the probability of all this happening is 40%. The (not full) syntax broken down is:
F   —> full step
H   —> half step
  —> full step, no line drawn
h   —> half step, no line drawn
+, -   —>  turn right, left; recursion in 2 dimensions (flat)
&, ^   —> pitch up, down; adds rotation in the third dimension
\, /   —> roll clockwise, counterclockwise
[ ]   —> the start and end of a side branch; “push and pop” (because that makes more sense to me, in CS stack terms), allow for backtracking (node rewriting)
T   —> tropism (curvature) – adding a curve to the branches. The definition of tropism is: “the turning of all or part of an organism in a particular direction in response to an external stimulus.” And that makes sense because, you know, L-systems can be used to describe molecules and other biological things.
”   —> multiplier of curvature
!   —> multiplier of thickness
;   —> multiplier of angle
~   —> turn a random degree

Here’s a much more thorough list of commands: http://www.selcukergen.net/ncca_lsystems_research/houdini.html. And and even longer but thorougher explanation, straight from the SideFX website: http://www.sidefx.com/docs/houdini10.0/nodes/sop/lsystem.

So let’s do something. There are two methods of creating L-systems: 1) edge rewriting – replacing edges with the recursion, and 2) node rewriting – appending recursion to the last node.

lsys1

This Koch star, which started as a triangle, is an example of edge rewriting, as the edges get more complex with each generation. Fun fact: adding a Revolve node to the resulting curve is fun. Or, you know, not stopping with the L-system and actually creating something interesting using it as a stepping stone. (Which is how it should be done.)

lsys2

And this is a simple example of node rewriting, where the structure actually “grows” with each generation. Very simple rule up there – each time you see a full step, replace it with: a full step, a branch turned right, another full step, a branch turned left, and a third full step.

lsys3

This example introduces variables – symbols outside of L-system vocabulary that are defined by the artist in the rules. These variables are just another “full step,” but you get to make whatever you want of it. Easy, right? Easy..

But then you add the ! for thickness, to get the branch to thin out on top, and the T for some sagging of the side branches, and for curvature, and ~ for twisting, and add values in parentheses like (15) to specify the angle/value of turning/manipulation, and get it more and more and more complex and cool!

lsys4

So I was already happy with my branch at this point: it had quite a lot of variation and twist to it, looked fairly organic overall! And it doesn’t even include any probability rules!

Probability rules?

If you add ‘:number‘ to the end of a rule (like this: X = ! // FF [-X] F [+X] F : 0.8), that number becomes the % of the time that rule gets executed. Randomness!

And there are, of course, conditionals – if statements. F: t>number = rule means execute the rule if the generations are greater than the number specified. Very very cool for structures that age.

  —> or
  —> and
Example: F: (t<3) | (t>6) = rule

But that’s not all. The L-system node in Houdini has four inputs up top, labeled by letters of the alphabet. They’re there for copying geometry onto the ends of branches! Hello, fruits, leaves, atoms, or whatever else your heart desires on the ends of those branches. I quickly threw some randomized berries on my tree, just by taking a sphere, mountain-SOPing it, scattering points on the deformed thing, and copying a little-er sphere onto each scattered point. And plugging that into the J input of the L-system:

lsys5

Neat. I like it!

The possibilities here, oh man. It would probably help me, being a visual person, to draw the shape of the tree/system/object I want, then figure out how to make that pattern, what building blocks go into it – and then translate that “pseudo code” into L-system rules.

But this was enough for me to make the branches for the bonfire. Here’s what I ended up with. It’s not final, but I’m happy with the direction it’s going:

lsys8

Next up: the fire and the smoke.

May 032015
 


I like making the seal joke. “If I’m a seal in college, what’s my major? – Art art art art art!” And I clap like a seal, making that “ar ar ar” sound that seals make.

I thought it was dang clever.

But anyway, art!

Among my other projects this semester, I am taking a Drawing for Animation class and a Watercolor class. (I had to drop the Figure Sculpture class, for shame, because I just had too much on my plate.) Here’s a little glimpse on what I’ve been working on. These are not my very first attempts at watercolor, but it’s safe to say my first time learning it:

3paintings_small

I got very excited when my professor, Luvon Sheppard, showed me the little simple way of mixing Prussian blue and Alizarin crimson for a gray underpainting. That coffee shop portrait was my first experiment with that technique. Such simple things. But they get me excited. Here’s a work in progress using that method, too:

OLYMPUS DIGITAL CAMERA

Three weeks till graduation. I just want to paint all the time.

Apr 162015
 

I started (finally) looking for jobs. Came across qualifications for an effects artist (mind you, I am not ready to apply to those, and won’t for some time) – and found more motivation to be learning Houdini. When The Mill representatives gave their presentation at RIT several weeks back, so many of their process shots included the Houdini interface. Two days ago, Paul Hildebrandt from Disney gave a talk on their technical pipeline and tools – and hey, guess what, there it is. I was excited to hear that Disney effects artists write calculus equations all over their whiteboards. On the other hand, it was encouraging to hear that yet other artists draw their effects out on paper before they go into 3D space. There’s hope!

This week I explored particles in Houdini and played around with the different POP forces. Made this!

Figured out how to have one force (curve force) affect the particles up to a point, and then when they reach a certain age to be affected by a different force (combination of axis and attract forces). Added color and opacity, and tried to figure out how to render the whole thing. Alright, the preset “dust puff” shader looks okay.. but let’s try to tweak it! I opened up its network and saw this:

particles02

And decided to save that exploration for another day.

However, I feel a lot more confident with particles in Houdini now. With that, back to rocks. Hey, I made those work:

rocks01

I took a slightly different approach. Before scattering points on the geometry, I grouped the areas of the landscape by which way their normals were facing – and copied rocks just into those parts. Now, I was battling with the elevation attribute. I would like to spread more rocks in lower elevations, and less up high, but I just could not figure out how to reverse the elev attribute (right now it puts more rocks in higher elevations). For now! I’ll figure it out eventually.

rocks02

Additionally, I decided to revamp the up close texture of the foreground. Before it just had a mountain SOP on it, which did the job, sure, but I wanted to see if I could apply what I learned from sculpting the individual rocks to the big landscape. Attribute VOPs are not so scary anymore. I took a bounding box to isolate an area of the foreground (because not all of it needs to be super detailed all the time, and I can move the bounding box with the camera if I have to), and did this:

rocks03

There is a slight, medium-scale Worley noise (I wish it was sharper), a vein pattern (which should also be sharper), and a small-scale turbulent noise for smaller detail.

Also, there’s snow:

rocks04

Just need to figure out how to render the snow… Tried applying some shaders to particles, came up with some interesting but not great results, will keep experimenting.

One last thing about the rocks: I did get the attribute VOP working! Grouping by normals is a working solution, but not the most elegant one. Here, I multiplied the height of the landscape by the curvature attribute, getting this map:

rocks05

Just.. have to… get the color attribute… to control the density of the rocks.

I lied, here’s the last thing about rocks. Well, it’s about shading the whole piece. I used the groups I got from the geometry’s normals to drive shaders (a very basic placeholder stone shader for both the ground and the snow). Sure, it worked, but…

rocks06

… but grouping by normals gives me very unnatural jagged polygon edges. Ideally, I’d use that black-and-white map from above to control where the snow goes… but once again, that will take me just a little bit longer to figure out. This closeup definitely shows that the “grouping by normals” method for shader assignment definitely does not work:

rocks07

Looks kind of nice as an extreme wide shot, though.. with the sphere-y snow.

rocks08

Apr 062015
 

I spent my spring break in Utah this year. Came back last week. It was warm and beautiful, and a wonderful chance to get away and clear my head. However, everything there seemed to have been generated in Houdini:

utah

So I was, of course, inspired. Would take me years to produce results that look anything remotely like these landscapes, but we’ll get there eventually.

All the locations we went to (Slot Canyon, Arches, Bryce, Zion) looked so different! Different rock formations, different textures. Very cool Stuff. I was taking mental notes on what different rocks look like out there in the real world.

When I tried looking for a tutorial on rock generation in Houdini, I came up with nothing. The only resource I was able to find was an example file from a user on a forum (http://forums.odforce.net/topic/10798-procedural-stonesrocks/), which I proceeded to dissect to figure out what they did.

Let me explain what I did first, though.

rockgen0

I went with what I knew: scattered boxes copied onto the terrain mesh and displaced with a mountain SOP. The spread of good, size variation was nice, but the geometry did not look like rocks. This would work well enough for the midground and background, but for the foreground I would need a much better solution.

rockgen0b

So instead, I found that example file and dove into it. Looks effective, but upon close inspection, not that difficult. Box, mountain SOP to shape it, subdivisions, then an attribute VOP with parameters changeable by the artist to displace the rock. Inside the VOP, a network of three different noises added on top of one another for a layered effect: Worley noise gives the rock its shape, turbulent noise adds texture, and veins (an option from the “patterns” menu) give the rock some cracks. Makes perfect sense!

rockgen1

The parameters outside the VOP, which allow the artist to change the look of the rock, include the offset of the Worley noise, Worley scale, the amplitude of the additional (turbulent) noise, depth of cracks, and the spread/amplitude of the crack pattern.

So I started making my own!

I wanted to try a different noise pattern for the overall shape of the rock, but none worked quite as well as Worley did. After doing some research, I even came across an article that said that Worley noise is best for stone and water textures. I kept it in.

rockgen3

I also tried different kinds of noise for the secondary texture and other patters (crackle, oscillations, ripples, etc.) for cracks, but… did not find a more pleasant combination than the one in the example, yet! Although I believe if I spend more time and figure out how to make the ripples work, they might look nicer and more natural than the default “veins.”

When the rock was done, I tried plugging it into my prior setup, and realized that this technique won’t work anymore:

rockgen4

The solution for that is adding variables to the copy SOP and using a transform node to randomly rotate and scale the rocks. Later I’ll take this one step further and randomize the rocks’ noise displacement offset, amplitude, and crack values.

rockgen5

Looks better! Now I just need to figure out how to arrange the rocks according to the curvature of the land, and not just randomly everywhere. I found a measure SOP that measures curvature, but that alone did not do the trick. It began to clump the rocks in certain areas, but did not give me any control over the precision of the placement:

rockgen6

I could, I guess, just take these rocks, separate them into separate volumes/meshes, and simulate them falling…

But let’s try this first. After the measure SOP, I added several attribute VOPs and inside each one calculated the slope of the landmass and used the color channel to represent the slope/curvature values. This method allowed to determine the peaks, the valleys, the steepest slopes, and the flattest areas. In theory, all I need to do now is take this color information and apply it to the scatter SOP so that the big boulders would only be placed in certain areas, the trees in others, grass and small pebbles elsewhere…

rockgen7

And this is the missing link that I haven’t figured out yet. How to take that color channel and make it affect the scattering of the rocks.

Also, once I figure this out, the same color information would be very useful in assigning shaders – the snow shader will go on the flat areas, and the stone shader will do to the steeper slopes. Speaking of which – I have found zero tutorials on either snow or stone shaders.

But hopefully I can figure something out myself. The general idea for all this is sensible: layered noise. Unfortunately, it takes me hours to figure all of this out.

To be continued!

Mar 172015
 
Good news! I tried breaking a shader and it worked. I should stick to tutorials for the time being.
But yes. I tried out Houdini’s shading this week. I like it. It’s pretty. But it’s also really dang complicated! Which, of course, makes it insanely powerful and infinitely customizable. But also very very easy to break for little me.
First of all – Houdini’s IPR rendering is fast. And I can drag and drop materials onto objects straight in the render view instead of going back and forth between multiple windows! Mind blown, just a little. Shaders are constructed out of nodes (of course) inside VOP networks. On the surface – simple. Looks similar to the Hypershade. There’s your diffuse, there are the U and V coordinates, there’s SSS, all in the Surface Model node. Unlike the Hypershade, you have access to everything, every parameter, even the hidden ones. You can organize them as you see fit and save shaders as modular and modifiable digital assets.
So, naturally, with all this freedom and control, the first thing I did was break a shader and crash the program.
There are three main shader options in Houdini:
1) Mantra Surface Shader – big “uber shader”, very customizable, can and should be used without altering the VOP network. Similar to the MIA Material – just go in and change slider values. The nodes on the top level of the Mantra Surface Shader VOP are digital assets, so there are even deeper levels. Here is just its topmost level:
shading_tut_01
2) Surface Model – a “bare bones” shader, as Side Effects describes it. Fast, a good start for building your own shaders. Specular, diffuse, and other basics are already there (those promoted parameters in the Surface Model node), but any complexity needs to be wired in. Similar to a Blinn, I think!
shading_tut_02
3) Material Shader Builder – where everything has to be connected from scratch. This one starts out as a flat, constant color, like Maya’s Surface Shader – no surface model node inside its default VOP. Got to do everything yourself, kiddo.
shading_tut_03
Houdini also has some handy presets all ready for playing around with – glass, chrome, wood, stone. Stone! That’s relevant to what I’m doing. Let’s look at the VOP network, because I can, and see how it’s made:
shading_tut_04
From what I understand, this shader has several layers of color and noise. Take some turbulent noise, with “splatter” (more noise) on top, multiplied with two color nodes, add spec, add emission, add opacity, add displacement, put all of that into the Surface Model node. Most of the available parameters are promoted so the artist can tweak them. One of the noise parameters is responsible for dirt; the two color nodes are stone color and pepper (detail) color, there are tabs for reflections, emission, opacity:
shading_tut_05
If I wanted to add more layers to the shader – say, marble-like veins, or a different mineral deposit inside the rock – I could probably wire in more noise, turbulence, splatter nodes (different types of noise nodes) and intermix them with the existing ones.

Thankfully, hovering over just about anything in the VOP network tells you what it is, what it takes as an input, or what it produces for an output.

 

So a question that has been bugging me is: just how many different kinds of noise does Houdini have, and what are they all best used for?

Here’s an example of 3D noise being used for color, texture, and displacement:

shading_tut_07
I kept thinking, “Autodesk has a wonderful documentation – a command reference. Houdini has… lots of nodes.” But eventually I found this: Houdini Nodes Quick Reference – an 87-page manual on nodes! The best part is that it’s not searchable at all. (Sarcasm.) But I am actually thankful that I found it, and should make some light bedtime reading out of it.
But I digress. Noise! There are many noise nodes accessible just from inside a VOP network. I hope that over time I’ll know which one to use for which purpose. Some noise is only 2D, some can be 2D or 3D, some has more customization abilities, some – less.
noises
Voronoi and cell seem to be very similar, but cell noise has borders. Worley noise (not pictured) seemed to be just like voronoi. Unified noise, also not pictured, seems to be a combination of flow, periodic, worley, and several others. Like Pyro noise, it has lots of parameters and customization options. Turbulent, bump, and anti-alias are all very similar looking, but some (bump) are just 2D and others (AA) are 3D. High-low noise has the most distinct look to it, of just scattered specs.
Hopefully in time I’ll know what each does best.
Mar 102015
 

Yesterday and today, the temperature in Rochester is in the high 30s (almost 40!), and we all went nuts and brought out the shorts and dresses. It’s the little things in life.

Meanwhile, I began working on my project’s composition:

landscape_process01

And I don’t like it!!

Let me clarify: I love the process and enjoy it immensely. I like trying to figure things out, try this node, that node, this technique I remember, etc. No – so far I don’t like the result. But I’ll keep working on that.

Big thing I realized: the nature of my process makes achieving my goal a bit tricky.

For each layer, I start with a 2D map – be that a topo map, a noise map, or anything else. Then, by assigning height attributes to the maps, I create the 3D landscape. THEN I see the resulting composition – not when I’m creating the 2D map. And when I see the result, it is not exactly what I want. So in this scenario, I must go back and forth to try to get the values to do what I want them to do.

Not the most efficient process.

I could sculpt on top, and I WILL sculpt on top, later, for details – but the goal here is to stay as procedural as I can. So I will be looking for more ways to create my landscape.

Later! For now, I’d like to catch up to speed with the rest of what Houdini has to offer: shading, particles, and lighting.

 

But in the meantime, let me explain what I did for the landscape so far.

For the mountains way in the background, I used the noise generation technique with some sculpting on top. For now, kept it low res. The forms are organic enough, and have the right amount of detail for the distance. All I do is tweak some settings and see if I like the result.

landscape_process02

For middle ground mountains, the focus mountains, I used a height map. I want as much control as I can get for them, so a height map works well. This is a good base for a detail sculpt on top later. However, I’m not quite happy with the composition of these two mountains quite yet, so I’ll fix that before I sculpt.

landscape_process03

landscape_process04

That node tree is fun.

For the foreground land, I also used a height map, but a much simpler one. Just as a base. I then converted the foreground to a volume for adding details on top later: arches, towers, cliffs, rocks. And, of course, sculpting on top.

landscape_process05

landscape_process06

And this is me cheating the 3D space:

landscape_process07

All this dense geometry – and no lag. Absolutely no lag. I am really enjoying being able to tumble around in 3D space without any lag or fear of crashing.