Solid Modeling

Solid modeling is the process of joining parts together in unique ways to form more complex shapes known as unions. You can perform 3 solid modeling operations using the tools within the Solid Modeling section of the Model tab:

  • Union - Joins two or more parts together to form a union.

  • Negate - Negates a part for the purpose of subtracting it from a union.

  • Separate - Separates a union back into individual parts.

Unioning Parts Together

The Union tool joins two or more parts together to form a union. A union is not the same thing as a group. While both a union and a group move like a single part, a union joins all parts together while a group keeps each part separate while they move in unison. You can change the properties of each part within a group, while property changes affect a union as a whole.

Separate Parts
Unioned

To join parts together into a union:

  1. Select all parts you would like to join together. To select multiple parts, you can:

    • Press the Shift key and click on each part.
    • Click on the viewport and drag the selection square over each part.
  2. In the menu bar, select the Model tab and navigate to the Solid Modeling section.

  3. Select Union.

Negating Parts

The Negate tool negates a part so that when it is unioned with another part, the shape of the negated part is subtracted from the other part. A negated part turns translucent, allowing you to position the part accurately and see what will be removed once the parts become a union.

Separate Parts
Negated

To negate a part, then subtract the negated part from other intersecting parts:

  1. Select the part you would like to negate from another part.
  2. In the menu bar, select the Model tab and navigate to the Solid Modeling section.
  3. Select Negate. The part becomes negated (translucent).
  4. Select Union. The negated part is cut out from any other intersecting parts.

Separating a Union

The Separate tool separates the union back into its individual parts. You can think of it as an "undo" tool for unions.

Unioned
Negated

To separate a union back into individual parts:

  1. Select a union.

  2. In the menu bar, select the Model tab and navigate to the Solid Modeling section.

  3. Select Separate.

Union Properties

There are two properties specific to unions: render fidelity and smoothing angle.

Render Fidelity

By default, a union always displays in precise fidelity, no matter how far it is from the game camera. This improves its appearance when you view them from any distance, but it may come at the cost of reduced overall performance if there are a large number of detailed unions.

You can dynamically control their level of detail through their RenderFidelity property. When it is set to Automatic, unions render at a different level of detail depending on their distance from the camera:

Distance from Camera Render Fidelity
Less than 250 studs Highest
250-500 studs Medium
500 or more studs Lowest

Smoothing Angle

A union's SmoothingAngle property smooths angles between surfaces of a union. A higher value produces a smoother appearance while a lower value produces a rougher appearance with more sharp edges.

While a value between 30 and 70 degrees usually produces a good result, values between 90 and 180 degrees are not recommended as they may cause a "shadowing" effect on unions with sharp edges.

SmoothingAngle = 0
SmoothingAngle = 50

In-Experience Solid Modeling

In addition to using the Union and Negate tools in Studio, you can also allow users to use these tools while they are within your experience through UnionAsync() and SubtractAsync(). Just like Studio's Union and Negate tools, UnionAsync() joins parts together into a union, and SubtractAsync() negates one or more parts from a part. Both functions must call on a BasePart, and they both require an array of one or more parts (otherParts) to union with or negate from the calling BasePart.

To demonstrate how to create a union using UnionAsync(), the following Script calls the gray Part1 BasePart from your workspace, unions it together with the green Part2, Part3, and Part4 BaseParts, then re-parents the union to the workspace in Part1's original position. You must re-parent the union to the workspace, otherwise the union doesn't display within the viewport or workspace.


1local mainPart = workspace.Part1
2local otherParts = {workspace.Part2, workspace.Part3, workspace.Part4}
3
4-- Perform union operation
5local success, newUnion = pcall(function()
6 return mainPart:UnionAsync(otherParts)
7end)
8
9if success and newUnion then
10 newUnion.Position = mainPart.Position
11 newUnion.Parent = workspace
12end
13

To demonstrate how to negate parts using SubtractAsync() the following Script calls the gray Part1 BasePart from your workspace, negates the red Part2, Part3, and Part4 BasePart from Part1, then re-parents the union to the workspace in Part1's original position:


1local mainPart = workspace.Part1
2local otherParts = {workspace.Part2, workspace.Part3, workspace.Part4}
3
4-- Perform union operation
5local success, newUnion = pcall(function()
6 return mainPart:SubtractAsync(otherParts)
7end)
8
9if success and newUnion then
10 newUnion.Position = mainPart.Position
11 newUnion.Parent = workspace
12end
13
14