固体模型 是将 零件 以独特的方式组合在一起形成更复杂的形状,称为 联盟 或 交叉 的过程。您可以使用工具栏的 模型 选项卡执行四个固体模型操作。

工具 | 快捷方式 | 描述 |
---|---|---|
联盟 | Shift Ctrl G (Windows) Shift ⌘ G (Mac) | 将两个或更多的零件组合起来形成单个牢固联盟。 |
交叉 | Shift Ctrl I (Windows) Shift ⌘ I (Mac) | 将重叠部件交叉到单个实体交叉点。 |
否定 | Shift Ctrl N (Windows) Shift ⌘ N (Mac) | 否定零件,用于制作孔和 indentations。 |
分离 | Shift Ctrl U (Windows) Shift ⌘ U (Mac) | 将联盟或交集分解为其各个部分。 |
联盟零件
联盟 工具将两个或更多零件结合形成单个实体UnionOperation。默认情况下,新联盟遵循每个部分的 Color 属性,尽管您可以启用其 UsePartColor 属性将整个联盟更改为特定颜色。

要将零件组合在一起形成联盟:
- 选择你想要组合在一起的所有零件。
交叉部件
交叉工具将重叠部件交叉到单个实体 。默认情况下,结果交叉点的面颜色来自原始零件的 Color 属性,尽管您可以启用其 UsePartColor 属性将整个交叉点更改为特定颜色。

要将重叠部分交叉起来:
- 选择所有想要交叉的零件。
否定零件
否定工具否定一部分,使其与另一部分联合时,否定部分的形状从另一部分中减去。

要从其他重叠部分中减去零件:
- 选择你想要从其他部分中否定的部分。
- 单击 否定 . 零件变成了带有名称 NegateOperation 的 **** ,并变成粉色和透明以表明其状态。
- 选择要取消的部分和你想从其中减去的部分。
- 单击 联盟 。被否定的部分从包含重叠部分中被切割。
分离的联盟或交叉点
分离工具将分离工具分解为其各自的部分,基本上服务为联盟和交叉的“撤销”工具。
要将联盟或交叉点分解为单个部分:
- 选择联盟或交集。
- 单击 分开 。零件将回到原来的形式。
渲染忠实度
默认情况下,新的模型操作始终会在Automatic中显示,这意味着零件的细节基于其距离到相机的描述,如下表所述。
从相镜头的距离 | 渲染忠实度 |
---|---|
小于 250 个螺柱 | 最高 |
250-500 格 | 中等 |
500 或更多的螺柱 | 最低 |
平滑角度
一个精确模型的零件的 SmoothingAngle 属性可以平滑相邻颜色或材料表面之间的角度。更高的值产生更光滑的外观,而更低的值产生更粗糙的外观,带有更多锋利边缘。
虽然 30 到 70 度之间的值通常会产生良好的结果,但 90 到 180 度之间的值不建议,因为它们可能会对锋利边缘的联盟和交叉产生“阴影”效果。


经验中的固体模型化
除了 Studio 中的 联盟 , 交叉 , 和 否定 工具外,您可以允许玩家在体验内使用固体建模操作通过 , , 和 ,。所有这些方法都必须在 BasePart 上调用,它们都需要一个或多个部分进行联合、交叉或减去调用部分。
联盟异步()
要显示 , 以下 使用工作区中的 Part1 与 Part2 、 Part3 和 Part4 结合, 然后将结果 转移到工作区的原始位置 Part1 。
local Workspace = game:GetService("Workspace")
local mainPart = Workspace.Part1
local otherParts = {Workspace.Part2, Workspace.Part3, Workspace.Part4}
-- 执行联合操作
local success, newUnion = pcall(function()
return mainPart:UnionAsync(otherParts)
end)
-- 如果操作成功,将其放置在同一位置并将其作为工作区的父级
if success and newUnion then
newUnion.Position = mainPart.Position
newUnion.Parent = Workspace
end
-- 摧毁操作后仍然完好的原始零件
mainPart:Destroy()
for _, part in otherParts do
part:Destroy()
end
交叉异步()
要显示 , 以下 使用工作区中的 Part1 交叉它与 Part2 和 Part3 , 然后将结果 移到工作区的原始位置 Part1 。
local Workspace = game:GetService("Workspace")
local mainPart = Workspace.Part1
local otherParts = {Workspace.Part2, Workspace.Part3}
-- 执行交叉操作
local success, newIntersect = pcall(function()
return mainPart:IntersectAsync(otherParts)
end)
-- 如果操作成功,将其放置在同一位置并将其作为工作区的父级
if success and newIntersect then
newIntersect.Position = mainPart.Position
newIntersect.Parent = Workspace
end
-- 摧毁操作后仍然完好的原始零件
mainPart:Destroy()
for _, part in otherParts do
part:Destroy()
end
减法异步()
要显示 SubtractAsync() , 以下 Script 使用工作区中的 Part1 BasePart 从中否认 Part2 , Part3 , 以及 Part4 BaseParts 从它中,然后将结果 UnionOperation 移至工作区的原始位置的 Part1 。
local Workspace = game:GetService("Workspace")
local mainPart = Workspace.Part1
local otherParts = {Workspace.Part2, Workspace.Part3, Workspace.Part4}
-- 执行减法操作
local success, newSubtract = pcall(function()
return mainPart:SubtractAsync(otherParts)
end)
-- 如果操作成功,将其放置在同一位置并将其作为工作区的父级
if success and newSubtract then
newSubtract.Position = mainPart.Position
newSubtract.Parent = Workspace
end
-- 摧毁操作后仍然完好的原始零件
mainPart:Destroy()
for _, part in otherParts do
part:Destroy()
end