GeometryService

Pokaż przestarzałe

*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.

Brak możliwości tworzenia
Usługa

Usługa zawierająca geometryczne operacje niezwiązane bezpośrednio z określonymi obiektami.

Podsumowanie

Metody

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

source: Instance

Oryginalny obiekt, na który wykonano operację solidnego modelowania, na przykład part w UnionAsync().

destination: Array
options: Dictionary

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.
Wartość domyślna: "nil"

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

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

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

Przykłady kodu

Preserve Constraints

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

Wynik

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 :

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.

Two block parts overlapping

<figcaption>Odrębne części</figcaption>
Parts intersected into a new solid model

<figcaption>Klasa <code>Class.PartOperation</code> wynika z wyniku</figcaption>

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

part: Instance

Główny Part lub PartOperation do użycia.

parts: Array

Materiały zapisu w kłębek z główną częścią.

options: Dictionary

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).
Wartość domyślna: "nil"

Zwroty

Jeden lub więcej PartOperations z wymierzającym geometrią głównej części ( part ) i innych części.

Przykłady kodu

GeometryService:IntersectAsync()

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

Wynik

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 :

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.

Longer block overlapping a cylinder

<figcaption>Odrębne części</figcaption>
Block part subtracted from cylinder

<figcaption>Klasa <code>Class.PartOperation</code> wynika z wyniku</figcaption>

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

part: Instance

Główny Part lub PartOperation do użycia.

parts: Array

Materiały do odebrania z głównej części.

options: Dictionary

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).
Wartość domyślna: "nil"

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

GeometryService:SubtractAsync()

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

Wynik

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 :

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.

Block and cylinder parts overlapping

<figcaption>Odrębne części</figcaption>
Parts joined together into a single solid union

<figcaption>Klasa <code>Class.PartOperation</code> wynika z wyniku</figcaption>

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

part: Instance

Główny Part lub PartOperation do użycia.

parts: Array

Materiały do połączenia z główną częścią.

options: Dictionary

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).
Wartość domyślna: "nil"

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

GeometryService:UnionAsync()

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

Zdarzenia