Terrain
*Questo contenuto è tradotto usando AI (Beta) e potrebbe contenere errori. Per visualizzare questa pagina in inglese, clicca qui.
Il terreno ti consente di creare ambienti dinamici morfabili con poco o nessun ritardo.Attualmente è basato su una griglia 4×4×4 di celle, in cui ogni cellula ha un numero compreso tra 0 e 1 che rappresenta quanto la geometria dovrebbe occupare la cellula e il materiale della cellula.L'occupazione determina come la cellula si trasformerà insieme alle celle circostanti, e il risultato è l'illusione di non avere Vincolodi griglia.
Per maggiori informazioni, vedi Terreno.
Sommario
Proprietà
Abilita o disabilita la decorazione del terreno.
Specifica la lunghezza dell'erba animata.
MaterialColors rappresenta l'editor per la ProprietàColore Materiale e non può essere modificato da script .
Per ottenere il colore di un materiale, usa: Terrain:GetMaterialColor() Per impostare il colore di un materiale, usa: Terrain:SetMaterialColor()
Mostra i confini della regione modificabile più grande possibile.
Il tono dell'acqua del terreno.
Controlla quanto sono opache le riflessioni dell'acqua del terreno.
La trasparenza dell'acqua del terreno.
Imposta l'altezza massima delle onde d'acqua del terreno in studs.
Imposta il numero di volte in cui le onde d'acqua del terreno si muovono su e giù per minuto.
Determina se una parte è immovibile per la fisica.
La velocità angolare dell'assemblaggio della parte.
Il centro di massa dell'assemblaggio della parte nello Spaziomondiale.
La velocità lineare dell'assemblaggio della parte.
La massa totale dell'assemblaggio della parte.
Un riferimento alla parte radice dell'assemblaggio.
Determina se la parte interagirà fisicamente con la simulazione audio, simile a CastShadow per l'illuminazione.
Determina il tipo di superficie per il lato posteriore di una parte.
Determina il tipo di superficie per il lato inferiore di una parte.
Determina il colore di una parte.
Determina la posizione e l'orientamento del BasePart nel Mondo.
Determina se una parte può collisionare con altre parti.
Determina se la parte viene considerata durante le operazioni di query spaziali.
Determina se Touched e TouchEnded eventi di fuoco sulla parte.
Determina se una parte lancia o meno un'ombra.
Descrive la posizione mondiale in cui si trova il centro di massa di una parte.
Descrive il nome del Gruppodi collisione di una parte.
Determina il colore di una parte.
Indica le attuali proprietà fisiche della parte.
Determina diverse proprietà fisiche di una parte.
Utilizzato per abilitare o disabilitare le forze aerodinamiche su parti e assemblaggi.
La dimensione fisica reale del BasePart come considerata dall'engine della fisica.
Determina il tipo di superficie per la faccia anteriore di una parte.
Determina il tipo di superficie per il lato sinistro di una parte.
Determina un moltiplicatore per BasePart.Transparency che è visibile solo al client locale.
Determina se una parte è selezionabile in Studio.
Descrive la massa della parte, il prodotto della sua densità e volume.
Determina se la parte contribuisce alla massa totale o all'inerzia del suo corpo rigido.
Determina la texture e le proprietà fisiche predefinite di una parte.
Il nome di MaterialVariant .
Descrive la rotazione della parte nel Mondo.
Specifica l'offset del punto di rotazione della parte dal suo CFrame .
Descrive la posizione della parte nel Mondo.
Tempo trascorso dall'ultimo Aggiornarmentodella fisica registrata.
Determina quanto una parte rifletta la skybox.
Descrive il più piccolo cambiamento nelle dimensioni consentito dal metodo Resize().
Descrive i volti su cui una parte può essere ridimensionata.
Determina il tipo di superficie per il lato destro di una parte.
La regola principale nella determinazione della parte radice di un'assemblaggio.
La rotazione della parte in gradi per i tre assi.
Determina le dimensioni di una parte (lunghezza, larghezza, altezza).
Determina il tipo di superficie per la faccia superiore di una parte.
Determina quanto una parte può essere vista attraverso (l'inverso dell'opacità della parte).
Metodi
Restituisce la posizione mondiale del centro della cellula del terreno (x, y, z).
Restituisce la posizione dell'angolo inferiore a sinistra in avanti della celle di griglia (x, y, z).
Pulisce il terreno.
Memorizza un pezzo di terreno in un oggetto TerrainRegion in modo che possa essere caricato nuovamente in seguito.Nota: TerrainRegion i dati non si replicano tra server e client.
Restituisce il numero di celle non vuote nel Terreno.
Riempe una palla di terreno liscio in uno Spaziodato.
Riempe un blocco di terreno liscio con una posizione, una rotazione, una dimensione e un materiale dato.
Riempe un cilindro di terreno liscio in uno Spaziodato.
Riempe uno spazio Region3 con terreno liscio.
Riempe un volume a forma di cuneo di Terreno con il Enum.Material dato e il CFrame e la dimensione dell'area.
Restituisce il colore del materiale del terreno attuale per il materiale del terreno specificato.
Applica un pezzo di terreno all'oggetto Terreno. Nota: TerrainRegion i dati non si replicano tra server e client.
Restituisce una regione di dati voxel del terreno in formato tabella in base ai nomi dei canali.
Restituisce una certa regione di terreno liscio nel formato tabella.
- ReplaceMaterial(region : Region3,resolution : number,sourceMaterial : Enum.Material,targetMaterial : Enum.Material):()
Sostituisce il terreno di un materiale all'interno di una regione con un altro materiale.
Imposta il colore del materiale del terreno attuale per il materiale del terreno specificato.
Restituisce la posizione della celle di griglia che contiene la posizione del punto **** .
Restituisce la posizione della celle di griglia che contiene la posizione del punto, preferendo le celle di griglia vuote quando la posizione è su un bordo di griglia.
Restituisce la posizione della celle di griglia che contiene la posizione del punto, preferendo le celle di griglia non vuote quando la posizione è su un bordo di griglia.
Imposta una regione del terreno utilizzando un dizionario di dati del canale voxel.
Imposta una certa regione di terreno liscio usando il formato di tabella.
Applica un impulso angolare all'assemblaggio.
Applica un impulso all'assemblaggio all'assemblaggio di center of mass .
Applica un impulso all'assemblaggio in posizione specificata.
Restituisce se le parti possono scontrarsi tra loro.
Verifica se è possibile impostare la proprietà della rete di una parte.
Restituisce una tabella di parti connesse all'oggetto da qualsiasi tipo di Articolazionerigida.
Restituisci tutti i Giunti o Confinamenti che sono connessi a questa Parte.
Restituisce il valore della proprietà Mass Proprietà.
Restituisce il giocatore attuale che è il proprietario di rete di questa parte, o nil in caso del Server.
Restituisce vero se il motore di gioco decide automaticamente il proprietario della rete per questa parte.
Restituisce la parte di base di un'assemblaggio di parti.
Restituisce una tabella di tutte le BasePart.CanCollide parti vere che si intersecano con questa parte.
Restituisce la velocità lineare dell'assemblaggio della parte alla posizione data rispetto a questa parte.
Restituisce vero se l'oggetto è connesso a una parte che lo terrà in posizione (ad esempio una parte Anchored), altrimenti restituisce falso.
Cambia le dimensioni di un oggetto proprio come l'utilizzo dello strumento ridimensionamento di Studio.
Imposta il giocatore dato come proprietario della rete per questo e tutte le parti connesse.
Consente al motore di gioco di decidere dinamicamente chi gestirà la fisica della parte (uno dei client o del Server).
- IntersectAsync(parts : Instances,collisionfidelity : Enum.CollisionFidelity,renderFidelity : Enum.RenderFidelity):Instance
Crea una nuova IntersectOperation dalla geometria sovrapposta della parte e delle altre parti nell'vettorefornito.
- SubtractAsync(parts : Instances,collisionfidelity : Enum.CollisionFidelity,renderFidelity : Enum.RenderFidelity):Instance
Crea una nuova UnionOperation dalla parte, meno la geometria occupata dalle parti nell'vettorefornito.
- UnionAsync(parts : Instances,collisionfidelity : Enum.CollisionFidelity,renderFidelity : Enum.RenderFidelity):Instance
Crea una nuova UnionOperation dalla parte, più la geometria occupata dalle parti nell'vettorefornito.
Ottiene il punto focale di un PVInstance .
Trasforma il PVInstance insieme a tutti i suoi discendenti PVInstances in modo che il punto di rotazione sia ora situato all'interno del CFrame specificato.
Eventi
Eventi provenienti da BasePartSi accende quando una parte smette di toccare un'altra parte a causa di un movimento fisico.
Si accende quando una parte tocca un'altra parte a causa di un movimento fisico.
Proprietà
Decoration
Attualmente consente o disabilita l'erba animata sul materiale del terreno Erba , anche se le modifiche future di questa proprietà possono controllare ulteriori caratteristiche decorative.
GrassLength
Specifica la lunghezza dell'erba animata sul materiale del terreno Erba , supponendo che Decoration sia abilitato. I valori validi sono tra 0.1 e 1.
MaterialColors
MaterialColors rappresenta l'editor per la ProprietàColore Materiale e non può essere modificato da script .
Per ottenere il colore di un materiale, usa: Terrain:GetMaterialColor()
Per impostare il colore di un materiale, usa: Terrain:SetMaterialColor()
WaterWaveSize
Imposta l'altezza massima delle onde d'acqua del terreno in studs. Questo è attualmente limitato tra 0 e 1.
WaterWaveSpeed
Imposta il numero di volte in cui le onde d'acqua del terreno si muovono su e giù per minuto. Attualmente è limitato tra 0 e 100.
Metodi
CellCenterToWorld
Restituisce la posizione mondiale del centro della cellula del terreno (x, y, z).
Parametri
Restituzioni
CellCornerToWorld
Restituisce la posizione dell'angolo inferiore a sinistra in avanti della celle di griglia (x, y, z).
Parametri
Restituzioni
Clear
Pulisce il terreno.
Restituzioni
CopyRegion
Memorizza un pezzo di terreno in un oggetto TerrainRegion in modo che possa essere caricato nuovamente in seguito.Nota: TerrainRegion i dati non si replicano tra server e client.
Parametri
Restituzioni
Campioni di codice
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
Riempe una palla di terreno liscio in uno Spaziodato.
Parametri
La posizione del centro della palla del terreno.
Il raggio in studs della palla del terreno.
Il Enum.Material della palla del terreno.
Restituzioni
Campioni di codice
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
Riempe un blocco di terreno liscio con una posizione, una rotazione, una dimensione e un materiale dato.
Parametri
La posizione e l'orientamento del blocco terreno.
La dimensione in studs del blocco quadrato - sia l'altezza che la larghezza.
Il Enum.Material del blocco del terreno.
Restituzioni
FillCylinder
Riempe un cilindro di terreno liscio in uno Spaziodato. Lo spazio è definito utilizzando un CFrame, l'altezza e il raggio.
local Workspace = game:GetService("Workspace")Workspace.Terrain:FillCylinder(CFrame.new(0, 50, 0), 5, 30, Enum.Material.Asphalt)
Parametri
La posizione e l'orientamento del cilindro del terreno.
L'altezza in studs del cilindro del terreno.
Il raggio in studs del cilindro del terreno.
Il Enum.Material del cilindro del terreno.
Restituzioni
FillRegion
Riempe uno spazio Region3 con terreno liscio.
Parametri
Restituzioni
FillWedge
riempie un volume a forma di cuneo di con il dato e le dimensioni dell'area.L'orientamento del cuneo è lo stesso di un equivalente WedgePart .
Parametri
La posizione e l'orientamento del cuneo da riempire.
La dimensione del cuneo da riempire.
Il materiale con cui sarà riempito il cuneo.
Restituzioni
GetMaterialColor
Restituisce il colore del materiale del terreno attuale per il materiale del terreno specificato.
Parametri
Restituzioni
PasteRegion
Applica un pezzo di terreno all'oggetto Terreno. Nota: TerrainRegion i dati non si replicano tra server e client.
Parametri
Restituzioni
Campioni di codice
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
Restituisce una regione di dati voxel del terreno in formato tabella in base ai nomi dei canali.
Parametri
Regione target da leggere. Deve essere allineata alla griglia di voxel. Lancerà un errore se la regione è troppo grande; il limite attuale è 4194304 voxels³.
Risoluzione Voxel. Deve essere 4.
阵列 di ID del canale (stringhe) che devono essere accessati dai dati del voxel.Ogni ID del canale rappresenta un tipo di dati che viene memorizzato in voxel.Gli ID supportati attuali sono {"SolidMaterial", "SolidOccupancy", "LiquidOccupancy"} .
Restituzioni
Restituisce i dati voxel come un dizionario basato sull'input channelIds. Le chiavi rappresentano ciascun ID del canale con il rispettivo valore come un array di dati 3D.
- SolidMaterial — Il materiale Enum.Material del voxelo.Si noti che Water non è più supportato; invece, un voxel che contiene acqua avrà un valore di LiquidOccupancy .
- SolidOccupancy — L'occupazione del materiale del voxel come specificato nel canale SolidMaterial. Questo è un valore tra 0 (vuoto) e 1 (pieno).
Il dizionario contiene anche una chiave Size con un valore che rappresenta la dimensione dell'array 3D di ciascun dato del canale.
Campioni di codice
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
Restituisce una certa regione di terreno liscio nel formato tabella.
Parametri
Regione target da leggere. Deve essere allineata alla griglia di voxel. Lancerà un errore se la regione è troppo grande. Il limite è attualmente 4194304 voxels^3.
Risoluzione Voxel. Deve essere 4.
Restituzioni
Restituisce i dati voxel grezzi come due array 3D.
- materials - 3D array di Enum.Material dalla zona target. Contiene anche un campo Dimensione, uguale alle dimensioni degli array annidati.
- occupancies - 3D array di valori di occupazione dall'area target. Contiene anche un campo Dimensione, uguale alle dimensioni degli array annidati.
Campioni di codice
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
ReplaceMaterial sostituisce il terreno di un certo Enum.Material all'interno di un Region3 con un altro materiale.Fondamentalmente, è un'operazione di ricerca e sostituzione su Terrain materiali.
Restrizioni
Quando si chiama questo metodo, il parametro resolution deve essere esattamente 4.Inoltre, la Regione3 deve essere allineata alla griglia di materiali del terreno, cioèi componenti dei punti minimi e massimi della Regione3 devono essere divisibili per 4.Usa Region3:ExpandToGrid() per rendere una regione compatibile con questa funzione.
Parametri
La regione in cui Si verificanol'operazione di sostituzione.
La risoluzione in cui avrà Postol'operazione di sostituzione; al momento questo deve essere esattamente 4.
Il vecchio materiale che deve essere sostituito.
Il nuovo materiale.
Restituzioni
Campioni di codice
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
Imposta il colore del materiale del terreno attuale per il materiale del terreno specificato. Il materiale del terreno sposterà il suo colore di base verso il colore specificato.
Parametri
Restituzioni
WorldToCell
Restituisce la posizione della celle di griglia che contiene la posizione del punto **** .
Parametri
Restituzioni
WorldToCellPreferEmpty
Restituisce la posizione della celle di griglia che contiene la posizione del punto, preferendo le celle di griglia vuote quando la posizione è su un bordo di griglia.
Parametri
Restituzioni
WorldToCellPreferSolid
Restituisce la posizione della celle di griglia che contiene la posizione del punto, preferendo le celle di griglia non vuote quando la posizione è su un bordo di griglia.
Parametri
Restituzioni
WriteVoxelChannels
Imposta una regione del terreno utilizzando un dizionario di dati del canale voxel.
Parametri
Regione target a cui scrivere. Deve essere allineata alla griglia di voxel. Lancerà un errore se la regione è troppo grande; il limite attuale è 4194304 voxels³.
Risoluzione Voxel. Deve essere 4.
Dizionario di dati voxel simili al valore di ritorno di ReadVoxelChannels() .Le chiavi rappresentano ciascun ID del canale con il rispettivo valore come un array di dati 3D.Il dizionario può supportare input singoli o multipli su più canali.
- SolidMaterial — Il materiale Enum.Material del voxelo.Si noti che Water non è più supportato; invece, un voxel che contiene solo acqua deve essere inserito come SolidMaterial = Enum.Material.Air, LiquidOccupancy = x , dove x è un numero tra 0 (esclusivo) e 1 (inclusivo).
- SolidOccupancy — L'occupazione del materiale del voxel come specificato nel canale SolidMaterial. Questo dovrebbe essere un valore tra 0 (vuoto) e 1 (pieno).
Restituzioni
Campioni di codice
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
Imposta una certa regione di terreno liscio usando il formato di tabella.
Parametri
Regione target a cui scrivere. Deve essere allineata alla griglia di voxel. Mostrerà un errore se la regione è troppo grande.
Risoluzione Voxel. Deve essere 4.
L'array 3D di Enum.Material. Dimensioni deve corrispondere esattamente alle dimensioni della regione target in voxel.
阵列 di occupazioni voxel 3D (numbero tra 0 e 1). Le dimensioni devono corrispondere esattamente alle dimensioni della regione target in voxel.
Restituzioni
Campioni di codice
Example
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))