GeometryService
*Ta zawartość została przetłumaczona przy użyciu narzędzi AI (w wersji beta) i może zawierać błędy. Aby wyświetlić tę stronę w języku angielskim, kliknij tutaj.
Usługa zawierająca operacje geometryczne nie związane bezpośrednio z konkretnymi obiektami.
Podsumowanie
Metody
Zwraca tabelę Constraints i Attachments, której możesz zdecydować się zachować, wraz z ich odpowiednimi rodzicami.
Tworzy jedną lub więcej PartOperations z geometrycznie pokrywającej się części i innych części.
Tworzy jedną lub więcej PartOperations z jednej części odejmując geometryię zajętą przez inne części.
Tworzy jedną lub więcej PartOperations z jednej części plus geometrię zajętą przez inne części.
Właściwości
Metody
CalculateConstraintsToPreserve
Zwraca tabelę Constraints i Attachments, której możesz zdecydować się zachować, wraz z ich odpowiednimi rodzicami.Iterowanie nad tą tabelą pozwala decydować, czy należy naprawić zalecane ograniczenia i załączniki dla ich odpowiednich rodziców.
Zauważ, że słownik options może zawierać obserwujeelementy:
- tolerance — Tolerancja odległości, w odniesieniu do Attachment konserwacji, między załącznikiem a najbliższym punktem na powierzchni oryginalnej części w stosunku do najbliższego punktu na powierzchni wynikowej części.Jeśli odległość wynikająca z operacji modelowania stałych jest większa niż ta wartość, Parent załączniki i ich powiązane ograniczenia będą nil w tabeli rekomendacji zwrotnej.
- weldConstraintPreserve — A Enum.WeldConstraintPreserve wartość enumeracyjna opisująca, w jaki sposób WeldConstraints są zachowane w rekomendowanej tabeli wynikowej.
- dropAttachmentsWithoutConstraints — Boolean z domyślnym true . Jeśli ustawiono false , Attachments te, które nie mają Constraints zostaną zachowane.
Parametry
Oryginalny obiekt, na którym wykonywano operację modelowania solidów, na przykład part w UnionAsync().
Słownik opcji dla metody:
- tolerance — Tolerancja odległości, w odniesieniu do Attachment konserwacji, między załącznikiem a najbliższym punktem na powierzchni oryginalnej części w stosunku do najbliższego punktu na powierzchni wynikowej części.Jeśli odległość wynikająca z operacji modelowania stałych jest większa niż ta wartość, Parent załączniki i ich powiązane ograniczenia będą nil w tabeli rekomendacji zwrotnej.
- weldConstraintPreserve — A Enum.WeldConstraintPreserve wartość enumeracyjna opisująca, w jaki sposób WeldConstraints są zachowane w rekomendowanej tabeli wynikowej.
- dropAttachmentsWithoutConstraints — Boolean z domyślnym true . Jeśli ustawiono false , Attachments te, które nie mają Constraints zostaną zachowane.
Zwroty
Tabela zawierająca informacje dla ogólnego przypadku Constraints, NoCollisionConstraints i WeldConstraints.W przypadkach, gdy należy usunąć Attachment lub Constraint, jego odpowiedni rodzic będzie nil.
Dla ogólnego przypadku Constraints takiego jak HingeConstraint :
<th>Typ</th></tr></thead><tbody><tr><td><code>Załącznik</code></td><td><code>Klasa.Attachment</code></td></tr><tr><td><code>Ograniczenie</code></td><td><code>Klasa.Ograniczenie</code> lub <code>nil</code></td></tr><tr><td><code>Rodzic dołącznika</code></td><td><code>Klasa.BasePart</code> lub <code>nil</code></td></tr><tr><td><code>OgraniczenieParent</code></td><td><code>Klasa.BasePart</code> lub <code>nil</code></td></tr></tbody>
Klucz |
---|
Dla WeldConstraints :
<th>Typ</th></tr></thead><tbody><tr><td><code>Ograniczenie spawania</code></td><td><code>Klasa.WeldConstraint</code></td></tr><tr><td><code>Przyłączenie ograniczenia rodzica</code></td><td><code>Klasa.BasePart</code> lub <code>nil</code></td></tr><tr><td><code>Część ograniczenia spawania0</code></td><td><code>Klasa.BasePart</code></td></tr><tr><td><code>Wiązanie ograniczenia części1</code></td><td><code>Klasa.BasePart</code></td></tr></tbody>
Klucz |
---|
Dla NoCollisionConstraints :
<th>Typ</th></tr></thead><tbody><tr><td><code>Niezawodność kolizji</code></td><td><code>Klasa.NoCollisionConstraint</code></td></tr><tr><td><code>Niezakłócający się ogranicznik rodzica</code></td><td><code>Klasa.BasePart</code> lub <code>nil</code></td></tr><tr><td><code>Niezawodna część ograniczenia kolizji0</code></td><td><code>Klasa.BasePart</code></td></tr><tr><td><code>Niezderzalna część ograniczenia kolizji1</code></td><td><code>Klasa.BasePart</code></td></tr></tbody>
Klucz |
---|
Przykłady kodu
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
Tworzy jedną lub więcej PartOperations z pokrywającej się geometrii głównej części i innych części w danym obszarze.Wspierane są tylko prymitywne Parts i PartOperations oraz Terrain lub MeshParts.Podobnie do Clone() , zwrocone części nie mają ustawionego Parent .
Następujące właściwości z głównej części ( part) są zastosowane do wynikowego PartOperations
W poniższej porównaniu obrazów IntersectAsync() jest nazywany za pomocą fioletowego bloku i matrycy zawierającej niebieski blok.Powstały PartOperation rozwiązuje się w kształcie geometrycznej intersekcji obu części.

<figcaption>Oddzielne części</figcaption>

<figcaption>Rezultująca klasa <code>Class.PartOperation</code></figcaption>
Notatki
W porównaniu do BasePart:IntersectAsync() metoda ta różni się następująco:
- Części wejściowe nie muszą być powiązane z sceną, umożliwiając wykonywanie operacji w tle.
- Gdy opcja SplitApart jest ustawiona na true (domyślnie), każde odrębne ciało zostanie zwrócone w jego własnym PartOperation .
- Każda z powracających części znajduje się w przestrzeni współrzędnej głównej części.Oznacza to, że (0, 0, 0) każdej zwróconej części nie musi być koniecznie w centrum jej ciało.
- Można wezwać tę metodę na klientzie, ale z pewnymi ograniczeniami.Najpierw musi to być zrobione z obiektami stworzonymi na klientzie.Po drugie, nie ma dostępnej replikacji od klienta do serwera.
Oryginalne części pozostają nienaruszone po udanej operacji.W większości przypadków powinieneś przypisać zwrócone PartOperations do tego samego miejsca co główna część, a następnie Destroy() wszystkie oryginalne części.
Domyślnie kolory twarzy w wynikowych PartOperations są wypożyczane z właściwości Color oryginalnych części, choć możesz włączyć ich właściwość UsePartColor, aby zmienić je na konkretny kolor.
Jeśli operacja przecięcia doprowadzi do jakiegokolwiek PartOperations z więcej niż 20,000 trójkątów, zostaną one uproszone do 20,000.Spowoduje to błąd z kodem -14.
Jeśli główna część się porusza podczas obliczania operacji, możesz ustawić wynikowe części do aktualizowanej CFrame części głównej, ponieważ zwrócone części są w tej samej przestrzeni współrzędnych co główna część.
Jeśli używasz tej metody z PartOperation jako główną częścią, możesz zastąpić geometrię innej PartOperation za pomocą SubstituteGeometry(), co ułatwia wykorzystanie geometrii operacji, ale zachowuje właściwości, atrybuty, tagi i dzieci głównej części, takie jak Attachments , Constraints , ParticleEmitters , lekkie obiekty i nadruki.Ta metoda unika również potencjalnego "flickera" całkowitego zastąpienia oryginalnego PartOperation innym.
Parametry
Główny Part lub PartOperation do obsługi.
Zbiór części, które mają się pokrywać z główną częścią.
Tabela opcji zawierająca wszystkie sterowania dla metody:
- CollisionFidelity — Wartość CollisionFidelity w wynikowych częściach.
- RenderFidelity — Wartość RenderFidelity w wynikowych częściach.
- FluidFidelity — Wartość FluidFidelity w wynikowych częściach.
- SplitApart — Boolean kontroluje, czy obiekty powinny być wszystkie trzymane razem lub właściwie rozdzielone. Domyślnie jest true (podzielone).
Zwroty
Jeden lub więcej PartOperations z pokrywającej się geometrii głównej części ( part ) i pozostałych części.
Przykłady kodu
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
Tworzy jedną lub więcej PartOperations z głównej części odejmując geometryię zajętą przez inne części w danym obszarze.Wspierane są tylko prymitywne Parts i PartOperations oraz Terrain lub MeshParts.Podobnie do Clone() , zwrocone części nie mają ustawionego Parent .
Następujące właściwości z głównej części ( part) są zastosowane do wynikowego PartOperations
W poniższej porównaniu obrazów SubtractAsync() jest nazywany za pomocą niebieskiego cylindra i matrycy zawierającej fioletowy blok.Powstały PartOperation rozwiązuje się w formie, która pomija geometrię bloku z geometrią cylindra.

<figcaption>Oddzielne części</figcaption>

<figcaption>Rezultująca klasa <code>Class.PartOperation</code></figcaption>
Notatki
W porównaniu do BasePart:SubtractAsync() metoda ta różni się następująco:
- Części wejściowe nie muszą być powiązane z sceną, umożliwiając wykonywanie operacji w tle.
- Gdy opcja SplitApart jest ustawiona na true (domyślnie), każde odrębne ciało zostanie zwrócone w jego własnym PartOperation .
- Każda z powracających części znajduje się w przestrzeni współrzędnej głównej części.Oznacza to, że (0, 0, 0) każdej zwróconej części nie musi być koniecznie w centrum jej ciało.
- Można wezwać tę metodę na klientzie, ale z pewnymi ograniczeniami.Najpierw musi to być zrobione z obiektami stworzonymi na klientzie.Po drugie, nie ma dostępnej replikacji od klienta do serwera.
Oryginalne części pozostają nienaruszone po udanej operacji.W większości przypadków powinieneś przypisać zwrócone PartOperations do tego samego miejsca co główna część, a następnie Destroy() wszystkie oryginalne części.
Domyślnie kolory twarzy w wynikowych PartOperations są wypożyczane z właściwości Color oryginalnych części, choć możesz włączyć ich właściwość UsePartColor, aby zmienić je na konkretny kolor.
Jeśli operacja odliczania da wynik z więcej niż 20 000 trójkątów, zostaną one uproszczone do 20 000.Spowoduje to błąd z kodem -14.
Jeśli główna część się porusza podczas obliczania operacji, możesz ustawić wynikowe części do aktualizowanej CFrame części głównej, ponieważ zwrócone części są w tej samej przestrzeni współrzędnych co główna część.
Jeśli używasz tej metody z PartOperation jako główną częścią, możesz zastąpić geometrię innej PartOperation za pomocą SubstituteGeometry(), co ułatwia wykorzystanie geometrii operacji, ale zachowuje właściwości, atrybuty, tagi i dzieci głównej części, takie jak Attachments , Constraints , ParticleEmitters , lekkie obiekty i nadruki.Ta metoda unika również potencjalnego "flickera" całkowitego zastąpienia oryginalnego PartOperation innym.
Parametry
Główny Part lub PartOperation do obsługi.
Zbiór części do odejmowania od głównej części.
Tabela opcji zawierająca wszystkie sterowania dla metody:
- CollisionFidelity — Wartość CollisionFidelity w wynikowych częściach.
- RenderFidelity — Wartość RenderFidelity w wynikowych częściach.
- FluidFidelity — Wartość FluidFidelity w wynikowych częściach.
- SplitApart — Boolean kontroluje, czy obiekty powinny być wszystkie trzymane razem lub właściwie rozdzielone. Domyślnie jest true (podzielone).
Zwroty
Jeden lub więcej PartOperations z geometrii głównej części ( part ) pomniejszony o geometrię zajętą przez pozostałe części.
Przykłady kodu
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
Tworzy jedną lub więcej PartOperations z głównej części plus geometrię zajętą przez inne części w danym array.Wspierane są tylko prymitywne Parts i PartOperations oraz Terrain lub MeshParts.Podobnie do Clone() , zwrocone części nie mają ustawionego Parent .
Następujące właściwości z głównej części ( part) są zastosowane do wynikowego PartOperations
W poniższej porównaniu obrazów UnionAsync() jest nazywany za pomocą niebieskiego bloku i matrycy zawierającej fioletowy cylinder.Powstały PartOperation rozwiązuje się w kształcie połączonej geometrii obu części.

<figcaption>Oddzielne części</figcaption>

<figcaption>Rezultująca klasa <code>Class.PartOperation</code></figcaption>
Notatki
W porównaniu do BasePart:UnionAsync() metoda ta różni się następująco:
- Części wejściowe nie muszą być powiązane z sceną, umożliwiając wykonywanie operacji w tle.
- Gdy opcja SplitApart jest ustawiona na true (domyślnie), każde odrębne ciało zostanie zwrócone w jego własnym PartOperation .
- Każda z powracających części znajduje się w przestrzeni współrzędnej głównej części.Oznacza to, że (0, 0, 0) każdej zwróconej części nie musi być koniecznie w centrum jej ciało.
- Można wezwać tę metodę na klientzie, ale z pewnymi ograniczeniami.Najpierw musi to być zrobione z obiektami stworzonymi na klientzie.Po drugie, nie ma dostępnej replikacji od klienta do serwera.
Oryginalne części pozostają nienaruszone po udanej operacji.W większości przypadków powinieneś przypisać zwrócone PartOperations do tego samego miejsca co główna część, a następnie Destroy() wszystkie oryginalne części.
Domyślnie kolory wynikowego PartOperations są wypożyczane z właściwości Color oryginalnych części, choć możesz włączyć ich właściwość UsePartColor, aby zmienić je na konkretny kolor.
Jeśli operacja związku doprowadzi do jakiegokolwiek PartOperations z więcej niż 20,000 trójkątów, zostaną one uproszczone do 20,000.Spowoduje to błąd z kodem -14.
Jeśli główna część się porusza podczas obliczania operacji, możesz ustawić wynikowe części do aktualizowanej CFrame części głównej, ponieważ zwrócone części są w tej samej przestrzeni współrzędnych co główna część.
Jeśli używasz tej metody z PartOperation jako główną częścią, możesz zastąpić geometrię innej PartOperation za pomocą SubstituteGeometry(), co ułatwia wykorzystanie geometrii operacji, ale zachowuje właściwości, atrybuty, tagi i dzieci głównej części, takie jak Attachments , Constraints , ParticleEmitters , lekkie obiekty i nadruki.Ta metoda unika również potencjalnego "flickera" całkowitego zastąpienia oryginalnego PartOperation innym.
Parametry
Główny Part lub PartOperation do obsługi.
Zbiór części do połączenia z główną częścią.
Tabela opcji zawierająca wszystkie sterowania dla metody:
- CollisionFidelity — Wartość CollisionFidelity w wynikowych częściach.
- RenderFidelity — Wartość RenderFidelity w wynikowych częściach.
- FluidFidelity — Wartość FluidFidelity w wynikowych częściach.
- SplitApart — Boolean kontroluje, czy obiekty powinny być wszystkie trzymane razem lub właściwie rozdzielone. Domyślnie jest true (podzielone).
Zwroty
Jeden lub więcej PartOperations z geometrii głównej części ( part ) plus geometria zajęta przez pozostałe części.
Przykłady kodu
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