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 morfables con poco o ningún retraso.Actualmente se basa en una cuadrícula de 4×4×4 de células, donde cada celda tiene un número entre 0 y 1 que representa cuánto debería ocupar la geometría la celda y el material de la celda.La ocupación determina cómo la celda se transformará junto con las células circundantes, y el resultado es la ilusión de no tener ninguna restricción de red.
Para obtener más información, vea Terreno.
Resumen
Propiedades
Habilita o deshabilita la decoración del terreno.
Specifica la longitud de la hierba animada.
MaterialColors representa al editor para la función de color de 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 editable más grande posible.
El tinte del agua del terreno.
Controla cuán opaca son las reflecciones 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 cuántas veces se moverán las olas de agua del terreno hacia arriba y hacia abajo por minuto.
Determina si una parte es inmóvil por la física.
La velocidad angular de la montura de la pieza.
El centro de masa de la montura de la parte en el espacio mundial.
La velocidad lineal de la montura de la pieza.
La masa total de la montura de la parte.
Una referencia a la parte raíz de la asamblea.
Determina si la parte interactuará físicamente con la simulación de audio, similar a CastShadow para iluminación.
Determina el tipo de superficie para la cara trasera de una pieza.
Determina el tipo de superficie para la cara inferior de una parte.
Determina el color de una parte.
Determina la posición y orientación del BasePart en el mundo.
Determina si una parte puede chocar con otras partes.
Determina si la parte se considera durante las operaciones de consulta espacial.
Determina si Touched y TouchEnded eventos de fuego en la parte.
Determina si una parte lanza una sombra o no.
Describe la posición mundial en la que se encuentra el centro de masa de una parte.
Describe el nombre del 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 activar o desactivar las fuerzas aerodinámicas en piezas y ensamblajes.
El tamaño físico real del BasePart como lo considera el motor de física.
Determina el tipo de superficie para la cara frontal de una parte.
Determina el tipo de superficie para el lado izquierdo de una pieza.
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 total o a la inercia de su cuerpo rígido.
Determina la textura y las propiedades físicas predeterminadas de una parte.
El nombre de MaterialVariant.
Describe la rotación de la parte en el mundo.
Specifica el desplazamiento del pivote 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 cuánto refleja una parte la caja de cielo.
Describe el cambio más pequeño en el tamaño permitido por el método Resize().
Describe las caras en las que una parte puede ser redimensionada.
Determina el tipo de superficie para el lado derecho de una pieza.
La regla principal para determinar la parte raíz de una asamblea.
La rotación de la pieza 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 pieza.
Determina cuánto se puede ver una parte a través de ella (la inversa de la opacidad de la parte).
Métodos
Devuelve la posición mundial del centro de la celda de terreno (x, y, z).
Devuelve la posición del borde inferior izquierdo hacia adelante de la celda de la cuadrícula (x, y, z).
Despeja el terreno.
Almacena un trozo de terreno en un objeto TerrainRegion para que se pueda cargar de nuevo más tarde.Nota: TerrainRegion los datos no se replican entre el servidor y el cliente.
Devuelve el número de celdas no vacías en el terreno.
Llena una bola de terreno liso en un espacio dado.
Llena un bloque de terreno liso con una ubicación, rotación, tamaño y material dados.
Llena un cilindro de terreno liso en un espacio dado.
Llena un espacio Region3 con terreno liso.
Llena un volumen en forma de cuña de terreno con el dado Enum.Material y el marco y el tamaño de la zona.
Devuelve el color del material del terreno actual para el material del terreno especificado.
- IterateVoxelsAsync_beta(region : Region3,resolution : number,channelIds : Array):TerrainIterateOperation
- ModifyVoxelsAsync_beta(region : Region3,resolution : number,channelIds : Array):TerrainModifyOperation
Aplica un trozo de terreno al objeto de terreno. Nota: TerrainRegion los datos no se replican entre el servidor y el cliente.
Devuelve una región de datos de vóxel de terreno en formato tabla basada en los nombres de los canales.
Devuelve una cierta región de terreno liso en formato de tabla.
- ReplaceMaterial(region : Region3,resolution : number,sourceMaterial : Enum.Material,targetMaterial : Enum.Material):()
Reemplaza el terreno de un material dentro de una región con otro material.
Establece el color del material del terreno actual para el material del terreno especificado.
Devuelve la ubicación de la celda de la cuadrícula que contiene la posición de punto **** .
Devuelve la ubicación de la celda de la cuadrícula que contiene la posición del punto, prefiriendo celdas de cuadrícula vacías cuando la posición está en el borde de la cuadrícula.
Devuelve la ubicación de la celda de la cuadrícula que contiene la posición del punto, prefiriendo celdas de cuadrícula no vacías cuando la posición está en el borde de la cuadrícula.
Establece una región de terreno usando un diccionario de datos de canal de voxel.
Establece una cierta región de terreno liso usando el formato de tabla.
- WriteVoxelsAsync_beta(region : Region3,resolution : number,channelIds : Array):TerrainWriteOperation
Aplica un impulso angular a la montura.
Aplica un impulso a la asamblea en la asamblea center of mass .
Aplica un impulso a la montura en la posición especificada.
Devuelve si las partes pueden chocar entre sí.
Comprueba si puedes establecer la propiedad de red de una parte.
Devuelve una tabla de partes conectadas al objeto por cualquier tipo de articulaciónrígida.
Devuelve todas las juntas o restricciones que estén conectadas 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 nil en caso del servidor.
Devuelve verdadero si el motor de juegos decide automáticamente al propietario de la red para esta parte.
Devuelve la parte base de una colección de partes.
Devuelve una tabla de todas las BasePart.CanCollide piezas verdaderas que se intersectan con esta parte.
Devuelve la velocidad lineal de la montura de la pieza en la posición dada con respecto a esta pieza.
Devuelve verdadero si el objeto está conectado a una parte que lo mantendrá en su lugar (por ejemplo, una parte Anchored), de lo contrario devuelve falso.
Cambia el tamaño de un objeto al igual que usando la herramienta de redimensionamiento de Studio.
Establece al jugador dado como propietario de la red para esto y todas las piezas conectadas.
Permite que el motor de juegos decida dinámicamente quién manejará la física de la parte (uno de los clientes o el servidor).
- IntersectAsync(parts : Instances,collisionfidelity : Enum.CollisionFidelity,renderFidelity : Enum.RenderFidelity):Instance
Crea un nuevo IntersectOperation de la geometría superpuesta de la pieza y de las otras piezas en el matriz/listadado.
- SubtractAsync(parts : Instances,collisionfidelity : Enum.CollisionFidelity,renderFidelity : Enum.RenderFidelity):Instance
Crea un nuevo UnionOperation de la parte, menos la geometría ocupada por las piezas en el matriz/listadado.
- UnionAsync(parts : Instances,collisionfidelity : Enum.CollisionFidelity,renderFidelity : Enum.RenderFidelity):Instance
Crea un nuevo UnionOperation de la parte, más la geometría ocupada por las piezas en el matriz/listadado.
Obtiene el pivote de un PVInstance .
Transforma el PVInstance junto con todos sus descendientes PVInstances de tal manera que el pivote ahora se encuentra en el punto especificado CFrame.
Eventos
Eventos heredados de BasePartSe enciende cuando una parte deja de tocar a otra parte como resultado de un movimiento físico.
Se enciende cuando una parte toca a otra parte como resultado de un movimiento físico.
Propiedades
Decoration
Actualmente habilita o deshabilita la hierba animada en el material de terreno Césped , aunque las futuras modificaciones de esta propiedad pueden controlar características decorativas adicionales.
GrassLength
Specifica la longitud de la hierba animada en el material del terreno Césped , asumiendo que Decoration está habilitado. Los valores válidos están entre 0.1 y 1.
MaterialColors
MaterialColors representa al editor para la función de color de 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, utilice: Terrain:SetMaterialColor()
WaterWaveSize
Establece la altura máxima de las olas de agua del terreno en studs. Esto está actualmente restringido entre 0 y 1.
WaterWaveSpeed
Establece cuántas veces las olas de agua del terreno se moverán hacia arriba y hacia abajo por minuto. Esto está actualmente restringido 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
Devuelve la posición del borde inferior izquierdo hacia adelante de la celda de la cuadrícula (x, y, z).
Parámetros
Devuelve
Clear
Despeja el terreno.
Devuelve
ClearVoxelsAsync_beta
Parámetros
Devuelve
CopyRegion
Almacena un trozo de terreno en un objeto TerrainRegion para que se pueda cargar de nuevo más tarde.Nota: TerrainRegion los datos no se replican entre el servidor y el cliente.
Parámetros
Devuelve
Muestras de código
The following code will copy the whole Terrain and clear it. After 5 seconds it will paste the terrain back.
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 una bola 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
Terrain:FillBall() creates a ball of terrain given a center position, ball radius, and terrain materials.
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
Llena un bloque de terreno liso con una ubicación, rotación, tamaño y material dados.
Parámetros
La posición y orientación del bloque de terreno.
El tamaño en studs del bloque cuadrado - tanto la altura como el ancho.
El Enum.Material del bloque de terreno.
Devuelve
FillCylinder
Llena un cilindro de terreno liso en un espacio dado. El espacio se define usando un marco C, altura y radio.
local Workspace = game:GetService("Workspace")Workspace.Terrain:FillCylinder(CFrame.new(0, 50, 0), 5, 30, Enum.Material.Asphalt)
Parámetros
La posición y orientación del cilindro de terreno.
La altura en studs del cilindro de terreno.
El radio en studs del cilindro de terreno.
El Enum.Material de la cilindro de terreno.
Devuelve
FillRegion
Llena un espacio Region3 con terreno liso.
Parámetros
Devuelve
FillWedge
llena un volumen en forma de cuña de con el dado y el tamaño y la cantidad de la región.La orientación del cuña es la misma que una equivalente WedgePart .
Parámetros
La posición y orientación del cuña para llenar.
El tamaño del cuña para llenar.
El material con el que se rellenará la cuña.
Devuelve
GetMaterialColor
Devuelve el color del material de terreno actual para el material de terreno especificado.
Parámetros
Devuelve
IterateVoxelsAsync_beta
Parámetros
Devuelve
ModifyVoxelsAsync_beta
Parámetros
Devuelve
PasteRegion
Aplica un trozo de terreno al objeto de terreno. Nota: TerrainRegion los datos no se replican entre el servidor y el cliente.
Parámetros
Devuelve
Muestras de código
Creates some terrain, copies it, then pastes it using the following API:
--[[
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
Devuelve una región de datos de vóxel de terreno en formato tabla basada en los nombres de los canales.
Parámetros
Región objetivo para leer. Debe alinearse con la cuadrícula de vóxeles. Arrojará un error si la región es demasiado grande; el límite actual es 4194304 vóxeles³.
Resolución de vóxel. Debe ser 4.
Arr列 de ID de canal (textos) que deben ser accedidos desde los datos de voxel.Cada ID de canal representa un tipo de dato que se almacena en voxel.Las IDs admitidas actuales son {"SolidMaterial", "SolidOccupancy", "LiquidOccupancy"} .
Devuelve
Devuelve datos de vóxel como diccionario basado en la entrada channelIds. Las claves representan cada ID de canal con su respectivo valor como un array de datos 3D.
- SolidMaterial — El material Enum.Material del vóxel.Tenga en cuenta que Water ya no se admite; en cambio, un vóxel que contenga agua tendrá un valor de LiquidOccupancy .
- SolidOccupancy — La ocupación del material del vóxel especificado en el canal SolidMaterial. Este es un valor entre 0 (vacío) y 1 (lleno).
La diccionario también contiene una clave Size con un valor que representa el tamaño de la matriz 3D de cada dato de canal.
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
Devuelve una cierta región de terreno liso en formato de tabla.
Parámetros
Región objetivo para leer. Debe alinearse con la cuadrícula de vóxeles. Arrojará un error si la región es demasiado grande. El límite es actualmente 4194304 vóxeles^3.
Resolución de vóxel. Debe ser 4.
Devuelve
Devuelve datos de vóxel crudos como dos arreglos 3D.
- materials - 3D array de Enum.Material del área de destino. También contiene un campo de tamaño, igual a las dimensiones de los arrays anidados.
- occupancies - 3D array de valores de ocupación de la zona objetivo. También contiene un campo de tamaño, igual a las dimensiones de los arrays anidados.
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 -- Igual que las ocupaciones.Tamaño
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)
ReadVoxelsAsync_beta
Parámetros
Devuelve
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 Terrain materiales.
Limitaciones
Al llamar este método, el parámetro resolution debe ser exactamente 4.Además, la Región3 debe alinearse con la cuadrícula de materiales de terreno, es decir,los componentes de los puntos mínimos y máximos de la Región3 deben ser divisibles por 4.Usa Region3:ExpandToGrid() para hacer una región compatible con esta función.
Parámetros
La región en la que ocurrirá la operación de reemplazo.
La resolución en la que se llevará a cabo la operación de reemplazo; en este momento debe ser exactamente 4.
El material antiguo que debe reemplazarse.
El nuevo material.
Devuelve
Muestras de código
This code sample demonstrates the usage of Terrain:ReplaceMaterial() by replacing grass near the game origin with asphalt. It does this by constructing a Region3 using two Vector3s.
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 del material del terreno actual para el material del terreno especificado. El material del terreno cambiará su color base hacia el color especificado.
Parámetros
Devuelve
WorldToCell
Devuelve la ubicación de la celda de la cuadrícula que contiene la posición de punto **** .
Parámetros
Devuelve
WorldToCellPreferEmpty
Devuelve la ubicación de la celda de la cuadrícula que contiene la posición del punto, prefiriendo celdas de cuadrícula vacías cuando la posición está en el 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, prefiriendo celdas de cuadrícula no vacías cuando la posición está en el 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 objetivo para escribir. Debe alinearse con la cuadrícula de vóxeles. Arrojará un error si la región es demasiado grande; el límite actual es 4194304 vóxeles³.
Resolución de vóxel. Debe ser 4.
Diccionario de datos de voxel similar al valor de devolución de ReadVoxelChannels() .Las claves representan cada ID de canal con su respectivo valor como un conjunto de 3D de datos.La diccionario puede admitir entradas de un solo o múltiples canales.
- SolidMaterial — El material Enum.Material del vóxel.Tenga en cuenta que Water ya no se admite; en cambio, un voxel que contenga solo agua debe ingresarse como SolidMaterial = Enum.Material.Air, LiquidOccupancy = x , donde x es un número entre 0 (exclusivo) y 1 (inclusivo).
- SolidOccupancy — La ocupación del material del vóxel especificado en el canal SolidMaterial. Este debe ser un valor entre 0 (vacío) y 1 (lleno).
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 cierta región de terreno liso usando el formato de tabla.
Parámetros
Región objetivo para escribir. Debe alinearse con la cuadrícula de vóxeles. Arrojará un error si la región es demasiado grande.
Resolución de vóxel. Debe ser 4.
El array 3D de Enum.Material. Dimensions debe 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 voxeles.
Devuelve
Muestras de código
Ejemplo
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)
Many terrain methods throw an error if their given region size is too large. The limit is currently 4194304 voxels^3 for ReadVoxels() and WriteVoxels(), and 67108864 voxels^3 for other methods. For methods that take a cframe + size combination (e.g. FillBlock, FillCylinder etc.), then the region volume is calculated from the AABB of the target area.
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))