GeometryService

Mostrar obsoleto

*Este contenido se traduce usando la IA (Beta) y puede contener errores. Para ver esta página en inglés, haz clic en aquí.

No creable
Servicio

Servicio que contiene operaciones geométricas no relacionadas directamente con objetos específicos.

Resumen

Métodos

Propiedades

Métodos

CalculateConstraintsToPreserve

Devuelve una tabla de Constraints y Attachments que puedes elegir preservar, junto con sus respectivos padres.Iterar sobre esta tabla te permite decidir si quieres reparar las restricciones y los accesorios recomendados a sus respectivos padres.

Tenga en cuenta que el diccionario options puede contener lo siguiendo:

  • tolerance — La tolerancia de distancia, en relación con la preservación de Attachment entre el archivo y el punto más cercano en la superficie de la pieza original versus el punto más cercano en la superficie de la pieza resultante.Si la distancia resultante después de la operación de modelado sólido es mayor que este valor, el Parent de los archivos adjuntos y sus restricciones asociadas serán nil en la tabla de recomendaciones devuelta.
  • weldConstraintPreserve — Un valor de enumeración Enum.WeldConstraintPreserve que describe cómo se preservan WeldConstraints en la tabla de recomendaciones resultante.
  • dropAttachmentsWithoutConstraints — Boolean con el valor predeterminado de true . Si se establece en false , Attachments aquellos que no tengan Constraints se preservarán.

Parámetros

source: Instance

Un objeto original en el que se realizó la operación de modelado sólido, por ejemplo part en UnionAsync() .

Valor predeterminado: ""
destination: Array
Valor predeterminado: ""
options: Dictionary

Diccionario de opciones para el método:

  • tolerance — La tolerancia de distancia, en relación con la preservación de Attachment entre el archivo y el punto más cercano en la superficie de la pieza original versus el punto más cercano en la superficie de la pieza resultante.Si la distancia resultante después de la operación de modelado sólido es mayor que este valor, el Parent de los archivos adjuntos y sus restricciones asociadas serán nil en la tabla de recomendaciones devuelta.
  • weldConstraintPreserve — Un valor de enumeración Enum.WeldConstraintPreserve que describe cómo se preservan WeldConstraints en la tabla de recomendaciones resultante.
  • dropAttachmentsWithoutConstraints — Boolean con el valor predeterminado de true . Si se establece en false , Attachments aquellos que no tengan Constraints se preservarán.
Valor predeterminado: "nil"

Devuelve

Tabla que contiene información para el caso general Constraints , NoCollisionConstraints y WeldConstraints .En los casos en que se debe eliminar un Attachment o Constraint se debe eliminar su respectivo padre, será nil .

Para el caso general Constraints como HingeConstraint :


<th>Tipo</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>Adjunto</code></td>
<td><code>Clase.Attachamento</code></td>
</tr>
<tr>
<td><code>Restricción</code></td>
<td><code>Clase.Con restricción</code> o <code>nil</code></td>
</tr>
<tr>
<td><code>Padre de archivo adjunto</code></td>
<td><code>Clase.BasePart</code> o <code>nil</code></td>
</tr>
<tr>
<td><code>Padre de restricción</code></td>
<td><code>Clase.BasePart</code> o <code>nil</code></td>
</tr>
</tbody>
Clave

Para WeldConstraints :


<th>Tipo</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>Restricción de soldadura</code></td>
<td><code>Class.WeldConstraint</code></td>
</tr>
<tr>
<td><code>Padre de restricción soldadura</code></td>
<td><code>Clase.BasePart</code> o <code>nil</code></td>
</tr>
<tr>
<td><code>Pieza de restricción de soldadura0</code></td>
<td><code>Class.BasePart</code></td>
</tr>
<tr>
<td><code>Parte de restricción de soldadura1</code></td>
<td><code>Class.BasePart</code></td>
</tr>
</tbody>
Clave

Para NoCollisionConstraints :


<th>Tipo</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>NoCollisionConstraints obligación</code></td>
<td><code>Class.NoCollisionConstraint</code></td>
</tr>
<tr>
<td><code>NoCollisionConstraintParent</code></td>
<td><code>Clase.BasePart</code> o <code>nil</code></td>
</tr>
<tr>
<td><code>NoCollisionConstraintPart0</code></td>
<td><code>Class.BasePart</code></td>
</tr>
<tr>
<td><code>NoCollisionConstraintPart1</code></td>
<td><code>Class.BasePart</code></td>
</tr>
</tbody>
Clave

Muestras de código

The following example shows how to preserve Attachments and Constraints based on a recommended table produced by CalculateConstraintsToPreserve().

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

Proporciona

Crea uno o más PartOperations de la geometría intersectante de la parte principal y otras partes en el matriz/listadado.Solo se admiten los primitivos Parts y PartOperations , no Terrain o MeshParts.Al igual que Clone() , las piezas devueltas no tienen ningún conjunto Parent .

Las siguientes propiedades de la parte principal ( part ) se aplican al resultante PartOperations :

En la siguiente comparación de imágenes, IntersectAsync() se llama usando el bloque púrpura y un array que contiene el bloquesazul.El resultante PartOperation se resuelve en una forma de la geometría interseccional de ambas partes.

Two block parts overlapping

<figcaption>Separar piezas</figcaption>
Parts intersected into a new solid model

<figcaption>Resultando <code>Clase.PartOperation</code></figcaption>

Notas

  • En comparación con BasePart:IntersectAsync(), este método se diferencia como sigue:

    • Las partes de entrada no necesitan ser padres de la escena, lo que permite operaciones de fondo.
    • Cuando la opción SplitApart se establece en true (por defecto), se devolverá cada cuerpo distinto en su propio PartOperation .
    • Cada una de las piezas devueltas está en el espacio de coordenadas de la pieza principal.Esto significa que el (0, 0, 0) de cualquier parte devuelta no necesariamente está en el centro de su cuerpo.
    • Es posible llamar a este método al cliente, pero con algunas limitaciones.Primero, actualmente debe hacerse con objetos creados en el cliente.En segundo lugar, no hay replicación disponible desde el cliente al servidor.
  • Las piezas originales se mantienen intactas después de una operación exitosa.En la mayoría de los casos, deberías padrinizar el retornado PartOperations al mismo lugar que la parte principal, luego Destroy() todas las partes originales.

  • Por defecto, los colores de la cara de los resultados PartOperations se toman de la propiedad Color de las piezas originales, aunque puedes habilitar su propiedad UsePartColor para cambiarlos a un color específico.

  • Si una operación de intersección resultara en cualquier PartOperations con más de 20,000 triángulos, se simplificarán a 20,000.Esto resultará en un error con el código -14 .

  • Si la parte principal se está moviendo durante el cálculo de la operación, puedes establecer las partes resultantes en la actualizada CFrame de la parte principal, ya que las piezas devueltas están en el mismo espacio de coordenadas que la parte principal.

  • Si usa este método con un PartOperation como parte principal, puede sustituir la geometría de otro PartOperation a través de SubstituteGeometry() , lo que facilita el uso de la geometría de la operación pero mantiene las propiedades, atributos, etiquetas y niños de la parte principal como Attachments , Constraints , ParticleEmitters , objetos ligeros y calcomanías.Este enfoque también evita el potencial "parpadeo" de reemplazar completamente el original PartOperation con otro.

Parámetros

part: Instance

Principal Part o PartOperation para operar.

Valor predeterminado: ""
parts: Array

Arrayo de partes para intersectar con la parte principal.

Valor predeterminado: ""
options: Dictionary

Tabla de opciones que contiene todos los controles para el método:

  • CollisionFidelity — El valor de CollisionFidelity en las partes resultantes.
  • RenderFidelity — El valor de RenderFidelity en las partes resultantes.
  • FluidFidelity — El valor de FluidFidelity en las partes resultantes.
  • SplitApart — Controlar si los objetos deben mantenerse todos juntos o dividirse correctamente. La opción predeterminada es true (división).
Valor predeterminado: "nil"

Devuelve

Una o más PartOperations de la geometría interseccionante de la parte principal (part ) y de las otras partes.

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

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

Proporciona

Crea uno o más PartOperations de la parte principal menos la geometría ocupada por otras partes en el matriz/listadado.Solo se admiten los primitivos Parts y PartOperations , no Terrain o MeshParts.Al igual que Clone() , las piezas devueltas no tienen ningún conjunto Parent .

Las siguientes propiedades de la parte principal ( part ) se aplican al resultante PartOperations :

En la siguiente comparación de imágenes, SubtractAsync() se llama usando el cilindro azul y un array que contiene el bloquespúrpura.El resultante PartOperation resuelve en una forma que omite la geometría del bloquesde la del cilindro.

Longer block overlapping a cylinder

<figcaption>Separar piezas</figcaption>
Block part subtracted from cylinder

<figcaption>Resultando <code>Clase.PartOperation</code></figcaption>

Notas

  • En comparación con BasePart:SubtractAsync(), este método se diferencia como sigue:

    • Las partes de entrada no necesitan ser padres de la escena, lo que permite operaciones de fondo.
    • Cuando la opción SplitApart se establece en true (por defecto), se devolverá cada cuerpo distinto en su propio PartOperation .
    • Cada una de las piezas devueltas está en el espacio de coordenadas de la pieza principal.Esto significa que el (0, 0, 0) de cualquier parte devuelta no necesariamente está en el centro de su cuerpo.
    • Es posible llamar a este método al cliente, pero con algunas limitaciones.Primero, actualmente debe hacerse con objetos creados en el cliente.En segundo lugar, no hay replicación disponible desde el cliente al servidor.
  • Las piezas originales se mantienen intactas después de una operación exitosa.En la mayoría de los casos, deberías padrinizar el retornado PartOperations al mismo lugar que la parte principal, luego Destroy() todas las partes originales.

  • Por defecto, los colores de la cara de los resultados PartOperations se toman de la propiedad Color de las piezas originales, aunque puedes habilitar su propiedad UsePartColor para cambiarlos a un color específico.

  • Si una operación de resta resultara en cualquier PartOperations con más de 20,000 triángulos, se simplificarán a 20,000.Esto resultará en un error con el código -14 .

  • Si la parte principal se está moviendo durante el cálculo de la operación, puedes establecer las partes resultantes en la actualizada CFrame de la parte principal, ya que las piezas devueltas están en el mismo espacio de coordenadas que la parte principal.

  • Si usa este método con un PartOperation como parte principal, puede sustituir la geometría de otro PartOperation a través de SubstituteGeometry() , lo que facilita el uso de la geometría de la operación pero mantiene las propiedades, atributos, etiquetas y niños de la parte principal como Attachments , Constraints , ParticleEmitters , objetos ligeros y calcomanías.Este enfoque también evita el potencial "parpadeo" de reemplazar completamente el original PartOperation con otro.

Parámetros

part: Instance

Principal Part o PartOperation para operar.

Valor predeterminado: ""
parts: Array

Arrayo de partes para restar de la parte principal.

Valor predeterminado: ""
options: Dictionary

Tabla de opciones que contiene todos los controles para el método:

  • CollisionFidelity — El valor de CollisionFidelity en las partes resultantes.
  • RenderFidelity — El valor de RenderFidelity en las partes resultantes.
  • FluidFidelity — El valor de FluidFidelity en las partes resultantes.
  • SplitApart — Controlar si los objetos deben mantenerse todos juntos o dividirse correctamente. La opción predeterminada es true (división).
Valor predeterminado: "nil"

Devuelve

Uno o más PartOperations de la geometría de la parte principal ( part ) menos la geometría ocupada por las otras partes.

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

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

Proporciona

Crea uno o más PartOperations de la parte principal más la geometría ocupada por otras partes en el matriz/listadado.Solo se admiten los primitivos Parts y PartOperations , no Terrain o MeshParts.Al igual que Clone() , las piezas devueltas no tienen ningún conjunto Parent .

Las siguientes propiedades de la parte principal ( part ) se aplican al resultante PartOperations :

En la siguiente comparación de imágenes, UnionAsync() se llama usando el bloque azul y un array que contiene el cilindro púrpura.El resultante PartOperation se resuelve en una forma de la geometría combinada de ambas partes.

Block and cylinder parts overlapping

<figcaption>Separar piezas</figcaption>
Parts joined together into a single solid union

<figcaption>Resultando <code>Clase.PartOperation</code></figcaption>

Notas

  • En comparación con BasePart:UnionAsync(), este método se diferencia como sigue:

    • Las partes de entrada no necesitan ser padres de la escena, lo que permite operaciones de fondo.
    • Cuando la opción SplitApart se establece en true (por defecto), se devolverá cada cuerpo distinto en su propio PartOperation .
    • Cada una de las piezas devueltas está en el espacio de coordenadas de la pieza principal.Esto significa que el (0, 0, 0) de cualquier parte devuelta no necesariamente está en el centro de su cuerpo.
    • Es posible llamar a este método al cliente, pero con algunas limitaciones.Primero, actualmente debe hacerse con objetos creados en el cliente.En segundo lugar, no hay replicación disponible desde el cliente al servidor.
  • Las piezas originales se mantienen intactas después de una operación exitosa.En la mayoría de los casos, deberías padrinizar el retornado PartOperations al mismo lugar que la parte principal, luego Destroy() todas las partes originales.

  • Por defecto, los colores del resultante PartOperations se toman de la propiedad Color de las piezas originales, aunque puedes habilitar su propiedad UsePartColor para cambiarlos a un color específico.

  • Si una operación de unión resultara en cualquier PartOperations con más de 20,000 triángulos, se simplificará a 20,000.Esto resultará en un error con el código -14 .

  • Si la parte principal se está moviendo durante el cálculo de la operación, puedes establecer las partes resultantes en la actualizada CFrame de la parte principal, ya que las piezas devueltas están en el mismo espacio de coordenadas que la parte principal.

  • Si usa este método con un PartOperation como parte principal, puede sustituir la geometría de otro PartOperation a través de SubstituteGeometry() , lo que facilita el uso de la geometría de la operación pero mantiene las propiedades, atributos, etiquetas y niños de la parte principal como Attachments , Constraints , ParticleEmitters , objetos ligeros y calcomanías.Este enfoque también evita el potencial "parpadeo" de reemplazar completamente el original PartOperation con otro.

Parámetros

part: Instance

Principal Part o PartOperation para operar.

Valor predeterminado: ""
parts: Array

Arrayo de partes para unirse con la parte principal.

Valor predeterminado: ""
options: Dictionary

Tabla de opciones que contiene todos los controles para el método:

  • CollisionFidelity — El valor de CollisionFidelity en las partes resultantes.
  • RenderFidelity — El valor de RenderFidelity en las partes resultantes.
  • FluidFidelity — El valor de FluidFidelity en las partes resultantes.
  • SplitApart — Controlar si los objetos deben mantenerse todos juntos o dividirse correctamente. La opción predeterminada es true (división).
Valor predeterminado: "nil"

Devuelve

Uno o más PartOperations de la geometría de la parte principal ( part ) más la geometría ocupada por las otras partes.

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

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

Eventos