| On this page |
|
Houdini Engines for Unreal currently supports outputting the following types of geometries from Houdini Assets:
-
Static Meshes
-
Dynamic Meshes
-
Instancers and Foliage
-
Landscapes
-
Spline Component
-
Data Tables
-
Data Assets
-
Geometry Collection
-
Skeletal Mesh (KineFX)
-
Landscape Splines
-
Animation Sequence (motion clips)
-
Textures (COP node)
By default, the plugin will always prefer to use output nodes for its outputs, but will rely on the Display SOP if no output nodes can be found.
If you turn off use output nodes, outputs will be created from the nodes that currently have the display flag set. To turn this off:
-
In the details panel, turn off the checkbox for use output nodes.
Static Meshes ¶
Most Houdini assets produces Static Meshes upon cook. The generated Static Meshes Components corresponding to the output nodes attaches to the Houdini Asset Actor, and listed in the Houdini Outputs section in the details panel. They can be baked to separate them from the asset and convert them to standalone Static Meshes available in the content browser.
The Houdini Outputs section also displays the materials assigned to each generated meshes. You can override them by drag and drop or selecting a Material in the drop down list.
Generated meshes can also have colliders and sockets assigned to them. Those can be visualized in the Static Mesh Editor by double on the mesh thumbnail in the Details panel.
For more information on the mesh generation mechanism, see Meshes
Static Mesh creation time has been optimized and now uses Mesh Descriptions. You can use a faster Proxy Mesh generation while editing the HDA. The ProxyMeshes can be automatically refined to Static Mesh, either on a timer, when saving/playing the level, or manually.
Select Enable Proxy Mesh in the project settings to turn them on.
Proxy Meshes provides a faster visual feedback when modifying an HDA, but shouldn’t be considered as an asset’s final output. They only create their main level LOD, won’t have colliders, and can’t be instanced.
You can see an HDA is using proxy meshes as the proxy always displays a Houdini Logo sprite.
To separate multiple meshes in your output, you can pack each mesh into a pack primitive before merging them in your asset’s output. A single pack primitive always creates a Static Mesh instead of an instancer with one instance.
You can use the unreal_output_name attribute to set the output mesh’s name.
Dynamic Meshes ¶
You can output Unreal Dynamic Meshes instead of Static Meshes by adding an integer unreal_output_dynamic_mesh attribute with a non-zero value to the output geometry. The attribute can be a detail or primitive attribute.
The plug-in creates a UDynamicMesh and displays it with a UDynamicMeshComponent attached to the Houdini Asset Actor. This lets you further modify the output with Unreal’s Geometry Scripting tools without converting it to a Static Mesh first.
Dynamic Mesh output supports positions, triangle topology, normals, UV layers, vertex colors and alpha, material IDs, and simple collision. Materials are assigned to the Dynamic Mesh Component in the same order as the output’s material slots.
Dynamic Meshes do not support LODs. Only the base render mesh is output, and Static Mesh-specific generation features such as Nanite, proxy meshes, and Static Mesh build settings do not apply. If you need a Static Mesh asset or LODs, use a Static Mesh output instead.
Instancers And Foliage ¶
When using packed primitives or attribute instancers, Houdini assets produces Instanced Static Mesh Components.
All the instancers are listed in the Houdini Outputs sections of the details panel and labeled instancer.
Similar to Static Meshes, if the instanced static geometry was produced by the asset, it’s also listed in the Houdini Output Mesh section. It’s labeled as instanced to indicate that the mesh is used by one of the instancer in the HDA’s outputs.
The unreal_output_name attribute can set the output instancer’s name.
For more information, see Instancing.
You can also directly create Foliage instances instead of Instanced Static Mesh Components. Add the unreal_foliage int attribute to your instancer, and set its value to 1.
New foliage is created for the instanced meshes and the instances added to to the current level’s foligage actor.
When you modify the HDA, the plugin only modify/updates the foliage instances it creates and doesnt modify or remove manually placed foliage instances.
Landscapes ¶
If your asset outputs one or multiple Heightfield node, then the resulting geometry creates a Landscape in Unreal.
Generated Landscapes and their materials lists in the Houdini Outputs section in the details panel.
The unreal_output_name attribute sets the output landscape actor’s name. When using streaming proxies, the proxies' shared landscape actor name can be set using the unreal_landscape_shared_actor_name attribute, and the unreal_output_name attribute will control the proxies' names.
For more information, see Landscapes.
Data Tables ¶
If an HDA output is a Houdini point cloud, it will generate an Unreal DataTable when added to the scene. The DataTable will be populated according to the point cloud’s attributes.
The Unreal struct to use as the basis for the data table is determined by the value of the unreal_data_table_rowstruct attribute of the points. The value of the first point will be taken. The value should be a string representing a valid Unreal object reference. If no structure is specified then one will be generated when cooking based off the table data.
The final baked output name of the table - and structure, if not specifed - created by Baking, can be specified by the unreal_output_name attribute.
The string that will be used as the row name (key) for each row of the data table is determined by the unreal_data_table_rowname attribute of the points. If no such attribute is given, the row names will be defaulted to NewRow_x where x is the index of the row, starting at 0.
The data table will be saved at the string specified by the unreal_object_path attribute. The string at the first point will be taken. This path should be a valid Unreal path (where /Game represents the Content folder). If no path is specified, a name for the data table will be automatically generated and it will be saved in the HoudiniEngine/Temp folder. If the specified data table path already exists, it will be overwritten.
Any other attributes that start with unreal_data_table_ are candidates to use for populating the data table. If the row struct for the data table already exists, these attributes will be matched to the variables of the row struct. Otherwise, variables will be added to the newly created row struct based on these attributes.
Point clouds generated by inputting a data table into Houdini as a geometry input will generate an identical data table when added to Unreal (with the exception of unsupported types that were converted to strings in Houdini, the values of these will be skipped).
If the row struct already exists:
-
If the attribute names following the prefix start with an integer followed by an underscore, that integer will be treated as the index of the variable to match with.
-
The variable at that index must have an identical name to the attribute name with the prefix and index (including the underscore).
-
For example, the attribute
unreal_data_table_2_typewill be matched with the second variable of the row struct if its name is type. It will not be matched if the name is not type.
-
-
-
If no index is present in the attribute name, it will be matched with any variable that shares the same name after the prefix.
-
For example, the attribute
unreal_data_table_typewill be matched with a variable of the row struct with name type. If no such variable exists, it will not be matched.
-
-
If no match is found, the attribute will be skipped.
-
The attribute type and the matched variable type must satisfy the following constraints:
-
The variable type must be one of the following:
-
Any numeric type
-
Vectors
-
Rotators
-
Transforms
-
Colors
-
Linear Colors
-
Strings
-
-
They must have the same number of components (they are both single values, or are tuples of the same size).
-
Rotators have 3 components, transforms have 10 (4 component quarternion, 3 component scale and translation), colors and linear colors have 4.
-
-
If the attribute type does not exactly match the variable type, one of the following must be true:
-
They are both numeric types (in which case the attribute values will be forcefully converted to the variable type and overflow may occur).
-
The attribute is numeric and the variable is a string type (String, Name, or Text).
-
-
-
Transforms are handled as a special case. Attributes will be matched to a variable with a transform type only if there are 3 separate attributes with the standard name, but appended with rotation, scale, and translate. The rotation attribute must be a tuple of size 4, and the others must have size 3. This reflects the way transform variables are converted to Houdini attributes when a data table is used as a geometry input.
If the row struct does not already exist:
-
Transform variables will be created if 3 attributes match the naming pattern described above.
-
Otherwise, a variable will be created for each attribute with the prefix.
-
The best matching Unreal type will be used. For tuples, generic vector types will be used.
-
Tuple sizes cannot exceed 4.
-
Data Assets ¶
A Houdini point cloud with the point string attribute unreal_data_asset_class creates a Data Asset output. The attribute value must be the Unreal object path of a class derived from UDataAsset. For Blueprint Data Asset classes, a path copied from the Unreal Editor may omit the generated _C suffix; the plugin retries the path with _C appended when needed.
Set the Data Asset’s values with either the unreal_data_asset_values point dictionary attribute or point attributes matching editable property names.
Point Attribute Values ¶
Without unreal_data_asset_values, each point with a non-empty unreal_data_asset_class creates one Data Asset output. Points with an empty class attribute are ignored. The point-attribute form supports scalar values for numeric types, booleans, strings, names, text, enums, soft object references, and object references. An editable FVector is represented by a three-float Houdini vector tuple. Its X, Y, and Z components are applied unchanged; coordinate conversion is deliberately skipped because Data Asset vectors can represent arbitrary values rather than positions. FColor and FLinearColor are represented by four-component Houdini color tuples with 8-bit and float RGBA storage respectively. Regular struct members use point attributes named Property_Member; nested structs use further _Member segments. Arrays, sets, and maps use Property_num followed by indexed entries such as Property_0; map entries use Property_0_key and Property_0_value. This includes nested containers. A Data Asset reference may contain the point number of another generated Data Asset as either an integer or a numeric string; other strings are treated as object paths. Missing or incompatible point attributes leave the property’s class default value unchanged.
Point-attribute and dictionary properties may be prefixed with their Data Asset class name, for example MyDataAsset_MyProperty, when they were exported with Prefix Data Asset Property Names with Class Name. The prefix is removed while importing so the value is applied to MyProperty.
Dictionary Values ¶
The dictionary uses JSON-shaped values and supports nested properties, arrays, sets, maps, and Data Asset references. Dictionary property names are authored Unreal property names, or ClassName_PropertyName when class-name prefixing was enabled for the exported input. A nested Data Asset dictionary that creates a new asset requires __class_path; its remaining entries can contain the nested Data Asset’s editable values. If it includes __object_path, that path must resolve to an existing Data Asset, which is referenced without modification. Without __object_path, the dictionary creates a new Data Asset output unless it reuses a generated asset through __unique_id. A top-level __object_path identifies the source root, but the output always creates a new root Data Asset.
Maps use an array of { "__key": ..., "__value": ... } entries so that either a key or value can be structured.
Nested Data Asset Outputs ¶
Nested Data Asset outputs are supported in both forms. With dictionaries, nested objects create outputs as described below. With point attributes, create one point per Data Asset and set each nested-reference property to the other point’s number (an integer or numeric string). This lets nested Data Assets refer to each other, including shared children.
Each generated nested Data Asset is a separate Houdini Engine output object. Multiple nested dictionaries that use the same __unique_id refer to the same generated Data Asset and therefore only one output object is created. __object_path can be used to reference existing Data Assets.
Use the HDA output attributes unreal_output_name and unreal_bake_folder to choose the root Data Asset’s baked name and folder. When multiple point Data Assets share an output name, their names are suffixed with their point numbers. To set a dictionary nested Data Asset’s baked package, use the __bake_folder and __bake_output_name keys inside the nested object.
In this example a Data Asset is created with 4 children. 2 Data Assets are created (the second is re-used). The final child uses an existing Data Asset in the project.
{
"Children":[
{
"Float":1,
"__bake_folder":"/Game/HoudiniEngine/Bake/DataAssets",
"__bake_output_name":"DataAssetCustomName",
"__class_path":"/Script/HoudiniEngineEditor.HoudiniSubDataAsset"
},
{
"Float":2,
"__class_path":"/Script/HoudiniEngineEditor.HoudiniSubDataAsset",
"__unique_id":"shared"
},
{
"__unique_id":"shared"
},
{
"__object_path":"/Game/TestHDAs/DataAssets/Nested/TestSubAsset.TestSubAsset"
}
],
"Float":42
}In this case the top level Data Asset class name is taken from the attribute unreal_data_asset_class, but could be specified by __object_path inside the dictionary too.
Spline Component ¶
The HDA can output curves as Spline Components in Unreal.
To do this, add the unreal_output_curve int attribute to the curve, with its value set to 1.
For more information, see Curve Output.
Geometry Collections ¶
The HDA have the ability to output Geometry Collections, allowing compatibility with Unreal’s Chaos Physics.
Geometry collection outputs are generated from packed primitive that have a non-zero unreal_gc_piece primitive attribute.
You can achieve this using the Voronoi fracture node, with the unreal_gc_piece attribute.
For more information, see Chaos (Geometry Collections).
Skeletal Mesh ¶
The Houdini Engine for Unreal plugin can output Skeletal Meshes from KineFX. To export a Skeletal mesh back to Unreal properly, you will need to use the KineFXtoUnreal node for your output, with the Rest Geometry and Capture Pose.
For more information, see Skeletal Mesh.
Landscape Splines ¶
For more information, see Landscape Splines.
Animation Sequence / Motion Clip ¶
The plugin can output Animation Sequence from Motion clips found in the HDA’s outputs. To properly export a Motion Clip to Unreal, make sure the Motion clips is packed. A motion clip may become unpacked if you use the Motion Clip Evaluate node. A solution is to create a Motion Clip node and turn on the pack input parameter.
Textures / COP ¶
When using COP HDAs, the plugin can output the Textures found in the HDA’s outputs'
For more information, see Copernicus with Unreal.
Templated Geo Output ¶
When the Output Templated Geos asset option is on, the plugin displays an asset’s templated geos. You can display helper geometry used to produce the HDA’s output, without creating an output.
Templated geos outputs use a specific wireframe default material. They will not be baked, and be hidden in-game by default. Only templated meshes are supported, and display geos are never considered templated.
Note
Currently, guide geometries are not supported, but only nodes with the templated flags.
Mesh Build Settings ¶
A number of properties that control the behaviour/creation of the generated Static Meshes (ex. the default collision presets, the use of MikkTSpace, and Distance Field) can be modifed directly on the details panels.
Those properties are found in the Static Mesh Components details or in the Static Mesh Editor. They are listed under Static Mesh Generation in the Houdini Asset’s details, as Static Mesh Generation properties and Static Mesh Build Settings.
They allow overriding the default build settings values set in the plugin settings per Houdini Asset Component. Additionally, they can also be modified procedurally via attributes by using generic property attributes (detail attributes only).
i@unreal_uproperty_UseFullPrecisionUVs = 1;