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 three 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

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 combine parts together into a union:

  1. Select all parts you would like to join together.
  2. In the menu bar, select the Model tab and navigate to the Solid Modeling section.
  3. Click Union. All of the parts combine into one solid 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 subtract a 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. Click Negate. The part becomes negated (translucent).
  4. Select both the negated part and the parts you want to subtract it from.
  5. Click 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
Separated

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: RenderFidelity and SmoothingAngle.

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 the Union and Negate tools in Studio, you can allow players to use these operations while in an experience through UnionAsync() and SubtractAsync(). Both methods must be called on a BasePart and they both require an array of one or more parts to union with or negate from the calling part.

UnionAsync

To demonstrate UnionAsync(), the following Script uses the Part1 BasePart from the workspace, unions it together with the Part2, Part3, and Part4 BaseParts, then re-parents the resulting UnionOperation to the workspace at the original position of Part1.


local mainPart = workspace.Part1
local otherParts = {workspace.Part2, workspace.Part3, workspace.Part4}
-- Perform union operation
local success, newUnion = pcall(function()
return mainPart:UnionAsync(otherParts)
end)
-- If operation succeeds, position it at the same location and parent it to the workspace
if success and newUnion then
newUnion.Position = mainPart.Position
newUnion.Parent = workspace
end

SubtractAsync

To demonstrate SubtractAsync(), the following Script uses the Part1 BasePart from the workspace, negates the Part2, Part3, and Part4 BaseParts from it, then re-parents the resulting UnionOperation to the workspace at the original position of Part1.


local mainPart = workspace.Part1
local otherParts = {workspace.Part2, workspace.Part3, workspace.Part4}
-- Perform union operation
local success, newUnion = pcall(function()
return mainPart:SubtractAsync(otherParts)
end)
-- If operation succeeds, position it at the same location and parent it to the workspace
if success and newUnion then
newUnion.Position = mainPart.Position
newUnion.Parent = workspace
end