GeometryService
*Ce contenu est traduit en utilisant l'IA (Beta) et peut contenir des erreurs. Pour consulter cette page en anglais, clique ici.
Service contenant des opérations géométriques non liées directement à des objets spécifiques.
Résumé
Méthodes
Retourne une table de Constraints et Attachments que vous pouvez choisir de préserver, ainsi que leurs parents respectifs.
Crée une ou plusieurs PartOperations de la géométrie intersectante d'une partie et d'autres parties.
Crée une ou plusieurs PartOperations de une partie moins la géométrie occupée par d'autres parties.
Crée une ou plusieurs PartOperations de une partie plus la géométrie occupée par d'autres parties.
Propriétés
Méthodes
CalculateConstraintsToPreserve
Retourne une table de Constraints et Attachments que vous pouvez choisir de préserver, ainsi que leurs parents respectifs.L'itération sur cette table vous permet de décider si vous voulez réparer les contraintes et les pièces jointes recommandées à leurs parents respectifs.
Notez que le dictionnaire options peut contenir ce qui suivre:
- tolerance — La tolérance de distance, en matière de Attachment préservation, entre l'attache et le point le plus proche sur la surface de la pièce originale versus le point le plus proche sur la surface de la pièce résultante.Si la distance résultante après l'opération de modélisation solide est supérieure à cette valeur, les Parent des annexes et de leurs contraintes associées seront nil dans la table de recommandation retournée.
- weldConstraintPreserve — Un valeur d'enumérotation Enum.WeldConstraintPreserve décrivant comment WeldConstraints sont préservés dans la table de recommandation résultante.
- dropAttachmentsWithoutConstraints — Boolean avec la valeur par défaut de true . Si vous le définissez sur false , Attachments ceux qui n'ont pas de Constraints seront préservés.
Paramètres
Un objet original sur lequel l'opération de modélisation solide a été effectuée, par exemple part dans UnionAsync().
Dictionnaire d'options pour la méthode :
- tolerance — La tolérance de distance, en matière de Attachment préservation, entre l'attache et le point le plus proche sur la surface de la pièce originale versus le point le plus proche sur la surface de la pièce résultante.Si la distance résultante après l'opération de modélisation solide est supérieure à cette valeur, les Parent des annexes et de leurs contraintes associées seront nil dans la table de recommandation retournée.
- weldConstraintPreserve — Un valeur d'enumérotation Enum.WeldConstraintPreserve décrivant comment WeldConstraints sont préservés dans la table de recommandation résultante.
- dropAttachmentsWithoutConstraints — Boolean avec la valeur par défaut de true . Si vous le définissez sur false , Attachments ceux qui n'ont pas de Constraints seront préservés.
Retours
Table contenant des informations pour le cas général Constraints, NoCollisionConstraints et WeldConstraints.Dans les cas où un Attachment ou Constraint devrait être supprimé, son parent respectif sera nil .
Pour le cas général Constraints comme HingeConstraint :
<th>Type</th></tr></thead><tbody><tr><td><code>Pièce jointe</code></td><td><code>Class.Attachment</code></td></tr><tr><td><code>Contrainte</code></td><td><code>Classe.Contrainte</code> ou <code>nil</code></td></tr><tr><td><code>Parent d'attachement</code></td><td><code>Classe.BasePart</code> ou <code>nil</code></td></tr><tr><td><code>Contrôle parental</code></td><td><code>Classe.BasePart</code> ou <code>nil</code></td></tr></tbody>
Clé |
---|
Pour WeldConstraints :
<th>Type</th></tr></thead><tbody><tr><td><code>Contrainte de soudure</code></td><td><code>Class.WeldConstraint</code></td></tr><tr><td><code>Contrôle de soudure parent</code></td><td><code>Classe.BasePart</code> ou <code>nil</code></td></tr><tr><td><code>Part de contrainte de soudure0</code></td><td><code>Classe.BasePart</code></td></tr><tr><td><code>Contrôle de soudure partie1</code></td><td><code>Classe.BasePart</code></td></tr></tbody>
Clé |
---|
Pour NoCollisionConstraints :
<th>Type</th></tr></thead><tbody><tr><td><code>Aucune contrainte de collision</code></td><td><code>Class.NoCollisionConstraint</code></td></tr><tr><td><code>Aucune contrainte de collision parent</code></td><td><code>Classe.BasePart</code> ou <code>nil</code></td></tr><tr><td><code>Aucune contrainte de collision partie 0</code></td><td><code>Classe.BasePart</code></td></tr><tr><td><code>Aucune contrainte de collision partie1</code></td><td><code>Classe.BasePart</code></td></tr></tbody>
Clé |
---|
Échantillons de code
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
Crée une ou plusieurs PartOperations de la géométrie intersectante de la partie principale et d'autres parties dans l'matricedonné.Seul le primitif Parts et PartOperations sont pris en charge, pas Terrain ou MeshParts .Semblable à Clone() , les pièces retournées n'ont pas de set Parent .
Les propriétés suivantes de la partie principale ( part) sont appliquées à la résultante PartOperations
Dans la comparaison d'image suivante, IntersectAsync() est appelé en utilisant le bloc violet et un tableau contenant le bloc bleu.Le résultat PartOperation se résout en une forme de la géométrie interceptante des deux parties.

<figcaption>Pièces séparées</figcaption>

<figcaption>Résultat <code>Class.PartOperation</code></figcaption>
Notations
Par rapport à BasePart:IntersectAsync(), cette méthode se distingue comme suit :
- Les parties d'entrée n'ont pas besoin d'être parentées à la scène, ce qui permet des opérations arrière-plan.
- Lorsque l'option SplitApart est définie sur true (par défaut), chaque corps distinct sera renvoyé dans son propre PartOperation .
- Chacune des parties retournées se trouve dans l'espace de coordonnées de la partie principale.Cela signifie que le (0, 0, 0) de toute pièce retournée n'est pas nécessairement au centre de son corps.
- Il est possible d'appeler cette méthode sur le client, mais avec certaines limitations.Tout d'abord, il doit actuellement être fait avec des objets créés sur le client.Deuxièmement, il n'y a pas de réplication disponible du client au serveur.
Les parties originales restent intactes après une opération réussie.Dans la plupart des cas, vous devez parent le retourné PartOperations au même endroit que la partie principale, puis Destroy() toutes les parties originales.
Par défaut, les couleurs du visage des résultats de PartOperations sont empruntées à la propriété Color des parties originales, bien que vous puissiez activer leur propriété UsePartColor pour les changer en une couleur spécifique.
Si une opération d'intersection donnait lieu à plus de 20 000 triangles, elles seront simplifiées à 20 000.Cela entraînera une erreur avec le code -14 .
Si la partie principale se déplace pendant le calcul de l'opération, vous pouvez définir les parties résultantes sur la partie principale mise à jour CFrame, puisque les parties renvoyées sont dans le même espace de coordonnées que la partie principale.
Si vous utilisez cette méthode avec un PartOperation comme partie principale, vous pouvez remplacer la géométrie d'un autre PartOperation via SubstituteGeometry() , ce qui facilite l'utilisation de la géométrie de l'opération mais maintient les propriétés, les attributs, les balises et les enfants de la partie principale tels que Attachments , Constraints , ParticleEmitters , les objets légers et les décalcomanies.Cette approche évite également le potentiel "scintillement" de remplacer complètement l'original PartOperation par un autre.
Paramètres
Principale Part ou PartOperation pour opérer.
Matrice de parties à intersecter avec la partie principale.
Table des options contenant tous les contrôles pour la méthode :
- CollisionFidelity — La valeur de CollisionFidelity dans les parties résultantes.
- RenderFidelity — La valeur de RenderFidelity dans les parties résultantes.
- FluidFidelity — La valeur de FluidFidelity dans les parties résultantes.
- SplitApart — Boolean contrôle si les objets doivent tous être maintenus ensemble ou être correctement séparés. La valeur par défaut est true (diviser).
Retours
Un ou plusieurs PartOperations de la géométrie intersectante de la partie principale ( part ) et des autres parties.
Échantillons de code
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
Crée une ou plusieurs PartOperations de la partie principale moins la géométrie occupée par d'autres parties dans l'matricedonné.Seul le primitif Parts et PartOperations sont pris en charge, pas Terrain ou MeshParts .Semblable à Clone() , les pièces retournées n'ont pas de set Parent .
Les propriétés suivantes de la partie principale ( part) sont appliquées à la résultante PartOperations
Dans la comparaison d'image suivante, SubtractAsync() est appelé en utilisant le cylindre bleu et un tableau contenant le bloc violet.Le résultat PartOperation se résout en une forme qui omet la géométrie du bloc de celle du cylindre.

<figcaption>Pièces séparées</figcaption>

<figcaption>Résultat <code>Class.PartOperation</code></figcaption>
Notations
Par rapport à BasePart:SubtractAsync(), cette méthode se distingue comme suit :
- Les parties d'entrée n'ont pas besoin d'être parentées à la scène, ce qui permet des opérations arrière-plan.
- Lorsque l'option SplitApart est définie sur true (par défaut), chaque corps distinct sera renvoyé dans son propre PartOperation .
- Chacune des parties retournées se trouve dans l'espace de coordonnées de la partie principale.Cela signifie que le (0, 0, 0) de toute pièce retournée n'est pas nécessairement au centre de son corps.
- Il est possible d'appeler cette méthode sur le client, mais avec certaines limitations.Tout d'abord, il doit actuellement être fait avec des objets créés sur le client.Deuxièmement, il n'y a pas de réplication disponible du client au serveur.
Les parties originales restent intactes après une opération réussie.Dans la plupart des cas, vous devez parent le retourné PartOperations au même endroit que la partie principale, puis Destroy() toutes les parties originales.
Par défaut, les couleurs du visage des résultats de PartOperations sont empruntées à la propriété Color des parties originales, bien que vous puissiez activer leur propriété UsePartColor pour les changer en une couleur spécifique.
Si une opération de soustraction donnerait lieu à tout PartOperations avec plus de 20 000 triangles, elles seront simplifiées à 20 000.Cela entraînera une erreur avec le code -14 .
Si la partie principale se déplace pendant le calcul de l'opération, vous pouvez définir les parties résultantes sur la partie principale mise à jour CFrame, puisque les parties renvoyées sont dans le même espace de coordonnées que la partie principale.
Si vous utilisez cette méthode avec un PartOperation comme partie principale, vous pouvez remplacer la géométrie d'un autre PartOperation via SubstituteGeometry() , ce qui facilite l'utilisation de la géométrie de l'opération mais maintient les propriétés, les attributs, les balises et les enfants de la partie principale tels que Attachments , Constraints , ParticleEmitters , les objets légers et les décalcomanies.Cette approche évite également le potentiel "scintillement" de remplacer complètement l'original PartOperation par un autre.
Paramètres
Principale Part ou PartOperation pour opérer.
Matrice de parties à soustraire de la partie principale.
Table des options contenant tous les contrôles pour la méthode :
- CollisionFidelity — La valeur de CollisionFidelity dans les parties résultantes.
- RenderFidelity — La valeur de RenderFidelity dans les parties résultantes.
- FluidFidelity — La valeur de FluidFidelity dans les parties résultantes.
- SplitApart — Boolean contrôle si les objets doivent tous être maintenus ensemble ou être correctement séparés. La valeur par défaut est true (diviser).
Retours
Un ou plusieurs PartOperations de la géométrie de la partie principale ( part ) moins la géométrie occupée par les autres parties.
Échantillons de code
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
Crée une ou plusieurs PartOperations de la partie principale plus la géométrie occupée par d'autres parties dans l'matricedonné.Seul le primitif Parts et PartOperations sont pris en charge, pas Terrain ou MeshParts .Semblable à Clone() , les pièces retournées n'ont pas de set Parent .
Les propriétés suivantes de la partie principale ( part) sont appliquées à la résultante PartOperations
Dans la comparaison d'image suivante, UnionAsync() est appelé en utilisant le bloc bleu et un tableau contenant le cylindre violet.Le résultat PartOperation se résout en une forme de la géométrie combinée des deux parties.

<figcaption>Pièces séparées</figcaption>

<figcaption>Résultat <code>Class.PartOperation</code></figcaption>
Notations
Par rapport à BasePart:UnionAsync(), cette méthode se distingue comme suit :
- Les parties d'entrée n'ont pas besoin d'être parentées à la scène, ce qui permet des opérations arrière-plan.
- Lorsque l'option SplitApart est définie sur true (par défaut), chaque corps distinct sera renvoyé dans son propre PartOperation .
- Chacune des parties retournées se trouve dans l'espace de coordonnées de la partie principale.Cela signifie que le (0, 0, 0) de toute pièce retournée n'est pas nécessairement au centre de son corps.
- Il est possible d'appeler cette méthode sur le client, mais avec certaines limitations.Tout d'abord, il doit actuellement être fait avec des objets créés sur le client.Deuxièmement, il n'y a pas de réplication disponible du client au serveur.
Les parties originales restent intactes après une opération réussie.Dans la plupart des cas, vous devez parent le retourné PartOperations au même endroit que la partie principale, puis Destroy() toutes les parties originales.
Par défaut, les couleurs de la résultante PartOperations sont empruntées à la propriété Color des parties originales, bien que vous puissiez activer leur propriété UsePartColor pour les changer en une couleur spécifique.
Si une opération d'union donnerait lieu à tout PartOperations avec plus de 20 000 triangles, elles seront simplifiées à 20 000.Cela entraînera une erreur avec le code -14 .
Si la partie principale se déplace pendant le calcul de l'opération, vous pouvez définir les parties résultantes sur la partie principale mise à jour CFrame, puisque les parties renvoyées sont dans le même espace de coordonnées que la partie principale.
Si vous utilisez cette méthode avec un PartOperation comme partie principale, vous pouvez remplacer la géométrie d'un autre PartOperation via SubstituteGeometry() , ce qui facilite l'utilisation de la géométrie de l'opération mais maintient les propriétés, les attributs, les balises et les enfants de la partie principale tels que Attachments , Constraints , ParticleEmitters , les objets légers et les décalcomanies.Cette approche évite également le potentiel "scintillement" de remplacer complètement l'original PartOperation par un autre.
Paramètres
Principale Part ou PartOperation pour opérer.
Ensemble d'éléments à fusionner avec la partie principale.
Table des options contenant tous les contrôles pour la méthode :
- CollisionFidelity — La valeur de CollisionFidelity dans les parties résultantes.
- RenderFidelity — La valeur de RenderFidelity dans les parties résultantes.
- FluidFidelity — La valeur de FluidFidelity dans les parties résultantes.
- SplitApart — Boolean contrôle si les objets doivent tous être maintenus ensemble ou être correctement séparés. La valeur par défaut est true (diviser).
Retours
Un ou plusieurs PartOperations de la géométrie de la partie principale ( part ) plus la géométrie occupée par les autres parties.
Échantillons de code
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