Terrain
*Ce contenu est traduit en utilisant l'IA (Beta) et peut contenir des erreurs. Pour consulter cette page en anglais, clique ici.
Le terrain vous permet de créer des environnements dynamiquement morphables avec peu ou pas de décalage.Il est actuellement basé sur une grille 4×4×4 de cellules, où chaque cellule a un nombre entre 0 et 1 représentant la quantité de géométrie qui devrait occuper la cellule et le matériau de la cellule.L'occupation détermine comment la cellule se transformera avec les cellules environnantes, et le résultat est l'illusion d'avoir aucune contrainte de grille.
Pour plus d'informations, voir terrain.
Résumé
Propriétés
Active ou désactive la décoration du terrain.
Spécifie la longueur de la pelouse animée.
MaterialColors représente l'éditeur pour la fonctionnalité Couleur du matériau, et ne peut pas être modifié par des scripts .
Pour obtenir la couleur d'un matériau, utilisez : Terrain:GetMaterialColor() Pour définir la couleur d'un matériau, utilisez : Terrain:SetMaterialColor()
Affiche les limites de la plus grande région éditable possible.
La teinte de l'eau du terrain.
Contrôle la manière dont les réflexions d'eau du terrain sont opaques.
La transparence de l'eau du terrain.
Définit la hauteur maximale des vagues d'eau du terrain en studs.
Définit le nombre de fois que les vagues d'eau du terrain se déplaceront vers le haut et vers le bas par minute.
Détermine si une partie est immobile par la physique.
La vitesse angulaire de l'assemblage de la pièce.
Le centre de masse de l'assemblage de la partie dans l'espace mondial.
La vitesse linéaire de l'assemblage de la pièce.
La masse totale de l'assemblage de la partie.
Une référence à la partie racine de l'assemblage.
Détermine si la partie interagira physiquement avec la simulation audio, similaire à CastShadow pour l'éclairage.
Détermine le type de surface pour le dos d'une pièce.
Détermine le type de surface pour le côté inférieur d'une pièce.
Détermine la couleur d'une partie.
Détermine la position et l'orientation du BasePart dans le monde.
Détermine si une partie peut entrer en collision avec d'autres parties.
Détermine si la partie est prise en compte lors des opérations de requête spatiale.
Détermine si Touched et TouchEnded événements se déclenhent sur la partie.
Détermine si oui ou non une partie lance une ombre.
Décrit la position mondiale dans laquelle le centre de masse d'une partie est situé.
Détermine le nom du groupe de collision d'une partie.
Détermine la couleur d'une partie.
Indique les propriétés physiques actuelles de la pièce.
Détermine plusieurs propriétés physiques d'une partie.
Utilisé pour activer ou désactiver les forces aérodynamiques sur les parties et les assemblages.
La taille physique réelle du BasePart telle que perçue par le moteur de physique.
Détermine le type de surface pour le visage avant d'une partie.
Détermine le type de surface pour le côté gauche d'une pièce.
Détermine un multiplicateur pour BasePart.Transparency qui n'est visible que pour le client local.
Détermine si une partie est sélectionnable dans Studio.
Décrit la masse de la partie, le produit de sa densité et de son volume.
Détermine si la partie contribue à la masse totale ou à l'inertie de son corps rigide.
Détermine la texture et les propriétés physiques par défaut d'une pièce.
Le nom de MaterialVariant.
Décrit la rotation de la partie dans le monde.
Spécifie le décalage du pivot de la partie par rapport à son CFrame .
Décrit la position de la partie dans le monde.
Temps écoulé depuis la dernière mise à jour physique enregistrée.
Détermine à quel point une partie reflète la skybox.
Décrit le plus petit changement de taille autorisé par la méthode Resize().
Décrit les visages sur lesquels une partie peut être redimensionnée.
Détermine le type de surface pour le côté droit d'une pièce.
La règle principale pour déterminer la partie racine d'une assemblée.
La rotation de la pièce en degrés pour les trois axes.
Détermine les dimensions d'une pièce (longueur, largeur, hauteur).
Détermine le type de surface pour le haut du visage d'une pièce.
Détermine à quel point une partie peut être vue à travers (l'inverse de l'opacité de la partie).
Méthodes
Renvoie la position mondiale du centre de la cellule du terrain (x, y, z).
Renvoie la position du coin inférieur gauche avant de la cellule de grille (x, y, z).
Dégage le terrain.
Stocke un morceau de terrain dans un objet TerrainRegion pour qu'il puisse être récupéré plus tard.Remarque : TerrainRegion les données ne se répliquent pas entre le serveur et le client.
Renvoie le nombre de cellules non vides dans le Terrain.
Remplit une balle de terrain lisse dans un espace donné.
Remplit un bloc de terrain lisse avec une localisation, une rotation, une taille et un matériau donnés.
Remplit un cylindre de terrain lisse dans un espace donné.
Remplit un espace Region3 avec un terrain lisse.
Remplit un volume en forme de coin de terrain avec le Enum.Material donné et le CFrame et la taille de la zone.
Renvoie la couleur du matériau du terrain actuel pour le matériau de terrain spécifié.
- IterateVoxelsAsync_beta(region : Region3,resolution : number,channelIds : Array):TerrainIterateOperation
- ModifyVoxelsAsync_beta(region : Region3,resolution : number,channelIds : Array):TerrainModifyOperation
Applique un morceau de terrain à l'objet Terrain. Note : TerrainRegion les données ne se répliquent pas entre le serveur et le client.
Renvoie une région de données de terrain en voxel dans un format de table en fonction des noms des canaux.
Renvoie une certaine région de terrain lisse au format de table.
- ReplaceMaterial(region : Region3,resolution : number,sourceMaterial : Enum.Material,targetMaterial : Enum.Material):()
Remplace le terrain d'un matériau dans une région par un autre matériau.
Définit la couleur du matériau du terrain actuel pour le matériau de terrain spécifié.
Renvoie l'emplacement de la cellule de grille qui contient la position du point position .
Renvoie l'emplacement de la cellule de grille qui contient la position du point, en préférant les cellules de grille vides lorsque la position est sur un bord de grille.
Renvoie l'emplacement de la cellule de grille qui contient la position du point, en préférant les cellules de grille non vides lorsque la position est sur un bord de grille.
Définit une région de terrain en utilisant un dictionnaire de données de canal de voxel.
Définit une certaine région de terrain lisse en utilisant le format de table.
- WriteVoxelsAsync_beta(region : Region3,resolution : number,channelIds : Array):TerrainWriteOperation
Appliquer un impulsion angulaire à l'assemblage.
Appliquez un impulsion à l'assemblage à l'assemblage de center of mass .
Appliquer un impulsion à l'assemblage à une position spécifiée.
Renvoie si les parties peuvent se heurter les unes aux autres.
Vérifie si vous pouvez définir la propriété réseau d'une partie.
Retourne une table de parties connectées à l'objet par tout type de articulationrigide.
Renvoie tous les jointures ou contraintes qui sont connectées à cette partie.
Renvoie la valeur de la propriété Mass.
Renvoie le joueur actuel qui est le propriétaire du réseau de cette partie, ou nil en cas du serveur.
Renvoie true si le moteur de jeu décide automatiquement du propriétaire du réseau pour cette partie.
Renvoie la partie de base d'une assemblage de parties.
Renvoie une table de toutes les BasePart.CanCollide parties vraies qui se chevauchent avec cette partie.
Renvoie la vitesse linéaire de l'assemblage de la pièce à la position donnée par rapport à cette pièce.
Renvoie true si l'objet est connecté à une partie qui le maintiendra en place (par exemple, une partie Anchored), sinon renvoie false.
Change la taille d'un objet tout comme l'utilisation de l'outil de redimensionnement de Studio.
Définit le joueur donné comme propriétaire du réseau pour ceci et toutes les parties connectées.
Permet au moteur de jeu de décider dynamiquement qui gérera la physique de la partie (l'un des clients ou le serveur).
- IntersectAsync(parts : Instances,collisionfidelity : Enum.CollisionFidelity,renderFidelity : Enum.RenderFidelity):Instance
Crée une nouvelle IntersectOperation à partir de la géométrie chevauchante de la pièce et des autres parties dans l'matricedonné.
- SubtractAsync(parts : Instances,collisionfidelity : Enum.CollisionFidelity,renderFidelity : Enum.RenderFidelity):Instance
Crée un nouveau UnionOperation à partir de la partie, moins la géométrie occupée par les parties dans l'matricedonné.
- UnionAsync(parts : Instances,collisionfidelity : Enum.CollisionFidelity,renderFidelity : Enum.RenderFidelity):Instance
Crée une nouvelle UnionOperation de la partie, plus la géométrie occupée par les parties dans l'matricedonné.
Obtient le pivot d'un PVInstance .
Transforme le PVInstance ainsi que tous ses descendants PVInstances de sorte que le pivot est désormais situé au point spécifié CFrame.
Évènements
Évènements hérités de BasePartS'enflamme lorsqu'une partie cesse de toucher une autre partie en raison d'un mouvement physique.
S'enflamme lorsqu'une partie touche une autre partie en raison d'un mouvement physique.
Propriétés
Decoration
Active ou désactive actuellement l'herbe animée sur le matériau du terrain herbe , bien que les modifications futures de cette propriété puissent contrôler des caractéristiques décoratives supplémentaires.
GrassLength
Spécifie la longueur de l'herbe animée sur le matériau du terrain Gazon , en supposant que Decoration est activé. Les valeurs valides se situent entre 0.1 et 1.
MaterialColors
MaterialColors représente l'éditeur pour la fonctionnalité Couleur du matériau, et ne peut pas être modifié par des scripts .
Pour obtenir la couleur d'un matériau, utilisez : Terrain:GetMaterialColor()
Pour définir la couleur d'un matériau, utilisez : Terrain:SetMaterialColor()
WaterWaveSize
Définit la hauteur maximale des vagues d'eau du terrain en studs. Cela est actuellement limité entre 0 et 1.
WaterWaveSpeed
Définit le nombre de fois que les vagues d'eau du terrain se déplaceront vers le haut et vers le bas par minute. Cela est actuellement limité entre 0 et 100.
Méthodes
CellCenterToWorld
Renvoie la position mondiale du centre de la cellule du terrain (x, y, z).
Paramètres
Retours
CellCornerToWorld
Renvoie la position du coin inférieur gauche avant de la cellule de grille (x, y, z).
Paramètres
Retours
Clear
Dégage le terrain.
Retours
ClearVoxelsAsync_beta
Paramètres
Retours
CopyRegion
Stocke un morceau de terrain dans un objet TerrainRegion pour qu'il puisse être récupéré plus tard.Remarque : TerrainRegion les données ne se répliquent pas entre le serveur et le client.
Paramètres
Retours
Échantillons de code
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
Remplit une balle de terrain lisse dans un espace donné.
Paramètres
La position du centre de la balle du terrain.
Le rayon en studs de la balle de terrain.
Le Enum.Material de la balle du terrain.
Retours
Échantillons de code
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
Remplit un bloc de terrain lisse avec une localisation, une rotation, une taille et un matériau donnés.
Paramètres
La position et l'orientation du bloc de terrain.
La taille en studs du bloc carré - à la fois la hauteur et la largeur.
Le Enum.Material du bloc de terrain.
Retours
FillCylinder
Remplit un cylindre de terrain lisse dans un espace donné. L'espace est défini en utilisant un CFrame, une hauteur et un rayon.
local Workspace = game:GetService("Workspace")Workspace.Terrain:FillCylinder(CFrame.new(0, 50, 0), 5, 30, Enum.Material.Asphalt)
Paramètres
La position et l'orientation du cylindre du terrain.
La hauteur en studs du cylindre du terrain.
Le rayon en studs du cylindre du terrain.
Le Enum.Material du cylindre du terrain.
Retours
FillRegion
Remplit un espace Region3 avec un terrain lisse.
Paramètres
Retours
FillWedge
remplit un volume en forme de coin de avec le donné et la taille de la zone.L'orientation du coin est la même qu'une équivalente WedgePart .
Paramètres
La position et l'orientation de la cale à remplir.
La taille du coin à remplir.
Le matériau avec lequel la cale sera remplie.
Retours
GetMaterialColor
Renvoie la couleur du matériau du terrain actuel pour le matériau de terrain spécifié.
Paramètres
Retours
IterateVoxelsAsync_beta
Paramètres
Retours
ModifyVoxelsAsync_beta
Paramètres
Retours
PasteRegion
Applique un morceau de terrain à l'objet Terrain. Note : TerrainRegion les données ne se répliquent pas entre le serveur et le client.
Paramètres
Retours
Échantillons de code
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
Renvoie une région de données de terrain en voxel dans un format de table en fonction des noms des canaux.
Paramètres
Région cible à lire. Doit être alignée sur la grille voxel. Lancera une erreur si la région est trop grande ; la limite est actuellement de 4194304 voxels³.
Résolution de voxel. Doit être 4.
Liste d'ID de canal (chaînes) qui doivent être accessibles aux données du voxel.Chaque ID de canal représente un type de données qui est stocké dans le voxel.Les IDs actuellement pris en charge sont {"SolidMaterial", "SolidOccupancy", "LiquidOccupancy"}.
Retours
Retourne les données de voxel en tant que dictionnaire basé sur l'entrée channelIds. Les clés représentent chaque ID de canal avec leur valeur respective en tant qu'ensemble de données 3D.
- SolidMaterial — Le matériau Enum.Material du voxel.Notez que Water n'est plus pris en charge ; à la place, un voxel contenant de l'eau aura une valeur de LiquidOccupancy .
- SolidOccupancy — L'occupation du matériau du voxel comme spécifié dans le canal SolidMaterial. Il s'agit d'une valeur entre 0 (vide) et 1 (complet).
Le dictionnaire contient également une clé Size avec une valeur représentant la taille de l'arrêt 3D de chaque donnée de canal.
Échantillons de code
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
Renvoie une certaine région de terrain lisse au format de table.
Paramètres
Région cible à lire. Doit être alignée sur la grille voxel. Lance une erreur si la région est trop grande. La limite est actuellement de 4194304 voxels^3.
Résolution de voxel. Doit être 4.
Retours
Retourne des données voxelles brutes en tant que deux tableaux 3D.
- materials - 3D tableau de Enum.Material de la zone cible. Contient également un champ de taille, égal aux dimensions des tableaux imbriqués.
- occupancies - 3D tableau de valeurs d'occupation de la zone cible. Contient également un champ de taille, égal aux dimensions des tableaux imbriqués.
Échantillons de code
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)
ReadVoxelsAsync_beta
Paramètres
Retours
ReplaceMaterial
ReplaceMaterial remplace le terrain d'un certain Enum.Material dans un Region3 avec un autre matériau.Fondamentalement, c'est une opération de recherche et de remplacement sur les matériaux Terrain .
Contrôles
Lors de l'appel de cette méthode, le paramètre resolution doit être exactement 4.En outre, la région 3 doit être alignée sur la grille de matériaux du terrain, c'est-à-direles composants des points minimum et maximum de la région 3 doivent être divisibles par 4.Utilisez Region3:ExpandToGrid() pour rendre une région compatible avec cette fonction.
Paramètres
La région dans laquelle l'opération de remplacement se produira.
La résolution à laquelle l'opération de remplacement aura lieu ; en ce moment, cela doit être exactement 4.
Le matériel ancien qui sera remplacé.
Le nouveau matériel.
Retours
Échantillons de code
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
Définit la couleur du matériau du terrain actuel pour le matériau de terrain spécifié. Le matériau du terrain déplacera sa couleur de base vers la couleur spécifiée.
Paramètres
Retours
WorldToCell
Renvoie l'emplacement de la cellule de grille qui contient la position du point position .
Paramètres
Retours
WorldToCellPreferEmpty
Renvoie l'emplacement de la cellule de grille qui contient la position du point, en préférant les cellules de grille vides lorsque la position est sur un bord de grille.
Paramètres
Retours
WorldToCellPreferSolid
Renvoie l'emplacement de la cellule de grille qui contient la position du point, en préférant les cellules de grille non vides lorsque la position est sur un bord de grille.
Paramètres
Retours
WriteVoxelChannels
Définit une région de terrain en utilisant un dictionnaire de données de canal de voxel.
Paramètres
Région cible à écrire. Doit être alignée sur la grille voxel. Lance une erreur si la région est trop grande ; la limite est actuellement de 4194304 voxels³.
Résolution de voxel. Doit être 4.
Dictionnaire de données de voxel similaire à la valeur de retour de ReadVoxelChannels() .Les clés représentent chaque ID de canal avec leur valeur respective en tant qu'array de données 3D.Le dictionnaire peut prendre en charge une ou plusieurs entrées de canal.
- SolidMaterial — Le matériau Enum.Material du voxel.Notez que Water n'est plus pris en charge ; à la place, un voxel qui ne contient que de l'eau doit être entré comme SolidMaterial = Enum.Material.Air, LiquidOccupancy = x, où x est un nombre entre 0 (exclusif) et 1 (inclusif).
- SolidOccupancy — L'occupation du matériau du voxel comme spécifié dans le canal SolidMaterial. Ce devrait être une valeur entre 0 (vide) et 1 (complet).
Retours
Échantillons de code
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
Définit une certaine région de terrain lisse en utilisant le format de table.
Paramètres
Région cible à écrire. Doit être alignée sur la grille voxel. Lancera une erreur si la région est trop grande.
Résolution de voxel. Doit être 4.
Matrice 3D d'Enum.Material. Les dimensions doivent correspondre exactement à la taille de la région cible en voxels.
Matrice 3D d'occupations de voxel (number entre 0 et 1). Les dimensions doivent correspondre exactement à la taille de la région cible en voxels.
Retours
Échantillons de code
Exemple
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))