GeometryService
*Dieser Inhalt wurde mit KI (Beta) übersetzt und kann Fehler enthalten. Um diese Seite auf Englisch zu sehen, klicke hier.
Service mit geometrischen Operationen, die nicht direkt mit bestimmten Objekten zusammenhängen.
Zusammenfassung
Methoden
Gibt eine Tabelle von Constraints und Attachments, die du wählen kannst, zu bewahren, zusammen mit ihren jeweiligen Eltern.
Erstellt eine oder mehrere PartOperations aus der überlappenden Geometrie eines Teils und anderer Teile.
Erstellt eine oder mehrere PartOperations aus einem Teil minus die Geometrie, die von anderen Teilen besetzt wird.
Erstellt eine oder mehrere PartOperations aus einem Teil plus die Geometrie, die von anderen Teilen besetzt wird.
Eigenschaften
Methoden
CalculateConstraintsToPreserve
Gibt eine Tabelle von Constraints und Attachments, die du wählen kannst, zu bewahren, zusammen mit ihren jeweiligen Eltern.Die Iteration über diese Tabelle lässt dich entscheiden, ob du empfohlene Einschränkungen und Anhänge an ihre jeweiligen Eltern reparieren möchtest.
Beachten Sie, dass das options Wörterbuch die gefolgte ProfileInhalte enthalten kann:
- tolerance — Die Distanztoleranz in Bezug auf die Attachment Erhaltung zwischen dem Anhang und dem nächsten Punkt auf der Oberfläche des ursprünglichen Teils gegenüber dem nächsten Punkt auf der Oberfläche des resultierenden Teils.Wenn die daraus resultierende Entfernung nach der Festkörpermodellierungsoperation größer als dieser Wert ist, werden die Parent der Anhänge und ihre damit verbundenen Einschränkungen in der zurückgegebenen Empfehlungstabelle nil sein.
- weldConstraintPreserve — Ein Enum.WeldConstraintPreserve Enum-Wert, der beschreibt, wie WeldConstraints in der resultierenden Empfehlungstabelle erhalten bleiben.
- dropAttachmentsWithoutConstraints — Boolean mit Standard von true . Wenn es auf false gesetzt wird, werden Attachments , die keine Constraints haben, erhalten.
Parameter
Ein ursprüngliches Objekt, auf dem die solide Modellierungsoperation durchgeführt wurde, zum Beispiel part in UnionAsync().
Optionenlexikon für die Methode:
- tolerance — Die Distanztoleranz in Bezug auf die Attachment Erhaltung zwischen dem Anhang und dem nächsten Punkt auf der Oberfläche des ursprünglichen Teils gegenüber dem nächsten Punkt auf der Oberfläche des resultierenden Teils.Wenn die daraus resultierende Entfernung nach der Festkörpermodellierungsoperation größer als dieser Wert ist, werden die Parent der Anhänge und ihre damit verbundenen Einschränkungen in der zurückgegebenen Empfehlungstabelle nil sein.
- weldConstraintPreserve — Ein Enum.WeldConstraintPreserve Enum-Wert, der beschreibt, wie WeldConstraints in der resultierenden Empfehlungstabelle erhalten bleiben.
- dropAttachmentsWithoutConstraints — Boolean mit Standard von true . Wenn es auf false gesetzt wird, werden Attachments , die keine Constraints haben, erhalten.
Rückgaben
Tabelle mit Informationen für den allgemeinen Fall Constraints , NoCollisionConstraints und WeldConstraints .In Fällen, in denen ein Attachment oder Constraint fallen gelassen werden soll, ist sein jeweiliger Elternteil nil .
Für den allgemeinen Fall Constraints wie HingeConstraint :
<th>Typ</th></tr></thead><tbody><tr><td><code>Anhang</code></td><td><code>Klasse.Attachment</code></td></tr><tr><td><code>Einschränkung</code></td><td><code>Klasse.Einschränkung</code> oder <code>nil</code></td></tr><tr><td><code>Anhang-Elternteil</code></td><td><code>Klasse.BasePart</code> oder <code>nil</code></td></tr><tr><td><code>Einschränkungsvater</code></td><td><code>Klasse.BasePart</code> oder <code>nil</code></td></tr></tbody>
Schlave |
---|
Für WeldConstraints :
<th>Typ</th></tr></thead><tbody><tr><td><code>Schweiß约束</code></td><td><code>Klasse.WeldConstraint</code></td></tr><tr><td><code>Schweiß约束親父</code></td><td><code>Klasse.BasePart</code> oder <code>nil</code></td></tr><tr><td><code>Schweiß约束部分0</code></td><td><code>Klasse.BasePart</code></td></tr><tr><td><code>Schweiß约束部分1</code></td><td><code>Klasse.BasePart</code></td></tr></tbody>
Schlave |
---|
Für NoCollisionConstraints :
<th>Typ</th></tr></thead><tbody><tr><td><code>Keine Kollisionszwangslimitierung</code></td><td><code>Klasse.NoCollisionConstraint</code></td></tr><tr><td><code>Keine Kollisions约束父</code></td><td><code>Klasse.BasePart</code> oder <code>nil</code></td></tr><tr><td><code>Keine Kollisionszwangsteil0</code></td><td><code>Klasse.BasePart</code></td></tr><tr><td><code>Keine Kollisionszwangsteil1</code></td><td><code>Klasse.BasePart</code></td></tr></tbody>
Schlave |
---|
Code-Beispiele
The following example shows how to preserve Attachments and Constraints based on a recommended table produced by CalculateConstraintsToPreserve().
local GeometryService = game:GetService("GeometryService")
local mainPart = workspace.PurpleBlock
local otherParts = { workspace.BlueBlock }
local options = {
CollisionFidelity = Enum.CollisionFidelity.Default,
RenderFidelity = Enum.RenderFidelity.Automatic,
SplitApart = true,
}
local constraintOptions = {
tolerance = 0.1,
weldConstraintPreserve = Enum.WeldConstraintPreserve.All,
dropAttachmentsWithoutConstraints = false,
}
-- Perform subtract operation in pcall() since it's asyncronous
local success, newParts = pcall(function()
return GeometryService:SubtractAsync(mainPart, otherParts, options)
end)
if success and newParts then
-- Loop through resulting parts to reparent/reposition
for _, newPart in pairs(newParts) do
newPart.Parent = mainPart.Parent
newPart.CFrame = mainPart.CFrame
newPart.Anchored = mainPart.Anchored
end
-- Calculate constraints/attachments to either preserve or drop
local recommendedTable = GeometryService:CalculateConstraintsToPreserve(mainPart, newParts, constraintOptions)
-- Preserve constraints/attachments based on recommended table
for _, item in pairs(recommendedTable) do
if item.Attachment then
item.Attachment.Parent = item.AttachmentParent
if item.Constraint then
item.Constraint.Parent = item.ConstraintParent
end
elseif item.NoCollisionConstraint then
local newNoCollision = Instance.new("NoCollisionConstraint")
newNoCollision.Part0 = item.NoCollisionPart0
newNoCollision.Part1 = item.NoCollisionPart1
newNoCollision.Parent = item.NoCollisionParent
elseif item.WeldConstraint then
local newWeldConstraint = Instance.new("WeldConstraint")
newWeldConstraint.Part0 = item.WeldConstraintPart0
newWeldConstraint.Part1 = item.WeldConstraintPart1
newWeldConstraint.Parent = item.WeldConstraintParent
end
end
-- Destroy original parts
mainPart.Parent = nil
mainPart:Destroy()
for _, otherPart in pairs(otherParts) do
otherPart.Parent = nil
otherPart:Destroy()
end
end
IntersectAsync
Erstellt eine oder mehrere PartOperations aus der überlappenden Geometrie des Hauptteils und anderer Teile in dem angegebenen Array.Nur primitive Parts und PartOperations werden unterstützt, nicht Terrain oder MeshParts.Ähnlich wie bei Clone() , haben die zurückgegebenen Teile keine festgelegte Parent .
Die folgenden Eigenschaften aus dem Hauptteil ( part ) werden auf das daraus resultierende PartOperations angewendet:
Im folgenden Bildvergleich wird IntersectAsync() mit dem violetten Block und einem Array, das den blauen Blöckeenthält, aufgerufen.Die daraus resultierende PartOperation löst sich in eine Form der überlappenden Geometrie beider Teile auf.

<figcaption>Getrennte Teile</figcaption>

<figcaption>Ergebnis <code>Klasse.PartOperation</code></figcaption>
Anmerkungen
Im Vergleich zu BasePart:IntersectAsync() unterscheidet sich diese Methode wie folgt:
- Die Eingabeteile müssen nicht der Szene zugewiesen werden, was Hintergrundoperationen ermöglicht.
- Wenn die Option SplitApart auf true (Standard) gesetzt ist, wird jeder einzelne Körper in seinem eigenen PartOperation zurückgegeben.
- Jede der zurückgegebenen Teile befindet sich im Koordinatenraum des Hauptteils.Das bedeutet, dass das (0, 0, 0) eines zurückgegebenen Teils nicht unbedingt im Zentrum seines Körpers ist.
- Es ist möglich, diese Methode auf dem Client aufzurufen, aber mit einigen Einschränkungen.Zuerst muss es derzeit mit Objekten erstellt werden, die auf dem Client erstellt wurden.Zweitens gibt es keine Replikation von der Client zum Server verfügbar.
Die ursprünglichen Teile bleiben intakt, nach einer erfolgreichen Operation.In den meisten Fällen solltest du die zurückgegebenen PartOperations an den gleichen Ort wie den Hauptteil übermitteln, dann Destroy() alle ursprünglichen Teile.
Standardmäßig werden die Gesichtsfarben der resultierenden von der Eigenschaft der ursprünglichen Teile ausgeliehen, obwohl du ihre Eigenschaft aktivieren kannst, um sie auf eine bestimmte Farbe zu ändern.
Wenn eine Intersektionsoperation zu mehr als 20.000 Dreieck resultieren würde, werden sie auf 20.000 vereinfacht.Dies führt zu einem Fehler mit Code -14.
Wenn der Hauptteil während der Berechnung der Operation bewegt wird, kannst du die daraus resultierenden Teile auf den aktualisierten CFrame des Hauptteils einstellen, da die zurückgegebenen Teile im selben Koordinatenraum wie der Hauptteil sind.
Wenn Sie diese Methode mit einem PartOperation als Hauptteil verwenden, können Sie die Geometrie eines anderen PartOperation über SubstituteGeometry() ersetzen, wodurch es einfacher wird, die Geometrie der Operation zu nutzen, aber Eigenschaften, Attribute, Tags und Kinder des Hauptteils wie Attachments , Constraints , ParticleEmitters , leichte Objekte und Aufkleber zu erhalten.Dieser Ansatz umgeht auch das mögliche "Flimmern", das bestehende Original PartOperation durch ein anderes zu ersetzen.
Parameter
Haupt Part oder PartOperation zum Betreiben.
Array von Teilen, die sich mit dem Hauptteil überlappen.
Optionentabelle mit allen Steuerelementen für die Methode:
- CollisionFidelity — Der Wert von CollisionFidelity in den daraus resultierenden Teilen.
- RenderFidelity — Der Wert von RenderFidelity in den daraus resultierenden Teilen.
- FluidFidelity — Der Wert von FluidFidelity in den daraus resultierenden Teilen.
- SplitApart — Boolean kontrolliert, ob die Objekte alle zusammen oder richtig getrennt gehalten werden sollen. Standard ist true (geteilt).
Rückgaben
Eins oder mehr PartOperations aus der überlappenden Geometrie des Hauptteils (part ) und der anderen Teile.
Code-Beispiele
This example intersects the geometry of mainPart and the parts in the otherParts array, splitting them into distinct PartOperations. Then it destroys the original parts involved in the operation.
local GeometryService = game:GetService("GeometryService")
local mainPart = workspace.PurpleBlock
local otherParts = { workspace.BlueBlock }
local options = {
CollisionFidelity = Enum.CollisionFidelity.Default,
RenderFidelity = Enum.RenderFidelity.Automatic,
SplitApart = true,
}
-- Perform intersect operation in pcall() since it's asyncronous
local success, newParts = pcall(function()
return GeometryService:IntersectAsync(mainPart, otherParts, options)
end)
if success and newParts then
-- Loop through resulting parts to reparent/reposition
for _, newPart in pairs(newParts) do
newPart.Parent = mainPart.Parent
newPart.CFrame = mainPart.CFrame
newPart.Anchored = mainPart.Anchored
end
-- Destroy original parts
mainPart.Parent = nil
mainPart:Destroy()
for _, otherPart in pairs(otherParts) do
otherPart.Parent = nil
otherPart:Destroy()
end
end
SubtractAsync
Erstellt eine oder mehrere PartOperations aus dem Hauptteil minus die Geometrie, die von anderen Teilen in dem angegebenen Array besetzt wird.Nur primitive Parts und PartOperations werden unterstützt, nicht Terrain oder MeshParts.Ähnlich wie bei Clone() , haben die zurückgegebenen Teile keine festgelegte Parent .
Die folgenden Eigenschaften aus dem Hauptteil ( part ) werden auf das daraus resultierende PartOperations angewendet:
Im folgenden Bildvergleich wird SubtractAsync() mit dem blauen Zylinder und einem Array, das den violetten Blöckeenthält, aufgerufen.Die daraus resultierende PartOperation Form löst sich in eine Form auf, die die Geometrie des Blöckevon der des Zylinders auslässt.

<figcaption>Getrennte Teile</figcaption>

<figcaption>Ergebnis <code>Klasse.PartOperation</code></figcaption>
Anmerkungen
Im Vergleich zu BasePart:SubtractAsync() unterscheidet sich diese Methode wie folgt:
- Die Eingabeteile müssen nicht der Szene zugewiesen werden, was Hintergrundoperationen ermöglicht.
- Wenn die Option SplitApart auf true (Standard) gesetzt ist, wird jeder einzelne Körper in seinem eigenen PartOperation zurückgegeben.
- Jede der zurückgegebenen Teile befindet sich im Koordinatenraum des Hauptteils.Das bedeutet, dass das (0, 0, 0) eines zurückgegebenen Teils nicht unbedingt im Zentrum seines Körpers ist.
- Es ist möglich, diese Methode auf dem Client aufzurufen, aber mit einigen Einschränkungen.Zuerst muss es derzeit mit Objekten erstellt werden, die auf dem Client erstellt wurden.Zweitens gibt es keine Replikation von der Client zum Server verfügbar.
Die ursprünglichen Teile bleiben intakt, nach einer erfolgreichen Operation.In den meisten Fällen solltest du die zurückgegebenen PartOperations an den gleichen Ort wie den Hauptteil übermitteln, dann Destroy() alle ursprünglichen Teile.
Standardmäßig werden die Gesichtsfarben der resultierenden von der Eigenschaft der ursprünglichen Teile ausgeliehen, obwohl du ihre Eigenschaft aktivieren kannst, um sie auf eine bestimmte Farbe zu ändern.
Wenn eine Subtraktionsoperation zu irgendeiner PartOperations mit mehr als 20.000 Dreiecksergebnissen führen würde, werden sie auf 20.000 reduziert.Dies führt zu einem Fehler mit Code -14.
Wenn der Hauptteil während der Berechnung der Operation bewegt wird, kannst du die daraus resultierenden Teile auf den aktualisierten CFrame des Hauptteils einstellen, da die zurückgegebenen Teile im selben Koordinatenraum wie der Hauptteil sind.
Wenn Sie diese Methode mit einem PartOperation als Hauptteil verwenden, können Sie die Geometrie eines anderen PartOperation über SubstituteGeometry() ersetzen, wodurch es einfacher wird, die Geometrie der Operation zu nutzen, aber Eigenschaften, Attribute, Tags und Kinder des Hauptteils wie Attachments , Constraints , ParticleEmitters , leichte Objekte und Aufkleber zu erhalten.Dieser Ansatz umgeht auch das mögliche "Flimmern", das bestehende Original PartOperation durch ein anderes zu ersetzen.
Parameter
Haupt Part oder PartOperation zum Betreiben.
Array von Teilen, die vom Hauptteil abgezogen werden.
Optionentabelle mit allen Steuerelementen für die Methode:
- CollisionFidelity — Der Wert von CollisionFidelity in den daraus resultierenden Teilen.
- RenderFidelity — Der Wert von RenderFidelity in den daraus resultierenden Teilen.
- FluidFidelity — Der Wert von FluidFidelity in den daraus resultierenden Teilen.
- SplitApart — Boolean kontrolliert, ob die Objekte alle zusammen oder richtig getrennt gehalten werden sollen. Standard ist true (geteilt).
Rückgaben
Eins oder mehr PartOperations aus der Geometrie des Hauptteils ( part ) minus die Geometrie, die von den anderen Teilen beansprucht wird.
Code-Beispiele
This example subtracts the geometry of the parts in the otherParts array from mainPart, splitting the results into distinct PartOperations. Then it destroys the original parts involved in the operation.
local GeometryService = game:GetService("GeometryService")
local mainPart = workspace.BlueCylinder
local otherParts = { workspace.PurpleBlock }
local options = {
CollisionFidelity = Enum.CollisionFidelity.Default,
RenderFidelity = Enum.RenderFidelity.Automatic,
SplitApart = true,
}
-- Perform subtract operation in pcall() since it's asyncronous
local success, newParts = pcall(function()
return GeometryService:SubtractAsync(mainPart, otherParts, options)
end)
if success and newParts then
-- Loop through resulting parts to reparent/reposition
for _, newPart in pairs(newParts) do
newPart.Parent = mainPart.Parent
newPart.CFrame = mainPart.CFrame
newPart.Anchored = mainPart.Anchored
end
-- Destroy original parts
mainPart.Parent = nil
mainPart:Destroy()
for _, otherPart in pairs(otherParts) do
otherPart.Parent = nil
otherPart:Destroy()
end
end
UnionAsync
Erstellt eine oder mehrere PartOperations aus dem Hauptteil plus die Geometrie, die von anderen Teilen in dem angegebenen Array besetzt wird.Nur primitive Parts und PartOperations werden unterstützt, nicht Terrain oder MeshParts.Ähnlich wie bei Clone() , haben die zurückgegebenen Teile keine festgelegte Parent .
Die folgenden Eigenschaften aus dem Hauptteil ( part ) werden auf das daraus resultierende PartOperations angewendet:
Im folgenden Bildvergleich wird UnionAsync() mit dem blauen Block und einem Array, das den violetten Zylinder enthält, aufgerufen.Die daraus resultierende PartOperation löst sich in eine Form der kombinierten Geometrie beider Teile auf.

<figcaption>Getrennte Teile</figcaption>

<figcaption>Ergebnis <code>Klasse.PartOperation</code></figcaption>
Anmerkungen
Im Vergleich zu BasePart:UnionAsync() unterscheidet sich diese Methode wie folgt:
- Die Eingabeteile müssen nicht der Szene zugewiesen werden, was Hintergrundoperationen ermöglicht.
- Wenn die Option SplitApart auf true (Standard) gesetzt ist, wird jeder einzelne Körper in seinem eigenen PartOperation zurückgegeben.
- Jede der zurückgegebenen Teile befindet sich im Koordinatenraum des Hauptteils.Das bedeutet, dass das (0, 0, 0) eines zurückgegebenen Teils nicht unbedingt im Zentrum seines Körpers ist.
- Es ist möglich, diese Methode auf dem Client aufzurufen, aber mit einigen Einschränkungen.Zuerst muss es derzeit mit Objekten erstellt werden, die auf dem Client erstellt wurden.Zweitens gibt es keine Replikation von der Client zum Server verfügbar.
Die ursprünglichen Teile bleiben intakt, nach einer erfolgreichen Operation.In den meisten Fällen solltest du die zurückgegebenen PartOperations an den gleichen Ort wie den Hauptteil übermitteln, dann Destroy() alle ursprünglichen Teile.
Standardmäßig werden die Farben der daraus resultierenden PartOperationsFarben aus der ColorEigenschaft der ursprünglichen Teile entnommen, obwohl du ihre UsePartColorEigenschaft aktivieren kannst, um sie in eine bestimmte Farbe zu ändern.
Wenn eine Union-Operation zu irgendeiner PartOperations mit mehr als 20.000 Dreieck führt, werden sie auf 20.000 vereinfacht.Dies führt zu einem Fehler mit Code -14.
Wenn der Hauptteil während der Berechnung der Operation bewegt wird, kannst du die daraus resultierenden Teile auf den aktualisierten CFrame des Hauptteils einstellen, da die zurückgegebenen Teile im selben Koordinatenraum wie der Hauptteil sind.
Wenn Sie diese Methode mit einem PartOperation als Hauptteil verwenden, können Sie die Geometrie eines anderen PartOperation über SubstituteGeometry() ersetzen, wodurch es einfacher wird, die Geometrie der Operation zu nutzen, aber Eigenschaften, Attribute, Tags und Kinder des Hauptteils wie Attachments , Constraints , ParticleEmitters , leichte Objekte und Aufkleber zu erhalten.Dieser Ansatz umgeht auch das mögliche "Flimmern", das bestehende Original PartOperation durch ein anderes zu ersetzen.
Parameter
Haupt Part oder PartOperation zum Betreiben.
Array von Teilen, die mit dem Hauptteil verschmelzen sollen.
Optionentabelle mit allen Steuerelementen für die Methode:
- CollisionFidelity — Der Wert von CollisionFidelity in den daraus resultierenden Teilen.
- RenderFidelity — Der Wert von RenderFidelity in den daraus resultierenden Teilen.
- FluidFidelity — Der Wert von FluidFidelity in den daraus resultierenden Teilen.
- SplitApart — Boolean kontrolliert, ob die Objekte alle zusammen oder richtig getrennt gehalten werden sollen. Standard ist true (geteilt).
Rückgaben
Eins oder mehr PartOperations aus der Geometrie des Hauptteils ( part ) plus die Geometrie, die von den anderen Teilen beansprucht wird.
Code-Beispiele
This example combines the geometry of mainPart and the parts in the otherParts array, then it destroys the original parts involved in the operation.
local GeometryService = game:GetService("GeometryService")
local mainPart = workspace.BlueBlock
local otherParts = { workspace.PurpleCylinder }
local options = {
CollisionFidelity = Enum.CollisionFidelity.Default,
RenderFidelity = Enum.RenderFidelity.Automatic,
SplitApart = false,
}
-- Perform union operation in pcall() since it's asyncronous
local success, newParts = pcall(function()
return GeometryService:UnionAsync(mainPart, otherParts, options)
end)
if success and newParts then
-- Loop through resulting parts to reparent/reposition
for _, newPart in pairs(newParts) do
newPart.Parent = mainPart.Parent
newPart.CFrame = mainPart.CFrame
newPart.Anchored = mainPart.Anchored
end
-- Destroy original parts
mainPart.Parent = nil
mainPart:Destroy()
for _, otherPart in pairs(otherParts) do
otherPart.Parent = nil
otherPart:Destroy()
end
end