Introduction

This proposal aims to add native support for Image Planes to USD. An Image Plane is a camera constrained image that can be seen in "screen space" when looking through that camera.

The majority of work in VFX is centered around augmenting existing footage, so it is important to view animation in the context of that footage (it doesn't matter if the animation looks good if it doesn't look integrated). Without this ability, the utility of tools like usdview is quite restricted and requires compositing before work can be evaluated in context. 

High Level Anatomy of an Image Plane

Conceptually, an Image plane must provide the following information:

And should probably also provide:

Pinhole Camera Diagram

This proposal will follow the same nomenclature from the Cooke site. Here is a reproduced CG Camera diagram. (from https://cookeoptics.com/i-technology/ > "Cooke Camera Lens Definitions for VFX" > CG Camera diagram 2.1.)

UsdGeomImagePlaneAPI Schema

The UsdGeomImagePlaneAPI  schema defines basic properties for rendering an image plane. The UsdGeomImagePlaneAPI  schema derives from UsdSchemaBase  and will be a Multi-Apply Schema that would be restricted to UsdGeomCamera prim types.

Properties

Why a Multi-Apply API Schema?

If we implement a Multi-Apply API Schema for Image Planes we can:

API Methods

TODO:

A Minimum Usage Example:

camera = stage.GetPrimAtPath('/world/cam')
imagePlaneApi = UsdGeomImagePlaneAPI(camera)
imagePlaneApi.CreateImagePlane("imagePlane1")
framesToImages = [(f, fileSequence.frameAt(i) for f in fileSequence.frames()]
imagePlaneApi.SetImagePlaneImageAttr(framesToImages, "imagePlane1")


Which would generate this .usda:

def Xform "world" {
    def Camera "cam" (        
apiSchemas = ["UsdGeomImagePlaneAPI:imagePlane1"]
){
        ...         string[] imagePlanes = ["imagePlane1"]         asset imagePlane1:image = {             1001: @/path/to/image.1001.exr@,              1002:...             }         float imagePlane1:depth = 1000.0     } }

Hydra Implementation

TODO: Flesh out and discuss with Hydra team.

Open Questions

Should you have the ability to define multiple Image planes per camera? YES

Should the image plane be a separate prim or part of the camera prim? CAMERA

Should the "image" be implemented as a UsdTexture? Or any other part of Image Plane defined as its component part?

Alternative Implementation Strategies

As a concrete prim type

Here is a working implementation that was done before Multi-Apply schemas were added to USD. Its a fully featured solution that is based around Autodesk Maya's "underworld" image plane nodes where many planes can live under a camera. This specific implementation is just a quick attempt to move maya image planes across packages and the hydra implementation is just a workaround that generates an HdMesh rprim (instead of creating a new image plane prim type). 

Reference PR from Luma: https://github.com/LumaPictures/USD/pull/1

Pros:

Shortfalls:

Using existing USD types (Plane + material + camera + expressions)

It is possible to create a UsdPlane with a material and accomplish the same thing as an image plane.

TODO: Get example usda file.

Shortfalls:

Example Use Cases

Hydra / Usdview

It would be helpful to be able to view CG elements against a backdrop of the production plate when checking exported usd caches.

DCC Interchange

Having a "UsdLux" style standard for Image Planes would be very useful when implementing importers and exporters for DCCs like Maya, Blender, Nuke, etc.