tool development

A small excerpt of my tool, plugin and script development work.

Nuke Plugin Prototype for Phyiscally Correct Depth-of-Field Simulation

For my Master’s Thesis I investigated existing depth-of-field simulation methods for VFX applications. Both object- and image space approaches have been considered. As part of this work, a prototypical Nuke Plugin Prototype has been developed in C++.

Most available image based depth-of-field simulation approaches do not allow for spatially varying bokeh shapes. Effects like “Cat’s Eye Bokeh” cannot be simulated with these methods. The prototypical Nuke plugin adds this functionality by interpolating PSFs.

Principal of Operation

The princial of operation is based on the research by Thomas Hach et al as presented in “Cinematic Bokeh rendering for real scenes “.

For the prototype, point-spread-functions (PSFs) were manually acquired with a photo camera for a certain lens, sensor and a small LED slight source at a given focus distance. In fixed interval distances from the camera, a center and an outer PSF have been obtained.

PSFsl.png

The plugin prototype reads these PSFs from disk and interpolates them in order to be able to synthesize a PSF for each pixel in an input image with a certain distance from the camera. The below image shows such an interpolation result. The PSFs in the green circles are the obtained PSFs while all other PSFs were synthesized through interpolation.

spatial_interpolation.png

The interpolated PSFs are then used as filter kernels for convolution. Two different approaches have been tested for this thesis. The gathering and the spreading method. The below image shows the results of both methods as straight-forward implementations. Spatially varying bokeh shapes can be discovered in the stary background. These are the result of the PSF interpolation. Both images show severe depth discontinuity and intensity leakage artefacts. 3d Models and textures in the below test images showing ISS and Kepler Observatory, have been obtained from NASA’s extensive 3d resource library. Images and depth pass were rendered with Mental Ray for Autodesk Maya.

spreading_vs_gathering_ISS_vertical.pngspreading_vs_gathering_kepler_vertical.pngVL_node_tree.png

Advertisements

Java Tool for Rendering Polychromatic Point-Spread-Functions with PBRT

For my Master’s Thesis in Computer Science in Media I developed a rending tool to generate polychromatic point-spread-functions (PSF) with PBRT v3. The aim was to see if point spread functions ray-traced through a phyiscal lens system representation deliver realistic results so that they can be used as filter kernel for image-based depth-of-field simulation.

The tool allows to select various parameters such as a camera sensor, a lens, the aperture, the spectral power distribution of the light source, the spectral sensitivity of the senor and many others. It then renders monochromatic PSFs with PBRT and combines the all renders into a single polychromatic PSF.

PSF_rendering_toolpsf_rendering_tool_preview_windowpolychromatic_result_comparison

Houdini: Adaptive Subdivision HDA

The Adaptive Subdivision HDA is a Houdini digital asset that allows the artist to dynamically subdivide specified portions or areas of a polygon geometry with different levels of subdivisions. These subdivisions can also be animated over time. The artist has full control over the amount and distribution of subdivisions which can be controlled by a float ramp in real time. Subdivisions can easily manipulated later.

The HDA was created using visual programming in Houdini nodes and short snippets of VEX code to support it. In addition to the Houdini built in nodes, the qlib digital asset library was used.

The initial problem

The tool was designed for a show that required highly detailed simulations of water surfaces and water interaction. Due to the large scale of the scenes, a high level of detail in terms of polygon subdivision is needed in the areas of interest for the ocean simulations and other surface deforming operations such as a ripple effect to be able to show good and clean results. Subdividing the entire grid to a usable level would however result in a very high poly count, blowing up scene files, simulation times, export geometry file sizes as well as alembic export speed and render times and would also have a significant impact on viewport and overall performance. It would also result in a high level of detail in areas of lesser importance that might be far in the distance, blurred by depth of field or not even visible to the camera at all. This problem asked for a solution to dynamically subdivide the grid only in the necessary areas, leaving the rest of the grid as low poly as possible.

Screengrabs

Houdini: Decrypter Font Node

decrypter

The decrypter font node is a Python driven Houdini Digital Asset that extends Houdini’s existing Font node by some pseudo encrypt and decrypt functionality. It was origrinally intended as an asset for HUD and GUI animation inside Houdini without having to resort to other software like After Effects to for example visualize the hacking of a password in an existing houdini animation. My decision to use Python for this node was based on the fact that it brings many convient string functions to the table that enabled a large feature set.

Example Houdini Animation

Feature Overview