Abstract
SkelTree is a lean tree solution that is efficient to make an animated sequence, cache-free, and transparent to the pipeline. Three simple steps make tree animation easy and fast, transferring tree data from Speedtree into Maya, quick few parameters adjustment, and rendering. Supporting to read RAW XML format file exported from Speedtree, skelTree rebuild the tree asset with the trunk, branches, and leaf instances. With high-performance Viewport 2.0 override classes of Maya API, those tree data can be managed, manipulated, and visualized efficiently. Tree asset can be rendered for a shot immediately after being modified, without bothering to produce and publishing animated caches through the pipeline.

Export Speedtree data into Maya
Meshes and Skeleton Hierarchy Speedtree gives a flexible node-based graph editor to generate a tree asset, generating meshes of Trunk, Branches, and leaf, more important, stringing skeleton hierarchy within to animate them well. To inherit these features in Maya, a tree creating DG node, SkelTreeCreator, a container of the above geometries and skeleton system, and a py script feeding the data into the DG node work as the initialization of SkelTree.
Tree Rebuilding
With data of geometries and skeleton hierarchy transferred from Speedtree, the SkelTreeCreator builds meshes for trunk and branches, binds skeletons within them, and scatters leaves on the tree as mesh instances. Among the process, in order to stick the leaves on the branches, every leaf finds the closest polygon and the UV of the nearest point on it.
Tree Animation Without Cache
After building the geometries, skeleton hierarchy, leaf instances, and dependency relationships within them, tree animation can be driven by a few quaternions input joints of skeleton hierarchy and leaf instances. To make tree animation simply, giving few parameters, a noise force with a wind direction can be conducted at each animated joint to set a different quaternion. Particularly, the state of the tree is independent at each frame so that it can be rendered immediately and parallelly. No caching, no simulation, but just a few parameters are all the need to render tree animation.
Noise Pattern Swaying
A noise curve was implemented with a float random value table generated with a specific seed number and a Lagrange interpolating function, which is the basis of the noise pattern. Compositing this simple curve in few disparate frequencies and sampling the relative coordinate of skeleton joints and leaf roots dependent on wind direction, SkelTree imitates a natural noise pattern of tree sway effect by wind blowing. In contrast with the traditional looping cache sequence, noise pattern driving animation makes a tree animation without a length limit. Moreover, instead of setting an annoying offset frame, a specific seed value is all the need to make a different tree animation.
On-the-fly tree visualization based on Viewport 2.0



An on-the-fly tree visualization DAG node drawing several types of SkelTree’s data, including trunk and branches’ mesh, skeleton hierarchy, and leaf instances, with viewport2.0 features for serving artist when adjusting the parameters and viewing tree animation. To draw huge geometries efficiently, it’s crucial to reduce the drawing workload. The series of Override classes in Viewport 2.0 has features to optimize and organize the drawing process well. Especially with SubSceneOverride class drawing process can be separated into three sub-steps, updating the DG node’s data, preparing the renderItems, and filling geometry streams into Buffers, which will only be called when needed. To reduce the redundancy geometries, the mesh instances only need a transform matrix per instance and a set of geometry data. Also, In SubSceneOverride renderItem instance can be managed well.
Arnold OP serves for animation deformation
To decouple making tree animation from lookdev, SkelTreeOp, an Arnold OP, serves as an animation layer overridden above the tree asset with lookdev when scene rendering. Arnold OP framework gives a chance to assign or modify data for the primitives in the scenes before rendering. With this framework custom data and relationships can be built and only exist in a rendering context, which means those data and relationships work dynamically, therefore they are unnecessary to be stored anywhere. In brief, SkelTreeOp works in rendering but is invisible in the pipeline.
C++11
SkelTree benefits from a few c++11 features, such as constexpr function, lambda function, Rvalue, variadic template, etc, which are well recommended to code compactly and productively.
Summary & Future
Trees are the common assets for animation environment background. They are out of interest in the shot, but heavy. Previously, in the traditional way, tree’s model and animation sequences were exported from speedtree. In practice, a tree model takes hundreds of megabytes, then a geometry sequence of tree animation takes hundreds of gigabytes. It’s nightmare of counting how much disk space a forest having plentiful trees needs to make hundreds of frames of animation. Trees consume the project’s resources heavily, cascading in disk servers, dragging rendering, stacking artists. With SkelTree tree’s resource consumption shrinks remarkably. No matter how long the animation will be, all the data will be stored is about a hundred megabytes. Without geometry cache sequences, the pipeline gets rid of the job of managing cache files during project proceeds. Trees can be rendered as soon as the Asset team updates. The performance of viewport interaction and rendering have both been improved as well because of the reduction of data loading. The SkelTree’s future goal is to enhance the real-time performance further through putting the tree computation on GPU. In addition, some controls would like to be explored to assemble the forest with SkelTree.