• Timelapse #05

    Photos taken at Machu Picchu in Peru. Edited the photos in Adobe Camera Raw in Photoshop

  • San Francisco Ferry Building #03

    Here's an updated render after updating more models, materials, and lighting. Built in Maya 2018 and rendered with Arnold.

  • Creating L3-37 // Solo: A Star Wars Story

    A look at some of my lighting for L3-37 in Solo: A Star Wars Story.

  • Southwestern United States Photos

    A selection of photos from Valley of Fire State Park, Antelope Canyon, and Bryce Canyon National Park

  • Solo: A Star Wars Story

    A collection of trailers and featurettes for an upcoming movie I'm working on.

  • R&L Update #04

    With Maya 2018 and Arnold, Autodesk included the new Light Editor interface. Which largely resembles and replaces the functionality I had built into the R&L tools. Therefore, there will be no further updates to R&L.

  • Timelapse #04

    Photos taken from the side of the road in Big Sur. Edited the photos in Adobe Camera Raw in Photoshop

  • Simple Ambient Occlusion and Wireframe Render in Maya 2018

    Here is an updated guide on rendering an ambient occlusion render in Maya 2018 with Render Layers and Arnold. Using the Render Setup manager in Maya 2018, you can create separate render layers for your beauty lighting, ambient occlusion, and wireframe renders and switch between them easily and non-destructively.

  • Creating Shading Networks with UserData in Arnold for Maya

    I recently wanted to create a floor that consisted of multiple concrete blocks. To breakup the look, I wanted each concrete block to be a slightly different color. Instead of creating and assigning separate materials to each block, I added a brightness multiplier attribute to each mesh, and used a shading network to read that value.

  • San Francisco Ferry Building #02

    Here's an updated render after blocking out the initial lighting and materials. Built in Maya 2018 and rendered with Arnold.

  • Rendering with Maya 2018 in the Cloud

    I recently wanted to explore cloud based rendering and I was able to try two different systems, Deadline 10 and Zync. My requirements were:

    • I needed to render several 300-500 frame sequences
    • I didn't need to collaborate with any other users
    • I had the entire animation and scene built in Maya and setup to render with Arnold (render times ranged from 30 seconds to 15 minutes per frame on a moderately equipped Macbook Pro)
    • I did not have any other local computers or resources I wanted to utilize
    • I am working on a Mac laptop, so the software client needed to work with Mac OS

  • Star Wars Episode VIII: The Last Jedi

    A collection of trailers and featurettes for an upcoming movie I'm working on.

  • San Francisco Ferry Building #01

    I started building the San Francisco Ferry Building in 3D. Here's an initial render after blocking out the proportions and basic models. Built in Maya 2017 and rendered with Arnold.

  • Fog Around the Golden Gate Bridge

    Woke up and heard the fog horn, so I went for a hike in the Marin Headlands by the Golden Gate Bridge. These photos are taken from Slacker Hill. You can view more photos on my 500px page.

  • Fabric Commands for Django

    fabric is a command management framework that allows you to easily setup commands that can run on both your local and external servers. This allows you to automate routine tasks that need to be performed on your local development server or on multiple computers.

  • Adding an "Other" Field to a Django Dropdown

    I recently needed to add a form field that had a preset list of dropdown options. The last option was Other and when selected, a new text field would appear to so you could fill in an additional option.

  • Rogue One: A Star Wars Story Trailer

    A collection of trailers and featurettes for an upcoming movie I'm working on.

  • Timelapse #03

    Photos taken from Treasure Island looking towards San Francisco. Edited the photos in Adobe Camera Raw in Photoshop

  • Updated Website 2016

    Just updated my personal website to use Jekyll instead of Drupal. I chose Jekyll for its simplicity. I don't have to worry about patching for security updates or upgrading to the latest version because Jekyll outputs static HTML files. I also simplified the design and made the blog posts easier to read.

  • Timelapse #02

    Photos taken on a Canon 60D on Hawk Hill at sunrise looking over the Golden Gate Bridge. Edited the photos in Adobe Camera Raw in Photoshop

  • Timelapse #01

    ~1500 photos taken on a Canon 60D on the coast of California over the course of 3 hours. Edited the photos in Adobe Camera Raw in Photoshop

  • Sunrise in San Francisco

    Caught the sunrise over the Golden Gate Bridge this past weekend. It was perfect weather to capture the fog over the Golden Gate Bridge, San Francisco's skyline, and the Bay Bridge. You can view all the photos on my 500px page.

  • Volkswagen

    Worked on a new personal project over the past couple weeks. I tried to match a 3D model to a photography plate. I took a picture on the coast just north of San Francisco and added an old VW van to the road.

  • Recursively Find the Last Modified File in Python

    Here is a small Python script that will recursively search through directories to find the most recently modified file. This is helpful if you want to search through a directory that contains multiple subdirectories to see if anything has been recently changed. It accepts two optional command line arguments. -n will list the most recent n files. -d will perform the search starting in the specified directory. By default the script will return 1 filename and will begin searching in the directory that the command is launched from.

  • Viewing Models from Maya in WebGL with three.js

    Here is the most basic, stripped down Javascript and HTML to load and view a model exported from Maya with textures in three.js with WebGL. I use this example as a test script to check my models before loading them into other applications.

  • Responsive Videos with FitVid.js and Drupal 7

    FitVid.js allows you to embed videos from YouTube, Vimeo, and several other third party services on your responsive website and have them resize correctly along with the rest of your content. The technique makes use of JavaScript that scales your video to fit to 100% of the width of its container. Here's how to set it up in Drupal 7.

  • Be Notified of a New Comment in Drupal 7

    I previously posted on how to be notified of a new comment in Drupal 6, but there is a slight change you need to make to the settings if you want it to work in Drupal 7.

  • Importing and Running External Python Scripts in Maya 2011 Video

    Here's a video tutorial of how to source external Python scripts and add them to your shelf in Maya. In particular, in highlights how you might install my r&l lighting and rendering Python scripts found here: https://github.com/swirch/rl. This is a video version of the tutorial I previously posted.

  • Keep Copyright Date Current by Using PHP

    To avoid having to manually update the copyright date on your website consider using PHP's built in date function to print out the current year. By doing this, your site will automatically display the current year and you won't have to worry about updating your client's sites every new year.

  • Launching Maya from the Command Line

    Here's a short bash script that allows you to quickly launch Maya and load your most recent scene file. By using the command mayan and giving it the argument to the project directory you want to open, this script will look into the scene folder of that project and find the most recently saved scene file. It will then launch Maya and automatically open that scene file and set your project.

  • Passing Arguments to Functions in Maya with Python

    For my r&l series of Python scripts for rendering and lighting, I often wanted to pass extra arguments to functions when clicking a button or changing the value of a field. By importing the partial module from functools you can choose a function and pass extra arguments into it.

    You'll need to import the partial module as follows:

  • Traditional Art #02

    Here's a sculpture I made this summer in my spare time while working at Walt Disney Animation Studios. The sculpture has a metal wire and tinfoil base that is layered with Super Sculpey. After baking, I painted it with acrylic paint.

  • Terminal.app Aliases

    Here are some steps for creating aliases and a few example aliases I have found useful to add to Terminal.app in Mac OS X. You should try to add an alias for tasks that you find repeating often. This tutorial also briefly covers how to use the command line editor Vim.

  • SSH and SCP

    Here is a basic outline of how to securely copy files (SCP) via SSH to a remote computer from your local computer. This is a good and secure way to directly copy files from one computer to another without having to use email or FTP.

  • R&L for Maya and mental ray #03

    Here is an update to the r&l scripts I posted about earlier. The new update adds the light.py script for adding and editing lights in your scene. When launched it automatically lists all the lights in your scene in rows and allows you to edit individual light's attributes. You can add new lights by clicking the corresponding buttons in the top left of the interface. You can automatically add a basic light set-up that includes directional lights for setting up an interior lighting setup. You can organize all the lights in your scene by having them be grouped in a node called 'lights' at the top-level of your scene. And for spotlights, directional lights and area lights, you can orient them towards a specific object by selecting the object in Maya and then clicking on 'Point' for the specified light.

  • Customize Terminal.app Colors

    Here is a customization to the default command prompt in Mac OS X's Terminal.app. If you add this line

  • Adding Javascript to Drupal 7

    I recently wanted to add some jQuery javascript to my website and it's pretty easy to do once you get the correct syntax down.

    First, I added the javascript file to my theme directory and included it in my theme by adding the line:

  • R&L for Maya and mental ray #02

    Here is an update to the r&l scripts I posted about earlier. The new update finalized the Generate Batch Render Commands script. You can launch this script and choose various parameters from your scene and it will automatically generate the correct syntax to render via the command line. You can choose various settings in the fields and drop-downs, then press the 'Append Command' button to add the render command to the text area. You can change the values and press 'Append Command' again to generate multiple rendering jobs (for multiple render layers, resolutions or file formats for example). Then you can press 'Save Script' to save the file as a shell script to the data folder of your project directory.

  • Chameleon

    I recently finished a personal project that involved modeling and texturing a chameleon. Using photographic references, I modeled a panther chameleon in Autodesk Maya. I laid out the UVs in Maya and painted a texture using in Photoshop. I painted two versions of the texture map and then used Nuke to animate roto shapes that blended between the two maps. I rendered with mental ray and did final color correction in Nuke.

  • Traditional Art #01

    While I mostly work with 3D animation and web design, here are two of my most recent traditional art pieces. I painted the parrot with oil paints on canvas board from reference images. The streets of Paris image is an appropriation of Eugene Atget's Photographs of the Streets of Paris.

  • Demo Reel & Overture Updates

    I updated my Demo Reel and finished up my Overture project today. Check them out on Vimeo and look forward to some updates to r&l and some artwork from my time as an intern at Walt Disney Animation Studios.

  • R&L for Maya and mental ray #01

    Here are a set of Python scripts that I have been developing to automate common rendering and lighting tasks in mental ray for Maya. Eventually, they will allow you to set up ambient occlusion with one click, set up and adjust a depth pass, generate command line rendering syntax through a GUI, add/adjust lights, and provide a set of buttons to easily set up test renders.


    Download the scripts on GitHub. Learn how to add external Python scripts to your shelf here.

  • Maya Quick Tips #01

    Two Axis Move/Scale/Rotate by Control Clicking

    You can constrain the move, scale and rotate tools to only affect two axes, by holding the Ctrl (Mac) key and clicking and dragging the axis you don't want to move. So if you wanted to move an object along the XZ plane, and not have the object move up or down in the Y direction, you would hold Ctrl and click on the Y axis handle to move the object.

  • Improve Performance of Drupal Site by Serving Compressed Content

    I recently came across this article to find the correct way to modify my .htaccess file to compress the content of my website.

    You can use the free yslow Add-on for Firebug to check page speed, and determine ways to speed up the load time of your web pages. This article details how to 'Compress content'.

  • Social Geo Tagging

    I recently worked on a set of Python scripts that can generate information based on geotagged photographs. The scripts are designed to take a search term and download a sample set of geotagged photos from flickr, using the flickr API. Then these photos are parsed out into different clusters based on location, color, date taken and other meta-data. From these clustered sets a call to the Google Places API is made to attempt to identify landmarks based on the locations where many photos are taken.

  • Render Via Command Line in Maya 2012 for Mac

    For one of my more recent videos, I decided to render using the command line renderer. This allowed me to set up a batch render that rendered the same scene from different camera angles during different time ranges and allowed me to easily save the output images in separate folders. I could even set up a shell script to render multiple sets of images in one batch and I could even have the script send me an SMS text message or email when certain sets of jobs complete.

    Check out this blog post about automatically generating batch render commands, or head on over to GitHub to download my rendering and lighting Python scripts for Maya.

  • Cropping and Resizing Images from Camera in iOS and Objective-C

    I recently was working on an application for the iPhone and wanted to capture images using the built-in camera. I wanted to use something a little more advanced/customizable than the default ImagePicker, so I utilized the AVCaptureSession as detailed in this blog post from musicalgeometry.

  • MAMP and Multiple Drupal Installations

    For a long time I was developing websites using MAMP and creating separate installations of Drupal in sub directories of my htdocs folder to allow me to work on several different projects at a time. This works well except for one thing. The URLs of the different websites include the sub directory in their name (for example http://localhost/drupal). I had wanted to find a way to configure MAMP to allow me to map these sub directories to sub domains, but I found an easier/quicker way to accomplish the same goal.

  • Website Redesign 2012

    Over the past couple weeks I have completed a redesign of my website. I upgraded from Drupal 6 to Drupal 7 and in that process, I got rid of most of the custom theme tweaks I had in place and opted to use a theme framework (Omega) instead. I also used some of Drupal's core features and contributed modules to accomplish my design.

  • Render a Wireframe Ambient Occlusion Image in Maya 2012

    Similar to my previous post on creating a Ambient Occlusion renders from Maya 2012, this technique deals with creating a plain and simple ambient occlusion render in Maya 2012 (although the same technique works with Maya 2011 and Maya 2009). To render a Wireframe image to overlay on top of your Ambient Occlusion image, follow these steps.

    Or check out this updated post for adding Ambient Occlusion in Maya 2018 with Arnold.

  • Photos from Europe

    I recently spent six months traveling and studying in Europe and these are a few of my favorite photographs I took during my time there. These photos are from London, Amsterdam, Edinburgh, Paris, Madrid, Tenerife, Rome and Florence.

  • .htaccess, mod_rewrite and PHP include()

    When creating a website with only a handful of pages, a full-blown CMS (such as Drupal, Joomla! or Wordpress) can be more work to set up and maintain than is necessary. In this case, simple, static HTML makes more sense to use. Here are two tips to keep in mind while making static HTML websites.

  • .htaccess and 301 Redirects in Drupal

    After updating/upgrading your website it is often necessary to define some 301 redirects to make sure end users don't come across a broken link or a file not found error. While defining a 301 redirect in your .htaccess file or through the cPanel of your web host is not hard to do, it is easier just to download and enable the Path Redirect module. Drupal relies heavily on mod_rewrite and has a lot of rewriting rules defined so it is easy to get an infinite loop redirect when trying to edit the .htaccess file directly.

  • Updating Themes to Drupal 7

    I am in the process of upgrading my Drupal 6 theme into a fully functioning Drupal 7 theme and came across some issues that I wanted to document here as a reference to those in a similar situation. I followed my instructions here to create a local copy of my website and then I went through the typical upgrade procedure as outlined by the UPGRADE.txt file supplied by Drupal. There were a couple hiccups in the upgrade process, but a few simple Google searches led me to the answers to fully migrate my installation to Drupal 7.

  • Simple Ambient Occlusion Render in Maya 2012

    Similar to my previous post on creating a multi-pass render from Maya 2011, this technique deals with creating a plain and simple ambient occlusion render in Maya 2012 (although the same technique works with Maya 2011 and Maya 2009). This technique is different in that you will only render out the Ambient Occlusion image, rather than all the separate layers of the image.

    Check out this blog post about automatically adding and adjusting Ambient Occlusion, or head on over to GitHub to download my rendering and lighting Python scripts for Maya.

    Or check out a video tutorial about setting up a script to automatically add Ambient Occlusion.

    Or check out this updated post for adding Ambient Occlusion in Maya 2018 with Arnold.

  • Parsing XML Data to Lists in Python 3

    For one of my recent 3D animation projects, I wanted to take data that was exported out to an XML file and parse the nodes' values to lists. I found a really simple way to search for and store all values from an XML file using The ElementTree XML API. These few lines of code open and parse the given XML file, then iterate over all the children under the root node and search for the children named Time and Name and then append them to separate lists. These lists can then be iterated over to utilize the values that were taken from the XML.

  • Mac OS X Title Bar Icon Tips

    In document based applications, the Mac OS X Title Bar Icon is more functional than it appears. You can right click on the icon to view the directory structure the document is located in, which gives you quick access to its location in Finder. Or you can simply drag the icon to manipulate the file. You can drag it to your desktop (to make an alias), drag into an email (to add an attachment) or drag and drop it into a Terminal window (to add the full file name).

  • Ambient Occlusion and Render Passes in Maya 2011

    Here is a simple way to set up render passes to render out different channels of your 3D image for use in compositing and post processing. Maya 2011 has this process more or less built in and it's able to render out a multi layered Photoshop file or a set of tiff or iff files that can be imported into Photoshop, After Effects or another compositing program.

    If you're looking to just render an Ambient Occlusion image by itself, check out this post.

  • Don't Forget to Print the $closure Variable on Custom Theme Pages

    If you have any modules that add external JavaScript to your pages (like Google Analytics), make sure you have the line

    <?php print $closure; ?>
    in your .tpl.php files right before the end tag. If you don't have this line the external scripts will not be loaded and will not be added to your pages.

    This should be the first thing you should check if Google Analytics is configured correctly on your site, but is not showing any data in the Google Analytics reports.

  • Custom Maintenance Theme Pages for Drupal 6

    Recently, I wanted to change the default Site Offline page that Drupal provides to a design that was less generic and more fitting with the style of the website. I needed to have the site in offline mode for a longer period of time while I was overhauling the content of the website. I developed a simple HTML placeholder page and by changing a couple lines of code in settings.php and adding a new function in template.php I was able to redirect the users to this static HTML page while the site was offline.

  • Importing and Running External Python Scripts in Maya 2011

    When developing an external python script, it is often preferable to develop it in an external editor and source it through Maya. To speed up this workflow wouldn't it be nice to have a custom button on your shelf to be able to execute the external script? Here's how to do it:

  • Be Notified of a New Comment in Drupal 6

    Here is a way to have Drupal send you an email when a new comment has been posted on your site. This method uses the built in modules, Actions and Triggers, that come with Drupal core. You may want to check out my post on good contributed modules to add to Drupal to block spam, or else you will eventually receive more emails than you probably want to.

  • Top Ten Modules for Drupal 6

    Here are ten(ish) of my favorite modules to extend the functionality of Drupal.

    Views & CCK

    Often regarded as two of the most powerful modules in Drupal. You can create new fields to define different content types with CCK and choose different ways of displaying them with Views. Views is the easiest way of creating and displaying customized collections of content on your website, and Views can easily output its result to a node, block or RSS feed.

  • Backup a Drupal 6 Site to a Local Testing Server

    Over time, you may find that your production website and the local copy of your website become out of sync. You might find it necessary to create a backup of your site to place on your local machine so that you can test new development features.

  • iPhone, iPad and Flash Video with SWF Tools and Drupal 6

    When updating my website recently, I decided to add iPhone and iPad video playback to my video player in case a visitor to my site did not have Flash installed. I more or less followed the tutorial here, from gotoAndLearn, but updated it to be able to use the SWF Tools module for Drupal.

  • Updated Website 2010

    After a year and a half, I decided to update the design of my website. With help from Smashing Magazine's post on HTML 5 and various websites and blogs, I redesigned this website in (mostly) HTML 5.

    I also utilized CSS3 as often as possible and I used TypeKit to embed rich typography in the page without the use of flash or image replacement techniques.

  • Multiple Image Backgrounds with CSS 3

    I have been reading about HTML 5 and CSS 3 for a while now and thought I would try some experiments with some of the new CSS 3 properties. This little snippet will put an inner-shadow on the body element by using 5 different image backgrounds to define the shadow.

  • Demo Reel and Gallery Updates

    It's been awhile since I last posted, but I have been working on finishing up my demo reel video for 2010.

    I also updated and added new images I've been working on in the gallery section of my website.

  • Variations on Actionscript 3 XML Slideshow

    I have received some emails from people wondering how to go about implementing variations on the Flash XML Slideshow from this blog post. I've created two variations based on the most popular requests.

  • Creating Clouds in PyroCluster and Cinema 4D

    Here is a short tutorial on a combination of settings I have found for rendering out volumetric clouds using PyroCluster in Maxon's Cinema 4D. These are the settings I used on my airplane renders.

  • MacBook Pro Textures

    While making an image in 3D, I created a couple images as textures that I would like to share. One would be the default desktop of a Mac computer, saved at 1440x900 resolution. The other being a Photoshop file of the keyboard layout of a MacBook Pro. The Photoshop file contains every part of a keyboard separated out into layers, and is best used for UV mapping and close up detailed shots. Preview images and downloads can be found below.

  • Blurry Text and Images When Using Native 3D Transform in Flash

    I recently found out that when using the 3D rotation and transformation tools in Flash CS4, the movieclip or object that has the transformation applied to becomes slightly blurred. I have found that if you apply a 200% scale transformation to the movieclip you want to have the rotation effect applied to, and then nest it in another movieclip that has 50% scale transformation, it results in the end product being much crisper.

  • Accessing and Displaying Custom Profile Fields in Drupal 6

    Here are some PHP snippets to display data from custom profile fields you can set up using the core profile module in Drupal 6. In this first example I have a custom user profile field that holds the user's location with the machine readable name of profile_location. The first block of code stores the location of the user who is logged in in the variable theLocation. The second block of code displays this value.

  • Drupal 6 Custom Theme Template

    Here are some resources for creating a custom theme in Drupal 6.

    The minimum files you need are:

    • .info file
    • page.tpl.php file
    • template.php file
    • CSS stylesheet
  • FLVs Playing Quickly

    I recently found out while building my custom flash video player that if an FLV is encoded without an audio channel it plays back faster than normal the first time the video loads. It seems to be a bug inherent to flash, as I have come across this happening on popular sites such as Vimeo and YouTube. A workaround to this issue is to render silence for the duration of your video, and encode that audio file into your FLV.

  • Actionscript 3 XML Slideshow UPDATE

    Updates include:

    • a preloader movieclip,
    • ignore the image file if the path is not defined correctly or the image cannot be found,
    • once the image is loaded, the image is cast as bitmap data object, and bitmap data smoothing is applied,
    • and now the images will be chosen in a random order, and will only repeat once all images have been seen.

    Once again, the source code (heavily commented) and example is posted below.

  • Actionscript 3 XML Slideshow

    I had some time to sit down and work on some projects in Actionscript 3, and came up with this XML Slideshow viewer.

    Right now the functionality is fairly basic, it reads in the image URL from the XML and displays the image with a nice easing effect. I used the TweenLite tweening library to fade in and tween the images.

    Note - Please see updated slideshow here

  • drupal 6 template.php

    Here are a handful of PHP snippets to put in your template.php file to allow Drupal to use different page templates depending on your URL alias. It will also take the URL alias and add that to the bodyclasses array to help with customizing different pages through CSS. This is the best combination of snippets I have found to use in a completely custom theme. Just replace the four instances of THEMENAME with the name of your theme.

  • Website Launched

    Portfolio website originally launched on January 3rd 2009. Visit the gallery page to view projects I've worked on.