Terrain
*Este contenido se traduce usando la IA (Beta) y puede contener errores. Para ver esta página en inglés, haz clic en aquí.
El terreno te permite crear entornos dinámicamente morfos con poca o ninguna lag. Actualmente está basado en una cuadrícula de celdas 4×4×4, donde cada celda tiene un número entre 0 y 1 que representa la cantidad de geometría que ocupa la celda, y el material de la celda. La ocupación determina cómo la celda se transformará con las celdas circundantes, y el resultado es la ilusión de tener una celda con ninguna restriccióncuadrícula.
Para obtener más información, see terreno .
Resumen
Propiedades
Activa o desactiva la decoración del terreno.
Especifica la longitud de la hierba animada.
MaterialColors representa el editor para la función de color del material, y no se puede editar por scripts .
Para obtener el color de un material, use: Terrain:GetMaterialColor() Para establecer el color de un material, use: Terrain:SetMaterialColor()
Muestra los límites de la región más grande posible para editar.
El tinte del agua del terreno.
Controla la opacidad de los reflejos de agua del terreno.
La transparencia del agua del terreno.
Establece la altura máxima de las olas de agua del terreno en studs.
Establece la cantidad de veces que las olas de agua del terreno se moverán hacia arriba y hacia abajo por minuto.
Determina si una parte es inmóvil por física.
La velocidad ángular de la montaje de la parte.
El centro de masa de la montura del mundo en el espacio de montaje.
La velocidad lineal de la montaje de la parte.
La masa total de la montura del parte.
Una referencia a la parte raíz de la instalación.
Determina el tipo de superficie para la Cara trasera de una parte (+Z dirección).
Determina el tipo de superficie para la Cara inferior de una parte (-Y dirección).
Determina el color de una parte.
Determina la posición y orientación de la BasePart en el mundo.
Determina si una parte puede colisionar con otras partes.
Determina si la parte se considera durante las operaciones de consulta espacial.
Determina si Touched y TouchEnded eventos se disparan en la parte.
Determina si una parte proyecta una sombra o no.
Describe la posición del mundo en la que se encuentra el centro de masa de una parte.
Describe el nombre de un grupo de colisión de una parte.
Determina el color de una parte.
Indica las propiedades físicas actuales de la parte.
Determina varias propiedades físicas de una parte.
Se utiliza para habilitar o deshabilitar las fuerzas aerodinámicas en las partes y montajes.
El tamaño físico real de la BasePart según el motor de física.
Determina el tipo de superficie para la cara delantera de una parte (-Z dirección).
Determina el tipo de superficie para la cara izquierda de una parte (-X dirección).
Determina un multiplicador para BasePart.Transparency que solo es visible para el cliente local.
Determina si una parte es seleccionable en Studio.
Describe la masa de la parte, el producto de su densidad y volumen.
Determina si la parte contribuye a la masa o inercia total de su cuerpo rígido.
Determina las propiedades físicas predeterminadas y textura de una parte.
El nombre de MaterialVariant .
Describe la rotación de la parte en el mundo.
Especifica el desplazamiento del eje de la parte desde su CFrame .
Describe la posición de la parte en el mundo.
Tiempo desde la última actualización de física registrada.
Determina la cantidad de un bloque que refleja el cielo.
Describe el cambio de tamaño más pequeño permitido por el método de escalado.
Describe las caras en las que se puede redimensionar una parte.
Determina el tipo de superficie para la Cara Derecha de una parte (+X dirección).
La regla principal para determinar la parte raíz de una arquitectura.
La rotación de la parte en grados para los tres ejes.
Determina las dimensiones de una parte (Longitud, ancho, altura).
Determina el tipo de superficie para la Cara Superior de una parte (+Y dirección).
Determina la cantidad de información que se puede ver a través de (el revés de la opacidad de la parte).
Métodos
Devuelve la posición mundial del centro de la celda de terreno (x, y, z).
Restablece la posición de la esquina inferior izquierda-frente de la celda de la cuadrícula (x, y, z).
Elimina el terreno.
Almacena un pedazo de terreno en un objeto TerrainRegion para que se pueda cargar más tarde. Nota: los datos de TerrainRegion no se replican entre el servidor y el cliente.
Devuelve el número de no hay espacios en el terreno.
Llena un balón de terreno liso en un espacio dado.
Rellena un bloque de terreno liso con una ubicación, rotación, tamaño y material dado.
Llena un cilindro de terreno liso en un espacio dado.
Llena un espacio Region3 con terreno liso.
Llena un volumen de forma de cuda con el dado Enum.Material y el área CFrame y tamaño.
Restablece el color de material de terreno actual para el material de terreno especificado.
Aplica un pedazo de terreno al objeto de terreno. Nota: los datos de TerrainRegion no se replican entre el servidor y el cliente.
Regresa un conjunto de datos de voxel de terreno en formato de tabla según los nombres de los canales.
Regresa una región determinada de terreno liso en formato de tabla.
- ReplaceMaterial(region : Region3,resolution : number,sourceMaterial : Enum.Material,targetMaterial : Enum.Material):void
Reemplaza el terreno de un material dentro de una región con otro material.
Establece el color de material de terreno actual para el material de terreno especificado.
Devuelve la ubicación de la celda de la cuadrícula que contiene el punto posición .
Devuelve la posición de la celda de la cuadrícula que contiene la posición del punto, preferiblemente sin espacios de celda de la cuadrícula cuando la posición está en un borde de la cuadrícula.
Devuelve la ubicación de la celda de la cuadrícula que contiene la posición del punto, preferiblemente no hay espacios no vacíos entre las filas de la cuadrícula cuando la posición está en un borde de la cuadrícula.
Establece una región de terreno usando un diccionario de datos de canal de voxel.
Establece una región determinada de terreno liso usando el formato de la tabla.
Aplicar un impulso ángular a la instalación.
Aplica un impulso a la montura en el centro de montaje de la montura center of mass .
Aplica un impulso a la montura en la posición especificada.
Regresa si las partes pueden chocar entre sí.
Comprueba si puedes establecer el propietario de la red de una parte.
Devuelve una tabla de partes conectadas al objeto por cualquier tipo de articulación rígida.
Devuelva todos los Joints o Constraints que estén conectados a esta parte.
Devuelve el valor de la propiedad Mass .
Devuelve al jugador actual que es el propietario de la red de esta parte, o nulo en caso del servidor.
Regresa true si el motor del juego decide automáticamente el propietario de la red para esta parte.
Regresa la parte base de una montura de partes.
Devuelve una tabla de todas las piezas BasePart.CanCollide que tengan intersección con esta parte.
Devuelve la velocidad lineal del montaje de la parte en la posición relativa a esta parte.
Regresa veraz si el objeto está conectado a una parte que lo sostendrá en su lugar (por ejemplo, una parte Anchored )), de lo contrario regresa false.
Cambia el tamaño de un objeto al usar la herramienta de escalado de Studio.
Establece al jugador dado como propietario de la red para esto y todas las partes conectadas.
Deja que el motor del juego decida dinámicamente quién se encargará de la física de la parte (uno de los clientes o el servidor).
- IntersectAsync(parts : Instances,collisionfidelity : Enum.CollisionFidelity,renderFidelity : Enum.RenderFidelity):Instance
Crea una nueva IntersectOperation a partir de la geometría superpuesta de la parte y las otras partes en el matriz/listadado.
- SubtractAsync(parts : Instances,collisionfidelity : Enum.CollisionFidelity,renderFidelity : Enum.RenderFidelity):Instance
Crea una nueva UnionOperation desde la parte, minuscula la geometría ocupada por las partes en el matriz/listadado.
- UnionAsync(parts : Instances,collisionfidelity : Enum.CollisionFidelity,renderFidelity : Enum.RenderFidelity):Instance
Crea una nueva UnionOperation desde la parte, plus la geometría ocupada por las partes en el matriz/listadado.
Gets the pivot of a PVInstance.
Transforms the PVInstance along with all of its descendant PVInstances such that the pivot is now located at the specified CFrame.
Eventos
Eventos heredados de BasePartDispara cuando una parte deja de tocar otra parte como resultado de un movimiento físico.
Dispara cuando una parte toca otra parte como resultado del movimiento físico.
Propiedades
Decoration
Actualmente habilita o deshabilita el pasto animado en el material de terreno hierba , aunque futuras modificaciones de esta propiedad pueden controlar características decorativas adicionales.
GrassLength
Especifica la longitud de la hierba animada en el material de terreno Hierba , admitiendo que Decoration está habilitado. Los valores válidos están entre 0.1 y 1.
MaterialColors
MaterialColors representa el editor para la función de color del material, y no se puede editar por scripts .
Para obtener el color de un material, usa: Terrain:GetMaterialColor()
Para establecer el color de un material, usa: Terrain:SetMaterialColor()
WaterWaveSize
Establece la altura máxima de las olas de agua del terreno en studs. Esto está actualmente limitado entre 0 y 1.
WaterWaveSpeed
Establece la cantidad de veces que las olas de agua del terreno se moverán hacia arriba y hacia abajo por minuto. Esto está actualmente limitado entre 0 y 100.
Métodos
CellCenterToWorld
Devuelve la posición mundial del centro de la celda de terreno (x, y, z).
Parámetros
Devuelve
CellCornerToWorld
Restablece la posición de la esquina inferior izquierda-frente de la celda de la cuadrícula (x, y, z).
Parámetros
Devuelve
Clear
Elimina el terreno.
Devuelve
CopyRegion
Almacena un pedazo de terreno en un objeto TerrainRegion para que se pueda cargar más tarde. Nota: los datos de TerrainRegion no se replican entre el servidor y el cliente.
Parámetros
Devuelve
Muestras de código
local terrainRegion = workspace.Terrain:CopyRegion(workspace.Terrain.MaxExtents)
workspace.Terrain:Clear()
task.wait(5)
workspace.Terrain:PasteRegion(terrainRegion, workspace.Terrain.MaxExtents.Min, true)
FillBall
Llena un balón de terreno liso en un espacio dado.
Parámetros
La posición del centro de la bola de terreno.
El radio en studs de la bola de terreno.
El Enum.Material de la bola de terreno.
Devuelve
Muestras de código
local Workspace = game:GetService("Workspace")
-- Creates a ball of grass at (0,0,-10) with a radius of 10 studs
Workspace.Terrain:FillBall(Vector3.new(0, 0, -10), 10, Enum.Material.Grass)
FillBlock
Rellena un bloque de terreno liso con una ubicación, rotación, tamaño y material dado.
Parámetros
El cFrame (posición y orientación) del bloquesde terreno.
El tamaño en pies de cuadrado del bloque - tanto la altura como la ancho.
El Enum.Material del bloquesde terreno.
Devuelve
FillCylinder
Rellena un cilindro de terreno liso en un espacio dado. El espacio se define usando un CFrame, altura y radio.
Uso
workspace.Terrain:FillCylinder(CFrame.new(0, 50, 0), 5, 30, Enum.Material.Asphalt)
Parámetros
El CFrame (posición y orientación) del cilindro de terreno.
La altura en pies de la cilindra de terreno.
El radio en studs del cilindro de terreno.
El Enum.Material del cilindro de terreno.
Devuelve
FillWedge
FillWedge() llena un volumen en forma de cuda de Terrain con el dado Enum.Material y el área 0> Datatype.CFrame0> y el tamaño. La orientación del cuda es la misma que una versión equivalente FillWedge()3> .
Parámetros
La posición y orientación de la cunilla para llenar.
El tamaño de la cunilla para llenar.
El material con el que se llenará el cuello.
Devuelve
GetMaterialColor
Restablece el color de material de terreno actual para el material de terreno especificado.
Parámetros
Devuelve
PasteRegion
Aplica un pedazo de terreno al objeto de terreno. Nota: los datos de TerrainRegion no se replican entre el servidor y el cliente.
Parámetros
Devuelve
Muestras de código
--[[
Note: The use of int16 variants for these API is the result of legacy code.
The underlying voxel grid system uses Vector3int32 (Vector3).
]]
local Workspace = game:GetService("Workspace")
local Terrain = Workspace.Terrain
-- Create a simple terrain region (a 10x10x10 block of grass)
local initialRegion = Region3.new(Vector3.zero, Vector3.one * 10)
Terrain:FillRegion(initialRegion, 4, Enum.Material.Grass)
-- Copy the region using Terrain:CopyRegion
local copyRegion = Region3int16.new(Vector3int16.new(0, 0, 0), Vector3int16.new(10, 10, 10))
local copiedRegion = Terrain:CopyRegion(copyRegion)
-- Define where to paste the region (in this example, offsetting by 5 studs on the X-axis)
local newRegionCorner = Vector3int16.new(5, 0, 0)
-- Paste the region using Terrain:PasteRegion
Terrain:PasteRegion(copiedRegion, newRegionCorner, true)
ReadVoxelChannels
Regresa un conjunto de datos de voxel de terreno en formato de tabla según los nombres de los canales.
Parámetros
Región de destino para leer. Debe estar alineado con la cuadrícula de voxel. Se lanzará un error si la región es demasiado grande; el límite es actualmente 4194304 voxels³.
Resolución de Voxel. Debe ser 4.
Array de ID de canal (cadenas) que necesitan ser accedidos desde los datos del voxel. Cada ID de canal representa un tipo de datos que se almacena en el Vóxel. Los ID actualmente admitidos son {"SolidMaterial", "SolidOccupancy", "LiquidOccupancy"} .
Devuelve
Devuelve datos de voxel como un diccionario basado en la entrada channelIds. Las llaves representan cada ID de canal con su valor respectivo como un conjunto de datos 3D.
- SolidMaterial — El material de Enum.Material del Vóxel. Nota que Water ya no se soporta; en cambio, un voxel que contiene agua tendrá un valor de 0> LiquidOccupancy0> .
- SolidOccupancy — El ocupación del material del Vóxelcomo se especifica en el canal SolidMaterial . Este es un valor entre 0 (vacío) y 1 (lleno).
- LiquidOccupancy — Escribe la ocupación del material Water en un voxel como valor entre 0 (sin agua) y 1 (lleno de agua). Si la SolidOccupancy es 1 y la SolidMaterial no es SolidOccupancy, esto será 0.
El diccionario también contiene una llave Size con un valor que representa el tamaño del 3D del valor de cada canal de datos.
Muestras de código
local REGION_START = Vector3.new(-20, -20, -20)
local REGION_END = Vector3.new(20, 20, 20)
local function printRegion(terrain, region)
local channelOutput = terrain:ReadVoxelChannels(region, 4, {"SolidOccupancy", "SolidMaterial", "LiquidOccupancy"})
local size = channelOutput.Size
for x = 1, size.X do
for y = 1, size.Y do
for z = 1, size.Z do
print(("(%2i, %2i, %2i): %.2f %s %.2f"):format(x, y, z, channelOutput.SolidOccupancy[x][y][z], channelOutput.SolidMaterial[x][y][z].Name, channelOutput.LiquidOccupancy[x][y][z]))
end
end
end
end
local region = Region3.new(REGION_START, REGION_END)
printRegion(workspace.Terrain, region)
ReadVoxels
Regresa una región determinada de terreno liso en formato de tabla.
Parámetros
Región de destino para leer. Debe estar alineado con la cuadrícula de voxel. Se lanzará un error si la región es demasiado grande. El límite es actualmente 4194304 voxels^3.
Resolución de Voxel. Debe ser 4.
Devuelve
Devuelve datos de voxel sin procesar como dos 3D arrays.
- materials - Mat阵 3D de Enum.Material desde la zona de destino. También contiene un campo de tamaño, igual que las dimensiones de los mat阵 anidados.
- occupancies - Matriz 3D de valores de ocupación desde la zona de destino. También contiene un campo de tamaño, igual que las dimensiones de los arrays de nidos.
Muestras de código
local REGION_START = Vector3.new(-20, -20, -20)
local REGION_END = Vector3.new(20, 20, 20)
local function printRegion(terrain, region)
local materials, occupancies = terrain:ReadVoxels(region, 4)
local size = materials.Size -- Same as occupancies.Size
for x = 1, size.X, 1 do
for y = 1, size.Y, 1 do
for z = 1, size.Z, 1 do
print(("(%2i, %2i, %2i): %.2f %s"):format(x, y, z, occupancies[x][y][z], materials[x][y][z].Name))
end
end
end
end
local region = Region3.new(REGION_START, REGION_END)
printRegion(workspace.Terrain, region)
ReplaceMaterial
ReemplazarMaterial reemplaza el terreno de un cierto Enum.Material dentro de un Region3 con otro material. Esencialmente, es una operación de búsqueda y reemplazo en los materiales de Class.Terrain ".
Limitaciones
Cuando se llama a este método, el parámetro resolution debe ser exactamente 4. Además, el Region3 debe alinearse con la cuadrícula de materiales del terreno, es decir, los componentes de los puntos mínimo y máximo de la Region3 deben ser divibles por 4. Usa Region3:ExpandToGrid() para hacer una región compatible con esta función.
Parámetros
La región en la que se llevará a producirsela operación de reemplazo.
La resolución a la que tendrá lugar la operación de reemplazo; en este momento, debe ser exactamente 4.
El viejo material que se deberá reemplazar.
El nuevo material.
Devuelve
Muestras de código
local Workspace = game:GetService("Workspace")
local terrain = Workspace.Terrain
local region = Region3.new(Vector3.new(-20, -20, -20), Vector3.new(20, 20, 20))
local resolution = 4
local materialToReplace = Enum.Material.Grass
local replacementMaterial = Enum.Material.Asphalt
terrain:ReplaceMaterial(region, resolution, materialToReplace, replacementMaterial)
SetMaterialColor
Establece el color de material de terreno actual para el material de terreno especificado. El material de terreno cambiará su color de base hacia el color especificado.
Parámetros
Devuelve
WorldToCell
Devuelve la ubicación de la celda de la cuadrícula que contiene el punto posición .
Parámetros
Devuelve
WorldToCellPreferEmpty
Devuelve la posición de la celda de la cuadrícula que contiene la posición del punto, preferiblemente sin espacios de celda de la cuadrícula cuando la posición está en un borde de la cuadrícula.
Parámetros
Devuelve
WorldToCellPreferSolid
Devuelve la ubicación de la celda de la cuadrícula que contiene la posición del punto, preferiblemente no hay espacios no vacíos entre las filas de la cuadrícula cuando la posición está en un borde de la cuadrícula.
Parámetros
Devuelve
WriteVoxelChannels
Establece una región de terreno usando un diccionario de datos de canal de voxel.
Parámetros
Región de destino para escribir. Debe estar alineado con la cuadrícula de voxel. Se lanzará un error si la región es demasiado grande; el límite es actualmente 4194304 voxels³.
Resolución de Voxel. Debe ser 4.
Diccionario de datos de voxel similar al valor de regreso de ReadVoxelChannels() . Las llaves representan cada ID de canal con su valor respectivo como un conjunto de datos 3D. El diccionario puede admitir una o más entradas de canal.
- SolidMaterial — El material de Enum.Material del Vóxel. Nota que Water ya no se soporta; en cambio, un voxel que solo contiene agua debe ingresarse como 0> SolidMaterial = Enum.Material.Air, LiquidOccupancy = x
- SolidOccupancy — El ocupación del material del Vóxelcomo se especifica en el canal SolidMaterial . Esto debería ser un valor entre 0 (vacío) y 1 (lleno).
- LiquidOccupancy — Escribe la ocupación del material Water en un voxel como valor entre 0 (sin agua) y 1 (lleno de agua). Si la SolidOccupancy es 1 y la SolidMaterial no es SolidOccupancy, esto será 0.
Devuelve
Muestras de código
local region = Region3.new(Vector3.new(0, 0, 0), Vector3.new(64, 32, 64))
local RESOLUTION = 4
local OCC_EPSILON = 1/256
local function generateRandomTerrainInRegion(regionInput)
local region = regionInput:ExpandToGrid(4)
local size = region.Size / 4
local solidMaterials = {}
local solidOccupancies = {}
local waterOcc = {}
for x = 1, size.X do
table.insert(solidMaterials, {})
table.insert(solidOccupancies, {})
table.insert(waterOcc, {})
for y = 1, size.Y do
table.insert(solidMaterials[x], {})
table.insert(solidOccupancies[x], {})
table.insert(waterOcc[x], {})
for z = 1, size.Z do
local mat = if math.random() < 0.5 then Enum.Material.Air else Enum.Material.Sand
local occ = 0
local water = math.random()
if mat == Enum.Material.Sand then
occ = math.random() / 2 + 0.5
if occ > 1 - OCC_EPSILON then
water = 0 -- Solids cannot contain water
end
else
occ = 0
end
table.insert(solidMaterials[x][y], mat)
table.insert(solidOccupancies[x][y], occ)
table.insert(waterOcc[x][y], water)
end
end
end
return {SolidMaterial = solidMaterials, SolidOccupancy = solidOccupancies, LiquidOccupancy = waterOcc}
end
local regionContent = generateRandomTerrainInRegion(region)
workspace.Terrain:WriteVoxelChannels(region, 4, regionContent)
WriteVoxels
Establece una región determinada de terreno liso usando el formato de la tabla.
Parámetros
Región de destino para escribir. Tiene que estar alineado con la cuadrícula de voxel. Mostrará un error si la región es demasiado grande.
Resolución de Voxel. Debe ser 4.
3D array de Enum.Material. Las dimensiones deben coincidir exactamente con el tamaño de la región objetivo en voxeles.
3D array de ocupaciones de voxel (número entre 0 y 1). Las dimensiones deben coincidir exactamente con el tamaño de la región objetivo en voxels.
Devuelve
Muestras de código
local Workspace = game:GetService("Workspace")
local terrain = Workspace.Terrain
local resolution = 4
local region = Region3.new(Vector3.new(0, 0, 0), Vector3.new(16, 28, 20)):ExpandToGrid(resolution)
local materials = {
{
{
Enum.Material.CrackedLava,
Enum.Material.CrackedLava,
Enum.Material.CrackedLava,
Enum.Material.CrackedLava,
Enum.Material.CrackedLava,
},
{ Enum.Material.Rock, Enum.Material.Rock, Enum.Material.Rock, Enum.Material.Rock, Enum.Material.Rock },
{ Enum.Material.Rock, Enum.Material.Rock, Enum.Material.Rock, Enum.Material.Rock, Enum.Material.Rock },
{ Enum.Material.Sand, Enum.Material.Sand, Enum.Material.Sand, Enum.Material.Sand, Enum.Material.Sand },
{ Enum.Material.Sand, Enum.Material.Sand, Enum.Material.Sand, Enum.Material.Sand, Enum.Material.Sand },
{ Enum.Material.Mud, Enum.Material.Mud, Enum.Material.Mud, Enum.Material.Mud, Enum.Material.Mud },
{ Enum.Material.Air, Enum.Material.Air, Enum.Material.Air, Enum.Material.Air, Enum.Material.Air },
},
{
{
Enum.Material.CrackedLava,
Enum.Material.CrackedLava,
Enum.Material.CrackedLava,
Enum.Material.CrackedLava,
Enum.Material.CrackedLava,
},
{ Enum.Material.Rock, Enum.Material.Rock, Enum.Material.Rock, Enum.Material.Rock, Enum.Material.Rock },
{ Enum.Material.Rock, Enum.Material.Rock, Enum.Material.Rock, Enum.Material.Rock, Enum.Material.Rock },
{ Enum.Material.Sand, Enum.Material.Sand, Enum.Material.Sand, Enum.Material.Sand, Enum.Material.Sand },
{ Enum.Material.Sand, Enum.Material.Sand, Enum.Material.Sand, Enum.Material.Sand, Enum.Material.Sand },
{ Enum.Material.Mud, Enum.Material.Snow, Enum.Material.Snow, Enum.Material.Snow, Enum.Material.Mud },
{ Enum.Material.Air, Enum.Material.Snow, Enum.Material.Snow, Enum.Material.Snow, Enum.Material.Air },
},
{
{
Enum.Material.CrackedLava,
Enum.Material.Sand,
Enum.Material.Sand,
Enum.Material.Sand,
Enum.Material.CrackedLava,
},
{ Enum.Material.Rock, Enum.Material.Rock, Enum.Material.Rock, Enum.Material.Rock, Enum.Material.Rock },
{ Enum.Material.Rock, Enum.Material.Rock, Enum.Material.Rock, Enum.Material.Rock, Enum.Material.Rock },
{ Enum.Material.Sand, Enum.Material.Sand, Enum.Material.Sand, Enum.Material.Sand, Enum.Material.Sand },
{ Enum.Material.Sand, Enum.Material.Sand, Enum.Material.Sand, Enum.Material.Sand, Enum.Material.Sand },
{ Enum.Material.Mud, Enum.Material.Snow, Enum.Material.Snow, Enum.Material.Snow, Enum.Material.Mud },
{ Enum.Material.Air, Enum.Material.Snow, Enum.Material.Snow, Enum.Material.Snow, Enum.Material.Air },
},
{
{
Enum.Material.CrackedLava,
Enum.Material.CrackedLava,
Enum.Material.CrackedLava,
Enum.Material.CrackedLava,
Enum.Material.CrackedLava,
},
{ Enum.Material.Rock, Enum.Material.Rock, Enum.Material.Rock, Enum.Material.Rock, Enum.Material.Rock },
{ Enum.Material.Rock, Enum.Material.Rock, Enum.Material.Rock, Enum.Material.Rock, Enum.Material.Rock },
{ Enum.Material.Sand, Enum.Material.Sand, Enum.Material.Sand, Enum.Material.Sand, Enum.Material.Sand },
{ Enum.Material.Sand, Enum.Material.Sand, Enum.Material.Sand, Enum.Material.Sand, Enum.Material.Sand },
{ Enum.Material.Mud, Enum.Material.Mud, Enum.Material.Mud, Enum.Material.Mud, Enum.Material.Mud },
{ Enum.Material.Air, Enum.Material.Air, Enum.Material.Air, Enum.Material.Air, Enum.Material.Air },
},
}
local occupancies = {
{
{ 1, 1, 1, 1, 1 },
{ 1, 1, 1, 1, 1 },
{ 1, 1, 1, 1, 1 },
{ 1, 1, 1, 1, 1 },
{ 1, 1, 1, 1, 1 },
{ 0.5, 0.5, 0.5, 0.5, 0.5 },
{ 0, 0, 0, 0, 0 },
},
{
{ 1, 1, 1, 1, 1 },
{ 1, 1, 1, 1, 1 },
{ 1, 1, 1, 1, 1 },
{ 1, 1, 1, 1, 1 },
{ 1, 1, 1, 1, 1 },
{ 0.5, 1, 1, 1, 0.5 },
{ 0, 1, 1, 1, 0 },
},
{
{ 1, 1, 1, 1, 1 },
{ 1, 1, 1, 1, 1 },
{ 1, 1, 1, 1, 1 },
{ 1, 1, 1, 1, 1 },
{ 1, 1, 1, 1, 1 },
{ 0.5, 1, 1, 1, 0.5 },
{ 0, 1, 1, 1, 0 },
},
{
{ 1, 1, 1, 1, 1 },
{ 1, 1, 1, 1, 1 },
{ 1, 1, 1, 1, 1 },
{ 1, 1, 1, 1, 1 },
{ 1, 1, 1, 1, 1 },
{ 0.5, 0.5, 0.5, 0.5, 0.5 },
{ 0, 0, 0, 0, 0 },
},
}
terrain:WriteVoxels(region, resolution, materials, occupancies)
local REGION_START = Vector3.new(-20, -20, -20)
local REGION_END = Vector3.new(20, 20, 20)
local CFRAME = CFrame.new(0, 20, 0)
local SIZE = 50
local function getRegionVolumeVoxels(region)
local resolution = 4
local size = region.Size
return (size.x / resolution) * (size.y / resolution) * (size.z / resolution)
end
local function isRegionTooLargeForReadWriteVoxels(region)
return getRegionVolumeVoxels(region) > 4194304
end
local function isRegionTooLarge(region)
return getRegionVolumeVoxels(region) > 67108864
end
-- Helper function to get an axis-aligned Region3 from the given cframe and size
local function getAABBRegion(cframe, size)
local inv = cframe:Inverse()
local x = size * inv.RightVector
local y = size * inv.UpVector
local z = size * inv.LookVector
local w = math.abs(x.X) + math.abs(x.Y) + math.abs(x.Z)
local h = math.abs(y.X) + math.abs(y.Y) + math.abs(y.Z)
local d = math.abs(z.X) + math.abs(z.Y) + math.abs(z.Z)
local pos = cframe.Position
local halfSize = Vector3.new(w, h, d) / 2
return Region3.new(pos - halfSize, pos + halfSize):ExpandToGrid(4)
end
-- Specific functions for checking individual methods
local function isRegionTooLargeForFillBall(cframe, radius)
local diameter = radius * 2
return isRegionTooLarge(getAABBRegion(cframe, Vector3.new(diameter, diameter, diameter)))
end
local function isRegionTooLargeForFillBlock(cframe, size)
return isRegionTooLarge(getAABBRegion(cframe, size))
end
local function isRegionTooLargeForFillCylinder(cframe, height, radius)
local diameter = radius * 2
return isRegionTooLarge(getAABBRegion(cframe, Vector3.new(diameter, height, diameter)))
end
local function isRegionTooLargeForFillRegion(region)
return isRegionTooLarge(region)
end
local function isRegionTooLargeForFillWedge(cframe, size)
return isRegionTooLarge(getAABBRegion(cframe, size))
end
local function isRegionTooLargeForReplaceMaterial(region)
return isRegionTooLarge(region)
end
local region = Region3.new(REGION_START, REGION_END)
print(isRegionTooLargeForReadWriteVoxels(region))
print(isRegionTooLargeForFillBall(CFRAME, SIZE))
print(isRegionTooLargeForFillBlock(CFRAME, SIZE))
print(isRegionTooLargeForFillCylinder(CFRAME, SIZE, SIZE))
print(isRegionTooLargeForFillRegion(region))
print(isRegionTooLargeForFillWedge(CFRAME, SIZE))
print(isRegionTooLargeForReplaceMaterial(region))