I’m excited to announce that I have just released a new course, aimed at introducing Compositors to GitHub!

If you are unfamiliar, Git is a powerful version control system, which supports the backbone of most modern VFX pipelines. Compositors like you are starting to embrace GitHub for finding and developing gizmos & python scripts, as well as version-controlling their .nuke directories.

Gone are the days where your Nuke preferences, toolsets, and menu.py have to be re-built at every new studio. Click here to get ahead of the curve, and introduce GitHub to your workflow today!

Compositing CG renders into a plate with a rack focus can sometimes be tricky to get right. However, your defocus has to match perfectly, otherwise the illusion falls apart! Manually creating keyframes and adjusting curve slopes can be a bit cumbersome, so I thought there had to be a better way to approach this. In this tutorial, I will share what I came up with!

We can learn a lot about what our CG needs by taking cues from our plate, and matching defocus is no exception. We can look at the size of our plate’s bokeh shapes, or how soft high-contrast edges are for reference. Animating a rack focus is a natural extension of this!

Continue Reading "Automatically matching a plate’s rack focus."

Jedediah Smith has been burning it at both ends in VFX for 10 years. He’s worked as a Compositor, a VFX Supervisor and many roles in between. Self-taught since his origins in the wilderness of Alaska, he has a massive fascination for the intersection of art and technology. Playing with code, fiddling with cameras, building nodes to create pretty pictures… That’s the best quality time.

Continue Reading "INTERVIEW: Jedediah Smith"

Nuke’s merge node has 30 operations, and finding a Compositor who has utilized them all would be a difficult task. However, I want to shed some light on two merge operations that are incredibly useful, and don’t get as much love as they should.

The most common operation, Over, is pretty self-explanatory: The image in the A pipe goes over the top of the B pipe. So how and why would this concept need to be expanded upon?

When working with CG renders that have baked-in holdouts, or if you’re creating and precomping your own holdouts using Deeps, you might find that you get dark edges when merging everything back together. This is where disjoint-over can help! Let’s take a look at a quick example to demonstrate:

Continue Reading "Disjoint-over and Conjoint-over, explained."

Nuke scripts often start out as well-intentioned, clutterless masterpieces that even Marie Kondo would be proud of. However, endless revisions and client notes in the heat of a deadline often cause tidy Nuke scripts to unravel into unintelligible, slow messes.

Compositors often lean into pre-comping to help wrangle these large, lethargic beasts, so Nuke will run at an interactive speed again. This article will cover best practices when pre-comping, to ensure you maintain optimal speed with your image processing.

Continue Reading "Back to Basics: Pre-comp more efficiently."

The beginning of my Compositing career started with After Effects, and while I’m now living and breathing Nuke, there’s one thing I still miss — the ease of use of After Effects’ animation tools.

Coupled with a recent fascination with bezier curves, I decided to set out and see if I could bring the most basic functionality from After Effects, “easy ease”, into Nuke, with a way to control the smoothness of that curve.

To start out, I wanted to explore what was already possible. Selecting a keyframe and hitting “h” on your keyboard changes the keyframe type to “horizontal”. If you do that on the first and/or last keyframe of a curve, you get a smooth ramp in/out. However, if it’s not easing enough, grabbing one of the handles and trying to adjust the curve quickly results in frustration.

Continue Reading "Programmatically editing animation curves in Nuke."

Congratulations to Andriy Koval for winning the NukeX license giveaway! As a bonus for being a Patreon supporter, I wanted to show you the thought process & Python script I wrote to help me choose a winner.

To start, I was able to download a CSV report for newsletter subscribers who entered the giveaway, as well as another CSV report for current Patreon supporters. I then needed to find an easy way to get all the email addresses from both CSV’s into a Python-friendly list. I’d never had to use Python to navigate a CSV file before, so it was a fun learning experience!

As you know, subscribers of Ben’s Comp Newsletter could enter this draw simply by clicking the sign-up link in Issue 064, and since you’re a Patreon Supporter, you got two entries! However, there was no guarantee that all Patreon supporters would click the link in the newsletter for that second entry, so I also wanted to code up a solution to account for that.

Lastly, this draw had to be completely random. Rather than closing my eyes, scrolling through a list, and putting my finger on the screen to make my selection, I wanted the computer to choose for me to remove any human bias.

Check out the final code below, commented for clarity.

# Import the modules we need.
import csv
import random

# Create lists to hold email addresses.
newsletter = []
patreon = []

# Define filepaths for the CSV's on disk.
newsletter_csv_file = open("C:\\Users\\benmc\\Desktop\\newsletter.csv", "r")
patreon_csv_file = open("C:\\Users\\benmc\\Desktop\\patreon.csv", "r")

# Open the newsletter CSV, and add all the addresses from the "email address" column (column A).
for emails in csv.reader(newsletter_csv_file, delimiter=','):
	newsletter.append(emails[0])
# The first item in the row is the header, "email address", so we can remove it.
newsletter.pop(0)

# Same deal for the Patreon members CSV, except the email addresses are in column B in this instance.
for emails in csv.reader(patreon_csv_file, delimiter=','):
	patreon.append(emails[1])
patreon.pop(0)


# List to hold all email addresses.
email_list = []

# Remove Patreon subscribers from newsletter list.
print(str(len(set(patreon).intersection(newsletter)))+" Patreons were duplicates, and have been removed.")
for email in set(patreon).intersection(newsletter):
	newsletter.remove(email)

# Add Newsletter subscribers to the email list.
email_list.extend(newsletter)

# Add patreon subscribers into the same list, twice.
email_list.extend(patreon)
email_list.extend(patreon)


# Randomly pick a winner.
print("\nThe winner of the NukeX license is: "+str(random.choice(email_list))+"!")


"""
-----  RESULT  -----

24 Patreons were duplicates, and have been removed.

The winner of the NukeX license is: <email address hidden for privacy>
"""