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 geometryczne operacje niezwiązane bezpośrednio z określonymi obiektami.
Podsumowanie
Metody
Zwraca tabelę Constraints i Attachments, które możesz zachować, wraz z ich odpowiednimi rodzicami.
Tworzy jeden lub więcej PartOperations z geometrii łączącej jedną część i inne części.
Tworzy jeden lub więcej PartOperations z jednej części minus geometrii zajętej 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óre możesz zachować, wraz z ich rodzicami. Iterowanie nad tą tabelą pozwala ci zdecydować, czy chcesz zachować zalecane ograniczenia i załączniki do ich rodziców.
Uwaga, że tabela options może zawierać wartość tolerance i/lub wartość WeldConstraintPreserve ( 2>Enumerate.WeldConstraintPreserve2> ).
- tolerance – Dystans tolerancji, jeśli chodzi o Attachment zachowanie, między przywiązaniem a najbliższym punktem na powierzchni oryginalnej części względem najbliższego punktu na powierzchni wynikającej z modelowania solidnego operacji, jeśli wyn
- weldConstraintPreserve – A Enum.WeldConstraintPreserve value describing how WeldConstraints are preserved in the resulting recommendation table.
Parametry
Oryginalny obiekt, na który wykonano operację solidnego modelowania, na przykład part w UnionAsync().
Tabela opcji dla metody:
- tolerance – Dystans tolerancji, jeśli chodzi o Attachment zachowanie, między przywiązaniem a najbliższym punktem na powierzchni oryginalnej części względem najbliższego punktu na powierzchni wynikającej z modelowania solidnego operacji, jeśli wyn
- weldConstraintPreserve – A Enum.WeldConstraintPreserve value describing how WeldConstraints are preserved in the resulting recommendation table.
Zwroty
Tabela zawierająca informacje dla ogólnego przypadku Constraints , NoCollisionConstraints i WeldConstraints . W przypadkach, w których należy upuścić 1> Class.Attachment1> lub 4> Class.Constraint
Dla ogólnego przypadku Constraints takich jak HingeConstraint :
<tbody><tr><td>Załącznik</td><td><code>Klasa. przyczepka</code></td></tr><tr><td>Ograniczenie</td><td><code>Klasa ograniczenia</code></td></tr><tr><td>Opiekun załączników</td><td><code>Class.BasePart</code> lub <code>nil</code></td></tr><tr><td>OgraniczonyPodmiot</td><td><code>Class.BasePart</code> lub <code>nil</code></td></tr></tbody>
Klucz | Typ |
---|
Dla WeldConstraints :
<tbody><tr><td>Ograniczenie spawalnicze</td><td><code>Klasa .WeldConstraint</code></td></tr><tr><td>Parent wiertownik</td><td><code>Class.BasePart</code> lub <code>nil</code></td></tr><tr><td>Weld約束零件0</td><td><code>Klasa.BasePart</code></td></tr><tr><td>Ograniczony poziom 1</td><td><code>Klasa.BasePart</code></td></tr></tbody>
Klucz | Typ |
---|
Dla NoCollisionConstraints :
<tbody><tr><td>NieKolizja</td><td><code>Klasa.NoCollisionConstraint</code></td></tr><tr><td>NieKolizjaZakontraktowana</td><td><code>Class.BasePart</code> lub <code>nil</code></td></tr><tr><td>Niezderstalizowanie części0</td><td><code>Klasa.BasePart</code></td></tr><tr><td>Niezderstalizowanie części 1</td><td><code>Klasa.BasePart</code></td></tr></tbody>
Klucz | Typ |
---|
Przykłady kodu
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
}
-- 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.Constraint.Parent = item.ConstraintParent
item.Attachment.Parent = item.AttachmentParent
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 intersektującej geometri głównej części i innych części w danej matrycy. Tylko primitive Parts
Poniższe właściwości z głównej części ( part ) są zastosowane do wynikającego PartOperations :
- Class.BasePart.Color|Color , Material , MaterialVariant , 0> Class.BasePart.Reflectance|Reflectance0> , Color3>
- Class.BasePart.Anchored|Anchored , Density , Elasticity , 0> Class.BasePart.ElasticityWeight|Elasticity0> , 3> Class.Base
W następnym porównaniu obrazu IntersectAsync() jest nazywany używając fioletowego bloku i matryki zawierającej niebieski blok. W rezultacie PartOperation rozwiązuje się w kształcie geometrii interesującej obu części.
Notatki
W porównaniu do BasePart:IntersectAsync() , ta metoda różni się następująco:
- Wejściowe części nie muszą być powiązane z sceną, umożliwiając operacje tła.
- Gdy opcja SplitApart ustawiona na true (domyślnie), każdy odrębny organizm zostanie zwrócony w własnej PartOperation .
- Każda z zwróconych części znajduje się w przestrzeni koordynatowej głównej części. Oznacza to, że (0,0,0) każdej z zwróconych części nie musi być w centrum jego ciało.
- Możliwe jest wywołanie tej metody na klientze, ale z pewnymi ograniczeniami. Po pierwsze, musi to być zrobione z obiektami utworzonymi na klientie. Po drugie, nie jest dostępne żadne replikowanie z klienta na serwer.
Pierwotne części pozostaną nieuszkodzone po udanym operacie. W większości przypadków powinieneś zrodziczyć zwrócone PartOperations w tym samym miejscu co główna część, a następnie Destroy() wszystkie oryginalne części.
Domyślnie kolory twarzy wynikającego PartOperations są pożyczone z właściwości Color części oryginalnych, choć możesz włączyć ich właściwość UsePartColor, aby zmienić je na określony kolor.
Jeśli operacja intersekcji wyniosłaby jakiekolwiek PartOperations z więcej niż 20 000 trójkątów, zostaną one uproszczone do 20 000. To spowoduje błąd z kodem -14 .
Jeśli główna część się porusza podczas obliczania operacji, możesz ustawić wynikające części na aktualizowaną CFrame część głównej części, ponieważ wynikające części znajdują się w tym samym przestrzeń k坐标owej co główna część.
Jeśli używasz tego metody z PartOperation jako głównej części,
Parametry
Główny Part lub PartOperation do użycia.
Materiały zapisu w kłębek z główną częścią.
Tabela opcji zawierająca wszystkie sterowanie dla metody:
- CollisionFidelity – wartość CollisionFidelity w wynikających częściach.
- RenderFidelity – wartość RenderFidelity w wynikających częściach.
- FluidFidelity – wartość FluidFidelity w wynikających częściach.
- SplitApart – steruje prawdą lub błędem, czy obiekty powinny być wszystkie zachowane razem lub prawidłowo podzielone. Domyślnie jest true (podzielenie).
Zwroty
Jeden lub więcej PartOperations z wymierzającym geometrią głównej części ( part ) i innych części.
Przykłady kodu
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 jeden lub więcej PartOperations z głównej części minus geometrii zajętej przez inne części w podanym maszynie. Tylko primitive Parts i <
Poniższe właściwości z głównej części ( part ) są zastosowane do wynikającego PartOperations :
- Class.BasePart.Color|Color , Material , MaterialVariant , 0> Class.BasePart.Reflectance|Reflectance0> , Color3>
- Class.BasePart.Anchored|Anchored , Density , Elasticity , 0> Class.BasePart.ElasticityWeight|Elasticity0> , 3> Class.Base
W następującym porównaniu obrazu, SubtractAsync() jest nazywany używającym niebieskiego cylindra i matryki zawierającej fioletowy blok. W rezultacie PartOperation rozwiązuje się w kształcie, który odrzuca geometrię bloku z tej cylindru.
Notatki
W porównaniu do BasePart:SubtractAsync() , ta metoda różni się następująco:
- Wejściowe części nie muszą być powiązane z sceną, umożliwiając operacje tła.
- Gdy opcja SplitApart ustawiona na true (domyślnie), każdy odrębny organizm zostanie zwrócony w własnej PartOperation .
- Każda z zwróconych części znajduje się w przestrzeni koordynatowej głównej części. Oznacza to, że (0,0,0) każdej z zwróconych części nie musi być w centrum jego ciało.
- Możliwe jest wywołanie tej metody na klientze, ale z pewnymi ograniczeniami. Po pierwsze, musi to być zrobione z obiektami utworzonymi na klientie. Po drugie, nie jest dostępne żadne replikowanie z klienta na serwer.
Pierwotne części pozostaną nieuszkodzone po udanym operacie. W większości przypadków powinieneś zrodziczyć zwrócone PartOperations w tym samym miejscu co główna część, a następnie Destroy() wszystkie oryginalne części.
Domyślnie kolory twarzy wynikającego PartOperations są pożyczone z właściwości Color części oryginalnych, choć możesz włączyć ich właściwość UsePartColor, aby zmienić je na określony kolor.
Jeśli operacja odejmowania wyniosła wynik więcej niż 20,000 trójkąty, zostaną one uproszczone do 20,000. Będzie to wynik błędu z kodem PartOperations.
Jeśli główna część się porusza podczas obliczania operacji, możesz ustawić wynikające części na aktualizowaną CFrame część głównej części, ponieważ wynikające części znajdują się w tym samym przestrzeń k坐标owej co główna część.
Jeśli używasz tego metody z PartOperation jako głównej części,
Parametry
Główny Part lub PartOperation do użycia.
Materiały do odebrania z głównej części.
Tabela opcji zawierająca wszystkie sterowanie dla metody:
- CollisionFidelity – wartość CollisionFidelity w wynikających częściach.
- RenderFidelity – wartość RenderFidelity w wynikających częściach.
- FluidFidelity – wartość FluidFidelity w wynikających częściach.
- SplitApart – steruje prawdą lub błędem, czy obiekty powinny być wszystkie zachowane razem lub prawidłowo podzielone. Domyślnie jest true (podzielenie).
Zwroty
Jeden lub więcej PartOperations z geometri głównej części (part), z wyjątkiem geometri zajętej przez pozostałe części.
Przykłady kodu
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 jeden lub więcej PartOperations z głównej części plus geometrię zajętą przez inne części w podanej matrycy. Tylko primitive Parts i Class
Poniższe właściwości z głównej części ( part ) są zastosowane do wynikającego PartOperations :
- Class.BasePart.Color|Color , Material , MaterialVariant , 0> Class.BasePart.Reflectance|Reflectance0> , Color3>
- Class.BasePart.Anchored|Anchored , Density , Elasticity , 0> Class.BasePart.ElasticityWeight|Elasticity0> , 3> Class.Base
W następnym porównaniu obrazu UnionAsync() jest nazywany używającym niebieskiego bloku i matryki zawierającej purpurowy cylinder. W rezultacie PartOperation rozwiązuje się w kształcie połączonej geometri obu części.
Notatki
W porównaniu do BasePart:UnionAsync() , ta metoda różni się następująco:
- Wejściowe części nie muszą być powiązane z sceną, umożliwiając operacje tła.
- Gdy opcja SplitApart ustawiona na true (domyślnie), każdy odrębny organizm zostanie zwrócony w własnej PartOperation .
- Każda z zwróconych części znajduje się w przestrzeni koordynatowej głównej części. Oznacza to, że (0,0,0) każdej z zwróconych części nie musi być w centrum jego ciało.
- Możliwe jest wywołanie tej metody na klientze, ale z pewnymi ograniczeniami. Po pierwsze, musi to być zrobione z obiektami utworzonymi na klientie. Po drugie, nie jest dostępne żadne replikowanie z klienta na serwer.
Pierwotne części pozostaną nieuszkodzone po udanym operacie. W większości przypadków powinieneś zrodziczyć zwrócone PartOperations w tym samym miejscu co główna część, a następnie Destroy() wszystkie oryginalne części.
Domyślnie kolory wynikającego PartOperations są pożyczone z właściwości Color pierwotnych części, choć możesz włączyć ich właściwość UsePartColor, aby zmienić je na określony kolor.
Jeśli operacja unii wyniosłaby więcej niż 20 000 trójkąty, zostaną one uproszczone do 20 000. To spowoduje błąd z kodem PartOperations.
Jeśli główna część się porusza podczas obliczania operacji, możesz ustawić wynikające części na aktualizowaną CFrame część głównej części, ponieważ wynikające części znajdują się w tym samym przestrzeń k坐标owej co główna część.
Jeśli używasz tego metody z PartOperation jako głównej części,
Parametry
Główny Part lub PartOperation do użycia.
Materiały do połączenia z główną częścią.
Tabela opcji zawierająca wszystkie sterowanie dla metody:
- CollisionFidelity – wartość CollisionFidelity w wynikających częściach.
- RenderFidelity – wartość RenderFidelity w wynikających częściach.
- FluidFidelity – wartość FluidFidelity w wynikających częściach.
- SplitApart – steruje prawdą lub błędem, czy obiekty powinny być wszystkie zachowane razem lub prawidłowo podzielone. Domyślnie jest true (podzielenie).
Zwroty
Jeden lub więcej PartOperations z geometri głównej części (part), plus geometria zajęta przez pozostałe części.
Przykłady kodu
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