- Procedural Vine (Houdini): Developed procedural vines that dynamically climb and adapt to the shapes of objects. The tool includes various adjustable parameters, such as distribution and density, growth progress, branch numbers and leave scales.
-
Procedural Floating Island Terrain (Houdini): Created the top surface of the floating island using heightfields for natural terrain features; Designed the underside of the island with noise-based procedural geometry.
-
Procedural Textures (Substance Designer): Created intricate rose window patterns, converting them to SVGs to generate 3D models; Created procedural materials for the stylized tree trunk and plaster wall.
-
Stylized Tree (SpeedTree, Blender, UE):
Modeled a stylized tree with a
spiraling trunk with Speedtree;
Transferred spherical normals to the leaves in Blender; Created custom stylized tree materials in Unreal Engine.
- Stylized Rock (Zbrush, RizomUV, Marmoset ToolBag):
Sculpted rock details in ZBrush; Used RizomUV for efficient UV layout; Baked high-poly normal details to low-the poly model in Marmoset Toolbag.
- Stylized Grass (Blender, UE):
Modeled grass blades and mapped UVs in Blender; Created a custom stylized grass material in UE.
- Stylized Water (UE):
Designed a stylized water material in UE, incorporating normals, foam, refraction and reflection.
- Asset Preparation (Blender, UE):
Designed, modified and reorganized assets for visual appeal and cohesion; Created additional models and optimized geometry where necessary.
The project borrows ideas from a map created for the game Fun Party, which was inspired by the delicate beauty of lily of the valley and the mythical spirits of the forest. Representing purity and elegance, the lily of the valley serves as the primary design motif of this project, influencing the color palette of soft greens and whites and shaping the main elements of the environment. The overarching design strives to evoke a holy, otherworldly sense of refuge—a shelter suspended in a mythical realm.
The initial draft and blockout focused on defining the scene's layout and key features:
- Main Floating Island: The central island is adorned with vibrant vegetation and a serene waterbody, guiding the viewer’s eye to the architectural centerpiece—a sanctuary/palace that anchors the environment.
- Bridges to Secondary Islands: A series of floating elements form bridges that connect the main island to three smaller auxiliary islands, creating a sense of movement and exploration.
Building on this foundation, I sought to craft an ethereal environment that combines procedural generation with hand-crafted elements, achieving a stylized aesthetic.
This custom HDA (Houdini Digital Asset) tool dynamically generates lily of the valley vines that adaptively climb and conform to any given geometry. The tool offers versatile controls, such as growth patterns, growth progress, branch numbers, leaf scales, etc.
Create Banches
- Base Geometry: Remeshed the input geometry and applied a slight peak operation to create a surface for vine attachment.
- Noise Filtering: Used a noise function to blast away portions of the surface, leaving areas for vine growth.
- Point Scattering: Scattered points on the filtered surface, with density determined by the noise pattern. Points were sorted by height (Y-axis).
- Vine Path Generation: Selected points at the bottom as starting points and randomly chose some as endpoints; Connected points with the Connect Adjacent Pieces node; Generated vine paths using Find Shortest Path; Simplified paths with Resample and Fuse nodes.
- Vine Thickness: Controlled by the path cost, creating a natural variation in vine thickness.
- Secondary Branches: Randomly selected points along the main vines; Added curves to these points as secondary branches using Copy to Points; Adjusted branch direction and size using Orient Along Curve and pscale attributes; Controlled branch thickness with Distance Along Geometry.
- Hanging Branches: Selected points with downward-facing normals; Randomly chose points to attach hanging branches created with Line nodes; Added slight distortion to lines using Mountain for realism; Controlled branch thickness with Distance Along Geometry.
- Leaf Variants: Created a collection of lily of the valley flowers and leaves with different shapes in Blender, assigning variants to each.
- Leaf Placement: Used curve normals and tangents to orient and attach leaves to vine paths; Copied leaf variants to curves and adjusted sizes with pscale attributes for natural variation.
The procedural vine system was packed into an HDA with exposed parameters for user control, allowing customization of: growth distribution and density, branch numbers, leaf coverage and scaling.
This floating island terrain was created in Houdini, combining heightfield-based topography with noise-based geometry for the underside.
Top Surface: Heightfield-Based Terrain
- Initial Blockout and Masking: Used Heightfield Paint to sketch the basic layout based on the blockout, defining raised hills and recessed water areas; Generated an irregular island shape by jittering points on a circle using Point Jitter and resampling them, creating a mask for the heightfield.
-
Edge Transition Mask: Expanded and shrank the mask,
then subtracted the shrunk mask from the expanded one to obtain an edge region;
Applied a blur to smooth the transition and used Heightfield Wrangle to gently slope the edge downward, ensuring a natural connection with the island’s underside.
- Surface Detailing: Added natural variations to the terrain with Heightfield Noise and Distort; Converted the heightfield to polygons and used a Boolean node to trim the geometry according to the island's shape mask.
- Base Setup: Reversed the top surface geometry to serve as the foundation for the underside; Created an attenuation mask by calculating the horizontal distance from the island center using an Attribute Wrangle, storing it in Cd.x (with the outer edge set to 0).
- Noise Application: Applied procedural noise using Point VOP to modify point positions based on their distance from the center; Multiplied the noise by Cd.x to ensure the deformation fades out towards the edges; Adjusted the vertical position of points (y) using an Attribute Wrangle to achieve a natural, tapering effect for the underside.
Integration Trick for Unreal Engine
- Directly importing the heightfield into Unreal Engine can result in issues:
- Using Opacity for Masking: Leads to jagged edges around the island due to precision limits.
-
Importing as Geometry: Prevents using Unreal's Landscape tools, making it difficult to modify terrain colors or details later.
- Solution: Imported both the geometry and heightfield into UE; Used Runtime Virtual Texture (RVT) to store the painting results of the heightfield landscape; Configured the geometry material to read from the RVT, enabling real-time terrain color painting while maintaining sharp and clean island edges.
This section showcases the creation of procedural textures using Substance Designer, featuring intricate rose windows, plaster surfaces, and a stylized tree trunk.
Rose Window:
- Design: Used basic Shape and Transform nodes to create foundational Gothic-style patterns; Applied Splatter nodes to arrange and layer elements into intricate floral patterns.
-
Conversion to Geometry: Exported the black-and-white mask as an SVG; Imported the SVG into Blender to generate 3D geometry, adding subtle Bevel to enhance the intricate edges.
Plaster:
- Base Patterns: Combined various Noise nodes and B&W Spots to create irregular patterns for the plaster texture; Introduced Scratches and Dots to add realistic surface details.
-
Maps Generation: Created a Height Map from the combined patterns and used it to generate Normal Map and Ambient Occlusion Map.
-
Base Color: Blended multiple colored Brush Strokes with integrated height information; Mixed colors with AO, lighting details, and curvature maps to add depth and subtle color variation.
Stylized Trunk:
- Base Patterns: Generated foundational wood patterns using Gradient, Tile Generator, and Noise nodes; Added Grain and small shapes to simulate natural wood textures.
-
Maps Generation: Enhanced details with AO, B&W Spots, and Clouds, combining them into a Height Map; Derived Normal Map and AO Map from the height data.
-
Base Color: Used a watercolor-like effect for the tree trunk’s mask, blending it with subtle Clouds to introduce color variation; Mixed a moss effect and shadow colors using different shadow masks; Enhanced the texture with blended curvature, AO, and different brush details for a cohesive look.
Modeling in SpeedTree
- Trunk Creation: Added a trunk and switched to Hand-Drawn Mode to manually create a twisted, spiraling shape for the trunk.
-
Branch Setup: Added large branches (Big Branches) to the trunk; Extended Little Branches 1 from the big branches and further appended Little Branches 2 from Little Branches 1.
-
Leaf Placement: Attached leaves to both Little Branches 1 and Little Branches 2.
Normal Transfer in Blender
- Wrapped the tree leaves with an ellipsoid in Blender to simulate a spherical shading effect.
-
Transferred the ellipsoid's normals to the leaves, giving them a uniform spherical normal appearance for stylization.
Materials in Unreal Engine
- Leaf Material:
- Base Color: Interpolated between leaf color and an underside color based on the normal's upward or downward orientation.
-
Emission:Used the dot product of the normal and light direction to interpolate among three colors, creating dynamic lighting effects; Added a Fresnel edge color for emission, giving the leaves a soft glow around the edges.
-
Leaf Shape: Applied an Opacity Mask to define the leaf shapes.
-
Wind Effect: Used World Position Offset (WPO) to simulate the swaying motion of leaves in the wind.
- Trunk Material:
- Textures: Integrated procedural textures for bark, along with customizable color adjustments.
- Moss Option: Provided an optional moss layer, blended dynamically based on upward-facing normals, to enhance the natural aesthetic.
Sculpting in ZBrush
- Used multiple cubes to construct the rough shape of the rock.
-
Sculpted the basic form with Clip Curve, Trim Dynamic, and Trim Smooth Border brushes to create stylized, chiseled edges.
-
Applied Orb Brushes (Slash, Rubble, and Details) to add intricate surface details such as cracks, cuts, and chipped edges, achieving a handcrafted look.
-
Merged the cubes into a single mesh using Dynamesh for a cohesive high-poly model.
-
Reduced the polygon count with Decimation Master to prepare a clean low-poly version for baking.
UV Unwrapping in RizomUV
- Marked seams along the rock's natural edges and connection points to minimize visible stretching and ensure natural transitions between UV islands.
-
Unwrapped the low-poly model into UV islands, optimized islands by reducing distortion and placed them efficiently.
Normal Baking in Marmoset Toolbag
- Imported the high-poly sculpt and the UV-unwrapped low-poly model into Marmoset.
-
Configured bake settings with appropriate samples and padding size.
-
Adjusted the cage to enclose the low-poly mesh, ensuring accurate projection of high-poly details.
-
Baked the normal map with fine details from the high-poly sculpt.
Modeling in Blender
- Grass Tuft Design: Modeled individual grass blades with simple geometry, then arranged them in varied orientations and sizes to form a natural-looking clump.
- UV Mapping: Arranged UVs such that the base of the blade aligns with the bottom of the texture map, allowing for wind-driven movement control.
Materials in Unreal Engine
- Base Color: Sampled the landscape's Runtime Virtual Texture (RVT) to inherit the underlying ground color; Multiplied the back-facing grass by an extra color to introduce variation.
-
Wind Mask: Generated a wind mask using the Fibers filter in Photoshop and applied distortions to create irregular wind patterns; Used the mask to interpolate between the grass color and a wind-affected color, adding dynamic visual feedback.
-
Lighting Interaction: Aligned grass normals to face upwards in world space, ensuring consistent light interaction and enhancing the stylized shading.
-
Wind Movement: Implemented World Position Offset (WPO) to simulate grass swaying in the wind; Controlled the amount of movement along the blade using UV mapping, with the base of the blade moving less than the tips for a natural effect.
Base Color:
- Used the Depth Fade node to interpolate between two water colors based on depth. Shallow areas appear lighter, while deeper areas transition to a darker color.
-
Calculated foam regions using Distance to Nearest Surface, multiplied by a noise texture to create irregular, organic foam patterns.
-
Interpolated between the water color and the foam color using the foam mask for smooth transitions.
- Controlled water opacity using Depth Fade to create a realistic fade effect at the edges of intersecting objects, such as terrain or rocks.
- Sampled a normal map to simulate surface waves dynamically.
- Added refraction to distort objects viewed beneath or through the water surface.
-
Enabled SSR to capture dynamic reflections of surrounding objects and skies on the water surface.
The project integrates a mix of custom-created assets and modified third-party assets to achieve a cohesive and stylized environment.
Islands
- Main Island: Procedurally generated in Houdini with detailed terrain and features.
- Auxiliary Islands: Based on third-party assets, customized with color adjustments to harmonize with the main island.
- Modified Models: Assets such as the palace, pavilion, beacon, arch, and carousel were designed, modified, reassembled in Blender using elements from third-party assets. Some parts were entirely recreated and optimized to better fit the overall design. (The rose window was created by converting masks designed in SD into SVGs and generating 3D geometry.) Except for the beacon’s light, where color and emission intensity were controlled using a sine function, other materials were created by adjusting the plaster textures I designed in SD.
- Third-Party Models: Items such as the harp, flowerpot, grail, and altar had their geometry selectively reduced to improve performance. Their materials were adjusted using the same plaster texture base, with an additional option to blend with a watercolor texture for pattern variation.
- Lily of the Valley: Modified the proportions of the flowers and leaves from a base asset model; Created a custom material for a stylized appearance.
-
Vines: Self-created procedural vines in Houdini.
-
Trees: One stylized tree was created from scratch in SpeedTree with custom materials, while other trees were third-party assets adjusted in color to match the environment.
-
Grass: Fully custom-created, including both the model and material.
-
Lotus and Blue Flowers: Used third-party asset models combined with custom materials.
- Shrubs and Dandelions: Adjusted the colors of third-party assets to better fit the scene.
- Custom Rock: A uniquely sculpted rock created in ZBrush with custom materials.
-
Other Rocks: Transformed and color-adjusted third-party assets to integrate into the scene.