SYDNEY MARIE SMITH

View Original

Dr. Strange VFX Recreation: Refining and Magic

I was really saved this week by the demo and prep work that I did for my previous work in progress--making up for lost time wasn’t too terrible in the end! This week was all about implementing the magic stream based on the demo I created with the help of some YouTube tutorials, as well as some new insights from my supervising professor Nelson during our meeting last week. I was also able to do some more development to refine my cobblestones as well as start to figure out how to make them move like they do in the reference shot, though I do still have a bit to go in fully figuring that out.

So, starting with the small stuff, I finally gave real textures to the cobblestones as well as the walls in my shot instead of just using a solid color shader with some roughness. Nelson recommended I try utilizing triplanar texturing for these elements, which ended up working like a charm to give that realistic texture while not having every stone and wall look exactly the same. Although I haven’t delved very much into the world of Houdini texturing beyond the basics, triplanar texturing proved to be quite easy since there’s quite literally a triplanar texture node in the USD material library to utilize. Definitely an easy way to level up the look of the elements in your shot!

After fine-tuning the materials to my liking and adjusting the lighting a bit to compensate for the new textures, it was time to start on the more complicated elements. Up first was the magic stream, which if you saw my blog last week, you’d know that I created a rough demo for it utilizing a couple tutorials and resources I had gathered. To my surprise, I was given the go ahead to use that method to create the actual first pass of the magic stream, which greatly helped me save some time in working on it this week.

The setup I have at the moment isn’t too complicated, it mostly relies on Houdini’s find shortest paths node. I first created the base geometry for the surface the magic stream will run across by subtracting my cobblestones from a simple grid geometry using the boolean node. This provided the paths I was looking for the magic stream to go through in order to snake through the gaps between each stone. From there, I created 2 groups: one “start” group of a collection of end points where I wanted the magic stream to originate from, and another “end” group of points from the other side of the grid where I wanted the stream to travel to. From there, I also added an attribute noise and created a new attribute called “point_cost” that, for the moment, I just lowered the element size to something relatively small and changed the mode to zero-centered (this will be relevant later, I promise).

Then, I finally added the find shortest paths node, plugging in my “start” and “end” groups to the corresponding fields. This gave me the essence of what I was looking for in creating these branching lines that travel from the back of the grid to the front. I experimented with pretty much all of the different modes the find shortest paths node had to offer, but I ended up settling on setting it to “each start to each end”, since otherwise there weren’t enough individually traveling lines for my liking.

To add some variation to the paths of the lines, I activated the path cost option within the find shortest paths node and referenced the “path_cost” attribute I created in the noise node I created previously. The noise essentially adds more variation to the “cost” associated with each point on the grid and how expensive it would be for the line to travel to it. The find shortest paths node always wants to find the points with the lowest cost to reach the end points, so this just helps to vary the paths it creates and have a bit more control over how those paths look.

After that, it was time for some fun attribute vops that essentially provided the same function as the carve node, allowing the lines created to be animated to grow and spread across the grid. The advantage to the vops as opposed to just keyframing the carve node is the increased amount of control you have to direct the timing of the stream growth, the size of the streams, and even adding some variation to which parts of the path grow when. I definitely cannot take full credit for these vops myself since I am very much still learning VEX and coding in general, the tutorial created by Far Out Studio was incredibly helpful in giving me the base tools I needed to figure out how to replicate the magic stream from my reference shot.

The final part of the magic stream was giving it an actual geometry that I could later add an emissive texture to. I experimented with copying a sphere to the points on the base lines, but I ended up liking the look of a polywire the most in the end.

My third and most intimidating task for the week was once again trying to tackle the movement of the cobblestones, this time with a bit more insight from Nelson along with some helpful classmates. We decided that a productive method to try out to move the stones was essentially creating a curve for each cobblestone to utilize as a path, building it essentially like a lightning curve to allow it to have that arcing shape as it travels from one point to another. Thinking of it like a lightning curve is what really helped things click in my head, since it’s something I have experience in doing and know how to create, so the task felt a lot more doable after I broke it down utilizing something I’m familiar with.

To get the points for each end, I essentially just separated out two sections of cobblestones that would be the sections of stones moving to the right and the stones moving to the left and gave them each their own group. I then transformed each group in its respective direction and then merged both versions of the points back together, using an attribute wrangle to set the id value to equal the ptnum value, which finally allowed me to use the add node to connect the two points based on their id values.

I then utilized the vector attribute “up” applied to the curveu of the lines created between the two points to create a simple attribute vop that would help me add some arcs to the lines. I also added an attribute noise to the “up” attribute to ensure that all the lines weren’t exactly the same in the way they looked. Finally, I used an orient along curve node along with a carve node to set up the points to guide a single cobblestone along each one, making sure that the cobblestones would be oriented properly and keyframing the movement across 2 seconds. The last thing I had to do was copy the cobblestones to the points moving along the curves, rinse and repeat for the second group on the other side, and I finally had some moving cobblestones!

While it’s certainly nothing impressive, I think my WIP for this week is quite promising, so I’m excited to see how I can refine and improve my setup to make the overall movement more interesting and get that ripple effect down. Unfortunately for me, despite my progress something always does have to go a bit wrong last minute, so despite everything else going relatively well, my renders did not come out looking the way they should. So, my WIP for this week ended up having to be a flipbook for now at least, since I didn’t want the render issues to take away from the progress I made this week.