Terrain
*Este conteúdo é traduzido por IA (Beta) e pode conter erros. Para ver a página em inglês, clique aqui.
O terreno permite que você crie ambientes dinâmicos morfáveis com pouco ou nenhum atraso.Atualmente, é baseado em uma grade 4×4×4 de células, onde cada célula tem um número entre 0 e 1 que representa quanto a geometria deve ocupar a célula e o material da célula.A ocupação determina como a célula se transformará junto com as células circundantes, e o resultado é a ilusão de não ter restrição de grade.
Para mais informações, veja Terreno.
Resumo
Propriedades
Ativa ou desativa a decoração de terreno.
Specifica o comprimento da grama animada.
MaterialColors representa o editor para a funcionalidade de Cor do Material e não pode ser editado por scripts .
Para obter a cor de um material, use: Terrain:GetMaterialColor() Para definir a cor de um material, use: Terrain:SetMaterialColor()
Mostra os limites da região editável mais grande possível.
A tonalidade da água do Terreno.
Controla quão opaca as reflexões de água do Terreno são.
A transparência da água do Terreno.
Define a altura máxima das ondas de água do Terreno em studs.
Define quantas vezes as ondas de água do terreno se moverão para cima e para baixo a cada minuto.
Determina se uma peça é imóvel pela física.
A velocidade angular da montagem da peça.
O centro de massa da montagem da peça no espaço mundial.
A velocidade linear da montagem da peça.
A massa total da montagem da peça.
Uma referência à parte raiz da montagem.
Determina se a peça vai interagir fisicamente com a simulação de áudio, semelhante a CastShadow para iluminação.
Determina o tipo de superfície para a face traseira de uma peça.
Determina o tipo de superfície para a face inferior de uma peça.
Determina a cor de uma peça.
Determina a posição e orientação do BasePart na mundo.
Determina se uma peça pode colidir com outras peças.
Determina se a peça é considerada durante as operações de consulta espacial.
Determina se Touched e TouchEnded eventos atiram na parte.
Determina se uma peça lança ou não uma sombra.
Descreve a posição mundial em que o centro de massa de uma peça está localizado.
Descreve o nome do grupo de colisão de uma peça.
Determina a cor de uma peça.
Indica as propriedades físicas atuais da peça.
Determina várias propriedades físicas de uma peça.
Usado para ativar ou desativar forças aerodinâmicas em peças e montagens.
O tamanho físico real do BasePart como considerado pelo motor de física.
Determina o tipo de superfície para a face frontal de uma peça.
Determina o tipo de superfície para a face esquerda de uma peça.
Determina um multiplicador para BasePart.Transparency que só é visível ao cliente local.
Determina se uma peça é selecionável no Studio.
Descreve a massa da peça, o produto de sua densidade e volume.
Determina se a peça contribui para a massa total ou inércia de seu corpo rígido.
Determina a textura e as propriedades físicas padrão de uma peça.
O nome de MaterialVariant .
Descreve a rotação da peça no mundo.
Specifica o deslocamento do pivô da peça de sua CFrame .
Descreve a posição da peça no mundo.
Tempo desde a última atualização de física registrada.
Determina quanto uma parte reflete a skybox.
Descreve a menor mudança de tamanho permitida pelo método Resize().
Descreve os rostos em que uma peça pode ser redimensionada.
Determina o tipo de superfície para o lado direito de uma peça.
A regra principal na determinação da parte raiz de uma montagem.
A rotação da peça em graus para os três eixos.
Determina as dimensões de uma peça (comprimento, largura, altura).
Determina o tipo de superfície para a face superior de uma peça.
Determina quanto uma peça pode ser vista através (o oposto da opacidade da peça).
Métodos
Retorna a posição mundial do centro da célula de terreno (x, y, z).
Retorna a posição do canto inferior esquerdo para frente da célula de grade (x, y, z).
Limpa o terreno.
Armazena um pedaço de terreno em um objeto TerrainRegion para que possa ser carregado de volta mais tarde.Nota: TerrainRegion dados não se replicam entre o servidor e o cliente.
Retorna o número de células não vazias no Terreno.
Preenche uma bola de terreno liso em um espaço dado.
Preenche um bloco de terreno liso com uma localização, rotação, tamanho e material dados.
Preenche um cilindro de terreno liso em um espaço dado.
Preenche um espaço Region3 com terreno liso.
Preenche um volume em forma de cunha de Terreno com o dado Enum.Material e o CFrame e o tamanho da área.
Retorna a cor do material do terreno atual para o material de terreno especificado.
- IterateVoxelsAsync_beta(region : Region3,resolution : number,channelIds : Array):TerrainIterateOperation
- ModifyVoxelsAsync_beta(region : Region3,resolution : number,channelIds : Array):TerrainModifyOperation
Aplica um pedaço de terreno ao objeto Terreno. Nota: TerrainRegion dados não se replicam entre o servidor e o cliente.
Retorna uma região de dados de terreno em formato de tabela com base nos nomes dos canais.
Retorna uma determinada região de terreno liso no formato de tabela.
- ReplaceMaterial(region : Region3,resolution : number,sourceMaterial : Enum.Material,targetMaterial : Enum.Material):()
Substitui o terreno de um material dentro de uma região por outro material.
Define a cor do material do terreno atual para o material de terreno especificado.
Retorna a localização da célula de grade que contém a posição do ponto **** .
Retorna a localização da célula de grade que contém a posição do ponto, preferindo células de grade vazias quando a posição está em uma borda de grade.
Retorna a localização da célula de grade que contém a posição do ponto, preferindo células de grade não vazias quando a posição está em uma borda de grade.
Define uma região de terreno usando um dicionário de dados de canal de voxel.
Define uma determinada região de terreno liso usando o formato de tabela.
- WriteVoxelsAsync_beta(region : Region3,resolution : number,channelIds : Array):TerrainWriteOperation
Aplique um impulso angular à montagem.
Aplique um impulso à montagem na montagem center of mass .
Aplique um impulso à montagem em posição especificada.
Retorna se as peças podem colidir entre si.
Verifica se você pode definir a propriedade de rede de uma peça.
Retorna uma tabela de peças conectadas ao objeto por qualquer tipo de articulaçãorígida.
Retorne todos os Juntos ou Restrições que estão conectados a esta Parte.
Retorna o valor da propriedade Mass de retorno.
Retorna o jogador atual que é o proprietário da rede desta parte ou nil no caso do servidor.
Retorna verdadeiro se o motor de jogo decidir automaticamente o proprietário da rede para esta parte.
Retorna a parte base de uma montagem de peças.
Retorna uma tabela de todas as BasePart.CanCollide peças verdadeiras que se intersectam com esta peça.
Retorna a velocidade linear da montagem da peça na posição dada em relação a esta peça.
Retorna verdadeiro se o objeto estiver conectado a uma parte que o manterá no lugar (por exemplo, uma parte Anchored), caso contrário, retorna falso.
Muda o tamanho de um objeto assim como usar a ferramenta de redimensionamento do Studio.
Define o jogador dado como proprietário da rede para isso e todas as peças conectadas.
Permite que o motor do jogo decida dinamicamente quem vai lidar com a física da peça (um dos clientes ou do servidor).
- IntersectAsync(parts : Instances,collisionfidelity : Enum.CollisionFidelity,renderFidelity : Enum.RenderFidelity):Instance
Cria um novo IntersectOperation a partir da geometria sobreposta da peça e das outras peças no matriz / listadado.
- SubtractAsync(parts : Instances,collisionfidelity : Enum.CollisionFidelity,renderFidelity : Enum.RenderFidelity):Instance
Cria um novo UnionOperation a partir da peça, menos a geometria ocupada pelas peças no matriz / listadado.
- UnionAsync(parts : Instances,collisionfidelity : Enum.CollisionFidelity,renderFidelity : Enum.RenderFidelity):Instance
Cria um novo UnionOperation a partir da peça, mais a geometria ocupada pelas peças no matriz / listadado.
Obtém o pivô de um PVInstance .
Transforma o PVInstance ao longo de todos os seus descendentes PVInstances de modo que o pivô agora está localizado no CFrame especificado.
Eventos
Eventos herdados de BasePartIncêndios quando uma parte para de tocar outra parte como resultado de um movimento físico.
Incêndios quando uma parte toca outra parte como resultado de um movimento físico.
Propriedades
Decoration
Atualmente ativa ou desativa grama animada no material do terreno Grama , embora modificações futuras dessa propriedade possam controlar características decorativas adicionais.
GrassLength
Specifica o comprimento da grama animada no material do terreno Grama , assumindo que Decoration esteja habilitado. Os valores válidos estão entre 0.1 e 1.
MaterialColors
MaterialColors representa o editor para a funcionalidade de Cor do Material e não pode ser editado por scripts .
Para obter a cor de um material, use: Terrain:GetMaterialColor()
Para definir a cor de um material, use: Terrain:SetMaterialColor()
WaterWaveSize
Define a altura máxima das ondas de água do Terreno em studs. Isso é atualmente restrito entre 0 e 1.
WaterWaveSpeed
Define quantas vezes as ondas de água do terreno se moverão para cima e para baixo a cada minuto. Isso é atualmente restrito entre 0 e 100.
Métodos
CellCenterToWorld
Retorna a posição mundial do centro da célula de terreno (x, y, z).
Parâmetros
Devolução
CellCornerToWorld
Retorna a posição do canto inferior esquerdo para frente da célula de grade (x, y, z).
Parâmetros
Devolução
Clear
Limpa o terreno.
Devolução
ClearVoxelsAsync_beta
Parâmetros
Devolução
CopyRegion
Armazena um pedaço de terreno em um objeto TerrainRegion para que possa ser carregado de volta mais tarde.Nota: TerrainRegion dados não se replicam entre o servidor e o cliente.
Parâmetros
Devolução
Amostras 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
Preenche uma bola de terreno liso em um espaço dado.
Parâmetros
A posição do centro da bola de terreno.
O raio em studs da bola de terreno.
O Enum.Material da bola de terreno .
Devolução
Amostras 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
Preenche um bloco de terreno liso com uma localização, rotação, tamanho e material dados.
Parâmetros
A posição e orientação do bloco de terreno.
O tamanho em studs do bloco quadrado - tanto a altura quanto a largura.
O Enum.Material do bloco de terreno.
Devolução
FillCylinder
Preenche um cilindro de terreno liso em um espaço dado. O espaço é definido usando um CFrame, altura e raio.
local Workspace = game:GetService("Workspace")Workspace.Terrain:FillCylinder(CFrame.new(0, 50, 0), 5, 30, Enum.Material.Asphalt)
Parâmetros
A posição e orientação do cilindro de terreno.
A altura em studs do cilindro de terreno.
O raio em studs do cilindro de terreno.
O Enum.Material da cilindro de terreno.
Devolução
FillRegion
Preenche um espaço Region3 com terreno liso.
Parâmetros
Devolução
FillWedge
preenche um volume em forma de cunha de com o dado e o tamanho e a área da área.A orientação da cunha é a mesma de um equivalente WedgePart .
Parâmetros
A posição e orientação da cunha para preencher.
O tamanho do cunha para preencher.
O material com o qual a cunha será preenchida.
Devolução
GetMaterialColor
Retorna a cor do material de terreno atual para o material de terreno especificado.
Parâmetros
Devolução
IterateVoxelsAsync_beta
Parâmetros
Devolução
ModifyVoxelsAsync_beta
Parâmetros
Devolução
PasteRegion
Aplica um pedaço de terreno ao objeto Terreno. Nota: TerrainRegion dados não se replicam entre o servidor e o cliente.
Parâmetros
Devolução
Amostras 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
Retorna uma região de dados de terreno em formato de tabela com base nos nomes dos canais.
Parâmetros
Região alvo para ler. Deve estar alinhada à grade de voxel. Será lançado um erro se a região for muito grande; o limite é atualmente 4194304 voxels³.
Resolução de voxel. Deve ser 4.
Array de IDs de canal ( strings ) que precisam ser acessados a partir dos dados do voxel.Cada ID de canal representa um tipo de dado que é armazenado em voxel.Os IDs suportados atuais são {"SolidMaterial", "SolidOccupancy", "LiquidOccupancy"} .
Devolução
Retorna dados de voxel como um dicionário com base na entrada channelIds. As chaves representam cada ID de canal com seu respectivo valor como um array de dados 3D.
- SolidMaterial — O material Enum.Material da voxela.Observe que Water não é mais suportado; em vez disso, um voxel que contém água terá um valor de LiquidOccupancy .
- SolidOccupancy — A ocupação do material do voxel como especificado no canal SolidMaterial. Este é um valor entre 0 (vazio) e 1 (completo).
O dicionário também contém uma chave Size com um valor que representa o tamanho do arranjo 3D de cada dado de canal.
Amostras 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
Retorna uma determinada região de terreno liso no formato de tabela.
Parâmetros
Região alvo para ler. Deve estar alinhada à grade de voxel. Será lançado um erro se a região for muito grande. O limite é atualmente 4194304 voxels^3.
Resolução de voxel. Deve ser 4.
Devolução
Retorna dados brutos de voxel como dois arrays 3D.
- materials - 3D array de Enum.Material da área alvo. Também contém um campo de Tamanho, igual às dimensões dos arrays aninhados.
- occupancies - 3D array de valores de ocupação da área alvo. Também contém um campo de Tamanho, igual às dimensões dos arrays aninhados.
Amostras 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 -- O mesmo que ocupações.Tamanho
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
Devolução
ReplaceMaterial
O ReplaceMaterial substitui o terreno de um determinado Enum.Material dentro de um Region3 com outro material.Basicamente, é uma operação de busca e substituição em Terrain materiais.
Con restricções
Ao chamar este método, o parâmetro resolution deve ser exatamente 4.Além disso, a Região3 deve estar alinhada à grade de materiais de terreno, ou seja:os componentes dos pontos mínimo e máximo da Região3 devem ser divisíveis por 4.Use Region3:ExpandToGrid() para tornar uma região compatível com essa função.
Parâmetros
A região em que a operação de substituição ocorrerá.
A resolução em que a operação de substituição ocorrerá; no momento este deve ser exatamente 4.
O material antigo que deve ser substituído.
O novo material.
Devolução
Amostras 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
Define a cor do material do terreno atual para o material de terreno especificado. O material do terreno mudará sua cor base para a cor especificada.
Parâmetros
Devolução
WorldToCell
Retorna a localização da célula de grade que contém a posição do ponto **** .
Parâmetros
Devolução
WorldToCellPreferEmpty
Retorna a localização da célula de grade que contém a posição do ponto, preferindo células de grade vazias quando a posição está em uma borda de grade.
Parâmetros
Devolução
WorldToCellPreferSolid
Retorna a localização da célula de grade que contém a posição do ponto, preferindo células de grade não vazias quando a posição está em uma borda de grade.
Parâmetros
Devolução
WriteVoxelChannels
Define uma região de terreno usando um dicionário de dados de canal de voxel.
Parâmetros
Região alvo para escrever. Deve estar alinhada à grade de voxel. Será lançado um erro se a região for muito grande; o limite é atualmente 4194304 voxels³.
Resolução de voxel. Deve ser 4.
Dicionário de dados de voxel semelhante ao valor de retorno de ReadVoxelChannels() .Chaves representam cada ID de canal com seu respectivo valor como um conjunto de dados 3D.O dicionário pode suportar entradas de canal único ou múltiplo.
- SolidMaterial — O material Enum.Material da voxela.Observe que Water não é mais suportado; em vez disso, um voxel que contém apenas água deve ser inserido como SolidMaterial = Enum.Material.Air, LiquidOccupancy = x, onde x é um número entre 0 (exclusivo) e 1 (inclusivo).
- SolidOccupancy — A ocupação do material do voxel como especificado no canal SolidMaterial. Este deve ser um valor entre 0 (vazio) e 1 (completo).
Devolução
Amostras 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
Define uma determinada região de terreno liso usando o formato de tabela.
Parâmetros
Região alvo para escrever. Deve estar alinhada à grade de voxel. Será lançado um erro se a região for muito grande.
Resolução de voxel. Deve ser 4.
O arranjo 3D de Enum.Material. Dimensions deve exatamente corresponder ao tamanho da região alvo em voxels.
3D array de ocupações de voxel (numbero entre 0 e 1). As dimensões devem exatamente corresponder ao tamanho da região alvo em voxels.
Devolução
Amostras de código
Exemplo
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))