GeometryService
*Este conteúdo é traduzido por IA (Beta) e pode conter erros. Para ver a página em inglês, clique aqui.
Serviço que contém operações geométricas não relacionadas diretamente a objetos específicos.
Resumo
Métodos
Retorna uma tabela de Constraints e Attachments que você pode optar por preservar, junto com seus respectivos pais.
Cria um ou mais PartOperations a partir da geometria intersecante de uma parte e de outras partes.
Cria uma ou mais PartOperations de uma parte menos a geometria ocupada por outras partes.
Cria uma ou mais PartOperations de uma parte mais a geometria ocupada por outras partes.
Propriedades
Métodos
CalculateConstraintsToPreserve
Retorna uma tabela de Constraints e Attachments que você pode optar por preservar, junto com seus respectivos pais.Iterar sobre essa tabela permite que você decida se deve reparar as restrições e anexos recomendados a seus respectivos pais.
Observe que o dicionário options pode conter o seguindo:
- tolerance — A tolerância de distância, em relação à preservação de Attachment entre o anexo e o ponto mais próximo na superfície da peça original versus o ponto mais próximo na superfície da peça resultante.Se a distância resultante após a operação de modelagem sólida for maior que esse valor, os de anexos e suas restrições associadas estarão na tabela de recomendações retornada.
- weldConstraintPreserve — Um valor de enumeração Enum.WeldConstraintPreserve que descreve como WeldConstraints são preservados na tabela de recomendações resultante.
- dropAttachmentsWithoutConstraints — Booleano com padrão de true . Se definido para false , Attachments que não tenham Constraints serão preservados.
Parâmetros
Um objeto original em que a operação de modelagem sólida foi realizada, por exemplo part em UnionAsync() .
Dicionário de opções para o método:
- tolerance — A tolerância de distância, em relação à preservação de Attachment entre o anexo e o ponto mais próximo na superfície da peça original versus o ponto mais próximo na superfície da peça resultante.Se a distância resultante após a operação de modelagem sólida for maior que esse valor, os de anexos e suas restrições associadas estarão na tabela de recomendações retornada.
- weldConstraintPreserve — Um valor de enumeração Enum.WeldConstraintPreserve que descreve como WeldConstraints são preservados na tabela de recomendações resultante.
- dropAttachmentsWithoutConstraints — Booleano com padrão de true . Se definido para false , Attachments que não tenham Constraints serão preservados.
Devolução
Tabela que contém informações para o caso geral Constraints, NoCollisionConstraints e WeldConstraints.Em casos em que um Attachment ou Constraint deve ser descartado, seu respectivo pai será nil .
Para o caso geral Constraints como HingeConstraint :
<th>Tipo</th></tr></thead><tbody><tr><td><code>Anexo</code></td><td><code>Class.Attachment</code></td></tr><tr><td><code>Restrição</code></td><td><code>Classe.Con restricção</code> ou <code>nil</code></td></tr><tr><td><code>Pai de Ataque</code></td><td><code>Classe.BasePart</code> ou <code>nil</code></td></tr><tr><td><code>Parente de restrição</code></td><td><code>Classe.BasePart</code> ou <code>nil</code></td></tr></tbody>
Chave |
---|
Para WeldConstraints :
<th>Tipo</th></tr></thead><tbody><tr><td><code>Restrição de solda</code></td><td><code>Class.WeldConstraint</code></td></tr><tr><td><code>Pai da Restrição de Solda</code></td><td><code>Classe.BasePart</code> ou <code>nil</code></td></tr><tr><td><code>Peça de restrição de solda0</code></td><td><code>BasePart de Classe</code></td></tr><tr><td><code>Parte de restrição de solda1</code></td><td><code>BasePart de Classe</code></td></tr></tbody>
Chave |
---|
Para NoCollisionConstraints :
<th>Tipo</th></tr></thead><tbody><tr><td><code>Nenhuma restrição de colisão</code></td><td><code>Class.NoCollisionConstraint</code></td></tr><tr><td><code>Não há restrição de colisão parente</code></td><td><code>Classe.BasePart</code> ou <code>nil</code></td></tr><tr><td><code>Não há parte de restrição de colisão0</code></td><td><code>BasePart de Classe</code></td></tr><tr><td><code>Não há restrição de colisão Parte1</code></td><td><code>BasePart de Classe</code></td></tr></tbody>
Chave |
---|
Amostras de código
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
Cria um ou mais PartOperations a partir da geometria intersecante da parte principal e de outras partes no matriz / listadado.Apenas primitivas Parts e PartOperations são suportadas, não Terrain ou MeshParts.Semelhante a Clone() , as peças retornadas não têm nenhum conjunto Parent .
As seguintes propriedades da parte principal ( part ) são aplicadas ao resultante PartOperations :
Na comparação de imagem a seguir, IntersectAsync() é chamado usando o bloco roxo e um array que contém o bloco azul.O resultante PartOperation resolve em uma forma da geometria intersecante de ambas as partes.

<figcaption>Peças separadas</figcaption>

<figcaption>Resultando em <code>Class.PartOperation</code></figcaption>
Notas
Comparado a BasePart:IntersectAsync(), este método difere da seguinte forma:
- As peças de entrada não precisam ser parentadas para a cena, permitindo operações de fundo.
- Quando a opção SplitApart é definida como true (padrão), cada corpo distinto será retornado em seu próprio PartOperation .
- Cada uma das peças retornadas está no espaço de coordenadas da peça principal.Isso significa que o (0, 0, 0) de qualquer peça retornada não é necessariamente no centro de seu corpo.
- É possível chamar esse método no cliente, mas com algumas limitações.Primeiro, atualmente deve ser feito com objetos criados no cliente.Em segundo lugar, não há replicação disponível do cliente para o servidor.
As peças originais permanecem intactas após uma operação bem-sucedida.Na maioria dos casos, você deve parenter o retornado PartOperations para o mesmo local que a parte principal, então Destroy() todas as peças originais.
Por padrão, as cores do rosto do resultante PartOperations são emprestadas da propriedade Color das peças originais, embora você possa habilitar sua propriedade UsePartColor para alterá-las para uma cor específica.
Se uma operação de intersecção resultasse em qualquer PartOperations com mais de 20.000 triângulos, elas serão simplificadas para 20.000.Isso resultará em um erro com o código -14 .
Se a parte principal estiver se movendo durante o cálculo da operação, você pode definir as peças resultantes para a atualizada CFrame da parte principal, pois as peças retornadas estão no mesmo espaço de coordenadas da parte principal.
Se usar esse método com um PartOperation como a parte principal, você pode substituir a geometria de outro PartOperation via SubstituteGeometry() , tornando mais fácil utilizar a geometria da operação, mas manter propriedades, atributos, tags e filhos da parte principal, como Attachments , Constraints , ParticleEmitters , objetos leves e decalques.Essa abordagem também contorna o potencial "flicker" de substituir completamente o original PartOperation por outro.
Parâmetros
Principal Part ou PartOperation para operar.
Array de partes para intersectar com a parte principal.
Tabela de opções que contém todos os controles para o método:
- CollisionFidelity — O valor de CollisionFidelity nas peças resultantes.
- RenderFidelity — O valor de RenderFidelity nas peças resultantes.
- FluidFidelity — O valor de FluidFidelity nas peças resultantes.
- SplitApart — Booleano que controla se os objetos devem ser mantidos todos juntos ou devidamente divididos. O padrão é true (dividido).
Devolução
Uma ou mais PartOperations da geometria intersecante da parte principal ( part ) e das outras partes.
Amostras de código
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
Cria uma ou mais PartOperations da parte principal menos a geometria ocupada por outras partes no matriz / listadado.Apenas primitivas Parts e PartOperations são suportadas, não Terrain ou MeshParts.Semelhante a Clone() , as peças retornadas não têm nenhum conjunto Parent .
As seguintes propriedades da parte principal ( part ) são aplicadas ao resultante PartOperations :
Na comparação de imagem a seguir, SubtractAsync() é chamado usando o cilindro azul e um array que contém o bloco roxo.O resultante PartOperation resolve em uma forma que omite a geometria do bloco da do cilindro.

<figcaption>Peças separadas</figcaption>

<figcaption>Resultando em <code>Class.PartOperation</code></figcaption>
Notas
Comparado a BasePart:SubtractAsync(), este método difere da seguinte forma:
- As peças de entrada não precisam ser parentadas para a cena, permitindo operações de fundo.
- Quando a opção SplitApart é definida como true (padrão), cada corpo distinto será retornado em seu próprio PartOperation .
- Cada uma das peças retornadas está no espaço de coordenadas da peça principal.Isso significa que o (0, 0, 0) de qualquer peça retornada não é necessariamente no centro de seu corpo.
- É possível chamar esse método no cliente, mas com algumas limitações.Primeiro, atualmente deve ser feito com objetos criados no cliente.Em segundo lugar, não há replicação disponível do cliente para o servidor.
As peças originais permanecem intactas após uma operação bem-sucedida.Na maioria dos casos, você deve parenter o retornado PartOperations para o mesmo local que a parte principal, então Destroy() todas as peças originais.
Por padrão, as cores do rosto do resultante PartOperations são emprestadas da propriedade Color das peças originais, embora você possa habilitar sua propriedade UsePartColor para alterá-las para uma cor específica.
Se uma operação de subtração resultasse em qualquer PartOperations com mais de 20.000 triângulos, ela será simplificada para 20.000.Isso resultará em um erro com o código -14 .
Se a parte principal estiver se movendo durante o cálculo da operação, você pode definir as peças resultantes para a atualizada CFrame da parte principal, pois as peças retornadas estão no mesmo espaço de coordenadas da parte principal.
Se usar esse método com um PartOperation como a parte principal, você pode substituir a geometria de outro PartOperation via SubstituteGeometry() , tornando mais fácil utilizar a geometria da operação, mas manter propriedades, atributos, tags e filhos da parte principal, como Attachments , Constraints , ParticleEmitters , objetos leves e decalques.Essa abordagem também contorna o potencial "flicker" de substituir completamente o original PartOperation por outro.
Parâmetros
Principal Part ou PartOperation para operar.
Array de partes para subtrair da parte principal.
Tabela de opções que contém todos os controles para o método:
- CollisionFidelity — O valor de CollisionFidelity nas peças resultantes.
- RenderFidelity — O valor de RenderFidelity nas peças resultantes.
- FluidFidelity — O valor de FluidFidelity nas peças resultantes.
- SplitApart — Booleano que controla se os objetos devem ser mantidos todos juntos ou devidamente divididos. O padrão é true (dividido).
Devolução
Uma ou mais PartOperations da geometria da parte principal ( part ) menos a geometria ocupada pelas outras partes.
Amostras de código
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
Cria uma ou mais PartOperations da parte principal mais a geometria ocupada por outras partes no matriz / listadado.Apenas primitivas Parts e PartOperations são suportadas, não Terrain ou MeshParts.Semelhante a Clone() , as peças retornadas não têm nenhum conjunto Parent .
As seguintes propriedades da parte principal ( part ) são aplicadas ao resultante PartOperations :
Na comparação de imagem a seguir, UnionAsync() é chamado usando o bloco azul e um array que contém o cilindro roxo.O resultante PartOperation resolve em uma forma da geometria combinada de ambas as partes.

<figcaption>Peças separadas</figcaption>

<figcaption>Resultando em <code>Class.PartOperation</code></figcaption>
Notas
Comparado a BasePart:UnionAsync(), este método difere da seguinte forma:
- As peças de entrada não precisam ser parentadas para a cena, permitindo operações de fundo.
- Quando a opção SplitApart é definida como true (padrão), cada corpo distinto será retornado em seu próprio PartOperation .
- Cada uma das peças retornadas está no espaço de coordenadas da peça principal.Isso significa que o (0, 0, 0) de qualquer peça retornada não é necessariamente no centro de seu corpo.
- É possível chamar esse método no cliente, mas com algumas limitações.Primeiro, atualmente deve ser feito com objetos criados no cliente.Em segundo lugar, não há replicação disponível do cliente para o servidor.
As peças originais permanecem intactas após uma operação bem-sucedida.Na maioria dos casos, você deve parenter o retornado PartOperations para o mesmo local que a parte principal, então Destroy() todas as peças originais.
Por padrão, as cores do resultante PartOperations são emprestadas da propriedade Color das peças originais, embora você possa habilitar sua propriedade UsePartColor para alterá-las para uma cor específica.
Se uma operação de união resultasse em qualquer PartOperations com mais de 20.000 triângulos, ela será simplificada para 20.000.Isso resultará em um erro com o código -14 .
Se a parte principal estiver se movendo durante o cálculo da operação, você pode definir as peças resultantes para a atualizada CFrame da parte principal, pois as peças retornadas estão no mesmo espaço de coordenadas da parte principal.
Se usar esse método com um PartOperation como a parte principal, você pode substituir a geometria de outro PartOperation via SubstituteGeometry() , tornando mais fácil utilizar a geometria da operação, mas manter propriedades, atributos, tags e filhos da parte principal, como Attachments , Constraints , ParticleEmitters , objetos leves e decalques.Essa abordagem também contorna o potencial "flicker" de substituir completamente o original PartOperation por outro.
Parâmetros
Principal Part ou PartOperation para operar.
Array de partes para se unir com a parte principal.
Tabela de opções que contém todos os controles para o método:
- CollisionFidelity — O valor de CollisionFidelity nas peças resultantes.
- RenderFidelity — O valor de RenderFidelity nas peças resultantes.
- FluidFidelity — O valor de FluidFidelity nas peças resultantes.
- SplitApart — Booleano que controla se os objetos devem ser mantidos todos juntos ou devidamente divididos. O padrão é true (dividido).
Devolução
Uma ou mais PartOperations da geometria da parte principal ( part ) mais a geometria ocupada pelas outras partes.
Amostras de código
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