Terrain
*Ce contenu est traduit en utilisant l'IA (Beta) et peut contenir des erreurs. Pour consulter cette page en anglais, clique ici.
Terrain vous permet de créer des environnements dynamiquement morphables avec peu ou pas de décalage. Il est actuellement basé sur une grille de cellules 4×4×4, où chaque cellule a un nombre entre 0 et 1 représentant la quantité de la géométrie qui doit 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 l'herbe animée.
MaterialColors représente l'éditeur pour la fonctionalitéde couleur de 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 modifiable possible.
La teinte de l'eau du terrain.
Contrôle la façon dont les reflets d'eau du terrain sont opaques.
La transparence de l'eau du terrain.
Définit la hauteur maximale des vagues de terrain dans les studs.
Définit le nombre de fois que les ondes d'eau du terrain se déplaceront vers le haut et vers le bas par minute.
Détermine si une partie est immovable physiquement.
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 vélocité 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 le type de surface pour le dos d'une pièce (+Z direction).
Détermine le type de surface pour le visage inférieur d'une partie (-Y direction).
Détermine la couleur d'une partie.
Détermine la position et l'orientation de la BasePart dans le monde.
Détermine si une partie peut se heurter à d'autres parties.
Détermine si la partie est envisagée pendant les opérations de requête spatiale.
Détermine si les événements Touched et TouchEnded se déclenchent sur la partie.
Détermine si oui ou non une partie lance une ombre.
Décrivez la position dans le monde dans laquelle se trouve le centre de masse d'une partie.
Décrivez le nom d'un groupe de collision de pièce.
Détermine la couleur d'une partie.
Indique les propriétés physiques actuelles de la partie.
Détermine plusieurs propriétés physiques d'une partie.
Utilisé pour activer ou désactiver les forces aéroynamiques sur les parties et les assemblages.
La taille physique réelle de la BasePart comme indiqué par le moteur de physique.
Détermine le type de surface pour la face avant d'une pièce (-Z direction).
Détermine le type de surface pour le visage gauche d'une pièce (-X direction).
Détermine un multiplicateur pour BasePart.Transparency qui n'est visible que pour le client local.
Détermine si une partie peut être sélectionnée dans Studio.
Décrivez la masse de la pièce, 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écrivez la rotation de la pièce dans le monde.
Spécifie l'Offset de la pivot de la partie de son CFrame.
Décrivez la position de la partie dans le monde.
Temps depuis la dernière mise à jour de la physique.
Détermine la quantité de lumière reflétée par une pièce.
Décrivez la plus petite modification de taille autorisée par la méthode Redimensionner.
Décrivez 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 (+X direction).
La règle principale dans le détermination de la partie racine d'une assemblage.
La rotation de la pièce en degrés pour les trois axes.
Détermine les dimensions d'une partie (Longueur, largeur, hauteur).
Détermine le type de surface pour la face supérieure d'une pièce (+ Y direction).
Détermine la quantité de partie qui peut être vue à travers (l'inverse de l'opacité de la partie).
Méthodes
Retourne la position du monde du centre de la cellule de terrain (x, y, z).
Renvoie la position du coin inférieur gauche de la cellule de grille (x, y, z).
Efface le terrain.
Stores un morceau de terrain dans un objet TerrainRegion afin qu'il puisse être chargé plus tard. Remarquez que les données TerrainRegion ne se répliquent pas entre le serveur et le client.
Renvoie le nombre de cellules non vides dans le terrain.
Remplit un ballon de terrain lisse dans un espace donné.
Remplit un bloc de terrain lisse avec un emplacement, une rotation, une taille et un matériau donné.
Remplit un cône de terrain lisse dans un espace donné.
Remplit un Region3 espace avec un terrain lisse.
Remplit un volume de terrain en forme de coin avec le Enum.Material et la CFrame et la taille de la zone.
Renvoie la couleur du matériau de terrain actuel pour le matériau de terrain spécifié.
Applique un morceau de terrain à l'objet Terrain. Remarque : les données TerrainRegion ne se répliquent pas entre le serveur et le client.
Renvoie une région de données voxel de terrain dans le format de la table en fonction des noms des canaux.
Renvoie une certaine région de terrain lisse dans le format de la table.
- ReplaceMaterial(region : Region3,resolution : number,sourceMaterial : Enum.Material,targetMaterial : Enum.Material):void
Remplace le terrain d'un matériau dans une région par un autre matériau.
Définit la couleur du matériau de terrain actuel pour le matériau de terrain spécifié.
Renvoie l'emplacement de la cellule grille qui contient le point de position positionnez .
Retourne la position de la cellule grille qui contient la position du point, en préférant les cellules grille vides lorsque la position est sur un bord de grille.
Retourne la position de la cellule grille qui contient la position de 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 voxel.
Définit une certaine région de terrain lisse en utilisant le format de la table.
Appliquez une impulsion angulaire à l'assemblage.
Appliquez un impulsion à l'assemblage à l'assemblage de center of mass .
Appliquez un impulsion à l'assemblage à la position spécifiée.
Retourne si les parties peuvent se heurter l'une à l'autre.
Vérifie si vous pouvez configurer la propriété du réseau d'une partie.
Renvoie une table de pièces connectées à l'objet par n'importe quel type de articulationrigide.
Retournez toutes les Jointures ou Contraintes qui sont connectées à cette partie.
Retourne la valeur de la propriété Mass.
Renvoie le joueur actuel qui est le propriétaire du réseau de cette partie, ou zéro dans le cas du serveur.
Retourne vrai si le moteur de jeu décide automatiquement le propriétaire du réseau pour cette partie.
Renvoie la partie de base d'une assemblage de pièces.
Renvoie une table de toutes les parties BasePart.CanCollide vraies qui intersectent avec cette partie.
Renvoie la vitesse linéaire de l'assemblage de la partie à la position donnée par rapport à cette partie.
Renvoie vrai si l'objet est connecté à une partie qui le retiendra (par exemple, une partie Anchored )), sinon renvoie faux.
Change la taille d'un objet juste comme utiliser l'outil de redimensionnement 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 (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 superposée des parties et des autres parties dans l'matricedonné.
- SubtractAsync(parts : Instances,collisionfidelity : Enum.CollisionFidelity,renderFidelity : Enum.RenderFidelity):Instance
Crée une nouvelle UnionOperation à partir de la partie, en minusant 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 à partir 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 afin que le pivot soit maintenant situé dans le CFrame spécifié.
Évènements
Évènements hérités de BasePartSe déclenche lorsqu'une partie arrête de toucher une autre partie en résultant d'un mouvement physique.
Feu quand une partie touche une autre partie en résultant d'un mouvement physique.
Propriétés
Decoration
Actuellement, il active ou désactive l'herbe animée sur le matériau de terrain herbe , bien que futures modifications de cette propriété puissent contrôler des fonctionnalités décoratives supplémentaires.
GrassLength
Spécifie la longueur de l'herbe animée sur le matériau de terrain Herbe , en supposant que Decoration est activé. Les valeurs valides sont entre 0,1 et 1.
MaterialColors
MaterialColors représente l'éditeur pour la fonctionalitéde couleur de 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 de terrain dans les studs. Ceci est actuellement limité entre 0 et 1.
WaterWaveSpeed
Définit le nombre de fois que les ondes de terrain se déplaceront en haut et en bas par minute. Cela est actuellement limité entre 0 et 100.
Méthodes
CellCenterToWorld
Retourne la position du monde du centre de la cellule de terrain (x, y, z).
Paramètres
Retours
CellCornerToWorld
Renvoie la position du coin inférieur gauche de la cellule de grille (x, y, z).
Paramètres
Retours
Clear
Efface le terrain.
Retours
CopyRegion
Stores un morceau de terrain dans un objet TerrainRegion afin qu'il puisse être chargé plus tard. Remarquez que les données TerrainRegion ne se répliquent pas entre le serveur et le client.
Paramètres
Retours
Échantillons de code
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 un ballon de terrain lisse dans un espace donné.
Paramètres
La position du centre de la boule de terrain.
Le rayon en studs de la boule de terrain.
Le Enum.Material de la balle de terrain.
Retours
Échantillons de code
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 un emplacement, une rotation, une taille et un matériau donné.
Paramètres
Le cframe (position et 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 cône de terrain lisse dans un espace donné. L'espace est défini en utilisant un CFrame, une hauteur et un rayon.
Utilisation
workspace.Terrain:FillCylinder(CFrame.new(0, 50, 0), 5, 30, Enum.Material.Asphalt)
Paramètres
Le CFrame (position et orientation) du cylindre de terrain.
La hauteur dans les studs du cône de terrain.
Le rayon dans les studs du cône de terrain.
Le Enum.Material du cône de terrain.
Retours
FillWedge
FillWedge() Remplit un volume en forme de cale de Terrain avec le donné Enum.Material et la zone 0> Datatype.CFrame0> et la taille. L'orientation du cale est la même qu'un équivalent FillWedge()3>.
Paramètres
La position et l'orientation du coin à remplir.
La taille du coin à remplir.
Le matériau avec lequel le coin sera rempli.
Retours
GetMaterialColor
Renvoie la couleur du matériau de terrain actuel pour le matériau de terrain spécifié.
Paramètres
Retours
PasteRegion
Applique un morceau de terrain à l'objet Terrain. Remarque : les données TerrainRegion ne se répliquent pas entre le serveur et le client.
Paramètres
Retours
Échantillons de code
--[[
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 voxel de terrain dans le format de la table en fonction des noms des canaux.
Paramètres
Région cible pour laquelle lire. Doit être positionné sur la grille de voxel. Lancerra une erreur si la région est trop grande ; la limite actuelle est de 4194304 voxels³.
Résolution du voxel. Doit être 4.
Un tableau d'identifiants de canal (chaînes) qui doivent être accédés à partir des données voxel. Chaque identifiant de canal représente un type de données qui est stocké dans le voxel. Les ID actuels sont {"SolidMaterial", "SolidOccupancy", "LiquidOccupancy"} .
Retours
Renvoie des données voxel en tant que dictionnaire en fonction de l'entrée channelIds. Les clés représentent chacun des ID de canal avec leur valeur respective en tant qu'ensemble de données 3D.
- SolidMaterial — Le matériau Enum.Material du voxel. Remarquez que Water n'est plus pris en charge ; à la place, un voxel qui contient de l'eau aura une valeur de 0> LiquidOccupancy0> .
- SolidOccupancy — L'occupation du matériau du voxel comme spécifié dans le chat (chat privé)SolidMaterial. Ceci est une valeur entre 0 ( vide ) et 1 ( pleine ).
- LiquidOccupancy — Spécifie la occupation du matériau Water dans un voxel comme une valeur entre 0 (pas d'eau) et 1 (plein d'eau). Si le SolidOccupancy est 1 et le 0> SolidMaterial0> n'est pas 3>
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 dans le format de la table.
Paramètres
Région cible pour laquelle lire. Doit être positionné sur la grille de voxel. Lancerra un erreur si la région est trop grande. La limite actuelle est de 4194304 voxels ^ 3.
Résolution du voxel. Doit être 4.
Retours
Renvoie les données de voxel brut comme deux tableaux 3D.
- materials - 3D array of Enum.Material from the target area. Contient également un champ de taille, équivalent aux dimensions des tableaux imbriqués.
- occupancies - 3D tableau des valeurs d'occupation de la zone cible. Contient également un champ de taille, équivalent 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)
ReplaceMaterial
ReplaceMaterial remplace le terrain d'un certain Enum.Material dans un Region3 avec un autre matériau. Essentiellement, il s'agit d'une opération de recherche et de remplacement sur les matériaux Terrain.
Contraintes
Lors de l'appel de cette méthode, le paramètre resolution doit être exactement 4. De plus, le paramètre Region3 doit être alinéé sur la grille des matériaux du terrain, c'est-à-dire les 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 substitution aura survernir.
La résolution à laquelle l'opération de substitution aura emplacement; pour le moment, cela doit être exactement 4.
Le matériel ancien qui sera remplacé.
Le nouveau matériau.
Retours
Échantillons de code
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 de terrain actuel pour le matériau de terrain spécifié. Le matériau de terrain déplacera sa couleur de base vers la couleur spécifiée.
Paramètres
Retours
WorldToCell
Renvoie l'emplacement de la cellule grille qui contient le point de position positionnez .
Paramètres
Retours
WorldToCellPreferEmpty
Retourne la position de la cellule grille qui contient la position du point, en préférant les cellules grille vides lorsque la position est sur un bord de grille.
Paramètres
Retours
WorldToCellPreferSolid
Retourne la position de la cellule grille qui contient la position de 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 voxel.
Paramètres
Région cible pour écrire. Doit êtrealigné sur la grille de voxel. Lancerra un erreur si la région est trop grande ; la limite actuelle est de 4194304 voxels³.
Résolution du voxel. Doit être 4.
Dictionnaire de données voxel similaire à la valeur de retour de ReadVoxelChannels() . Les clés représentent l'ID de chaque canal avec leur valeur respective en tant qu'arrêt de 3D. Le dictionnaire peut prendre en charge l'entrée unique ou multiple d'un canal.
- SolidMaterial — Le matériau Enum.Material du voxel. Remarquez que Water n'est plus pris en charge ; à la place, un voxel qui contient seulement de l'eau doit être entré comme 0> SolidMaterial = Enum.Material.Air, L
- SolidOccupancy — L'occupation du matériau du voxel comme spécifié dans le chat (chat privé)SolidMaterial. Ceci devrait être une valeur entre 0 ( vide ) et 1 ( pleine ).
- LiquidOccupancy — Spécifie la occupation du matériau Water dans un voxel comme une valeur entre 0 (pas d'eau) et 1 (plein d'eau). Si le SolidOccupancy est 1 et le 0> SolidMaterial0> n'est pas 3>
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 la table.
Paramètres
Région cible pour écrire. Doit êtrealigné sur la grille de voxel. Lancerra un erreur si la région est trop grande.
Résolution du voxel. Doit être 4.
3D array of Enum.Material. Les dimensions doivent correspondre exactement à la taille de la région cible en voxels.
3D array of voxel occupations (number between 0 et 1). Les dimensions doivent correspondre exactement à la taille de la région cible en voxels.
Retours
Échantillons de code
local Workspace = game:GetService("Workspace")
local terrain = Workspace.Terrain
local resolution = 4
local region = Region3.new(Vector3.new(0, 0, 0), Vector3.new(16, 28, 20)):ExpandToGrid(resolution)
local materials = {
{
{
Enum.Material.CrackedLava,
Enum.Material.CrackedLava,
Enum.Material.CrackedLava,
Enum.Material.CrackedLava,
Enum.Material.CrackedLava,
},
{ Enum.Material.Rock, Enum.Material.Rock, Enum.Material.Rock, Enum.Material.Rock, Enum.Material.Rock },
{ Enum.Material.Rock, Enum.Material.Rock, Enum.Material.Rock, Enum.Material.Rock, Enum.Material.Rock },
{ Enum.Material.Sand, Enum.Material.Sand, Enum.Material.Sand, Enum.Material.Sand, Enum.Material.Sand },
{ Enum.Material.Sand, Enum.Material.Sand, Enum.Material.Sand, Enum.Material.Sand, Enum.Material.Sand },
{ Enum.Material.Mud, Enum.Material.Mud, Enum.Material.Mud, Enum.Material.Mud, Enum.Material.Mud },
{ Enum.Material.Air, Enum.Material.Air, Enum.Material.Air, Enum.Material.Air, Enum.Material.Air },
},
{
{
Enum.Material.CrackedLava,
Enum.Material.CrackedLava,
Enum.Material.CrackedLava,
Enum.Material.CrackedLava,
Enum.Material.CrackedLava,
},
{ Enum.Material.Rock, Enum.Material.Rock, Enum.Material.Rock, Enum.Material.Rock, Enum.Material.Rock },
{ Enum.Material.Rock, Enum.Material.Rock, Enum.Material.Rock, Enum.Material.Rock, Enum.Material.Rock },
{ Enum.Material.Sand, Enum.Material.Sand, Enum.Material.Sand, Enum.Material.Sand, Enum.Material.Sand },
{ Enum.Material.Sand, Enum.Material.Sand, Enum.Material.Sand, Enum.Material.Sand, Enum.Material.Sand },
{ Enum.Material.Mud, Enum.Material.Snow, Enum.Material.Snow, Enum.Material.Snow, Enum.Material.Mud },
{ Enum.Material.Air, Enum.Material.Snow, Enum.Material.Snow, Enum.Material.Snow, Enum.Material.Air },
},
{
{
Enum.Material.CrackedLava,
Enum.Material.Sand,
Enum.Material.Sand,
Enum.Material.Sand,
Enum.Material.CrackedLava,
},
{ Enum.Material.Rock, Enum.Material.Rock, Enum.Material.Rock, Enum.Material.Rock, Enum.Material.Rock },
{ Enum.Material.Rock, Enum.Material.Rock, Enum.Material.Rock, Enum.Material.Rock, Enum.Material.Rock },
{ Enum.Material.Sand, Enum.Material.Sand, Enum.Material.Sand, Enum.Material.Sand, Enum.Material.Sand },
{ Enum.Material.Sand, Enum.Material.Sand, Enum.Material.Sand, Enum.Material.Sand, Enum.Material.Sand },
{ Enum.Material.Mud, Enum.Material.Snow, Enum.Material.Snow, Enum.Material.Snow, Enum.Material.Mud },
{ Enum.Material.Air, Enum.Material.Snow, Enum.Material.Snow, Enum.Material.Snow, Enum.Material.Air },
},
{
{
Enum.Material.CrackedLava,
Enum.Material.CrackedLava,
Enum.Material.CrackedLava,
Enum.Material.CrackedLava,
Enum.Material.CrackedLava,
},
{ Enum.Material.Rock, Enum.Material.Rock, Enum.Material.Rock, Enum.Material.Rock, Enum.Material.Rock },
{ Enum.Material.Rock, Enum.Material.Rock, Enum.Material.Rock, Enum.Material.Rock, Enum.Material.Rock },
{ Enum.Material.Sand, Enum.Material.Sand, Enum.Material.Sand, Enum.Material.Sand, Enum.Material.Sand },
{ Enum.Material.Sand, Enum.Material.Sand, Enum.Material.Sand, Enum.Material.Sand, Enum.Material.Sand },
{ Enum.Material.Mud, Enum.Material.Mud, Enum.Material.Mud, Enum.Material.Mud, Enum.Material.Mud },
{ Enum.Material.Air, Enum.Material.Air, Enum.Material.Air, Enum.Material.Air, Enum.Material.Air },
},
}
local occupancies = {
{
{ 1, 1, 1, 1, 1 },
{ 1, 1, 1, 1, 1 },
{ 1, 1, 1, 1, 1 },
{ 1, 1, 1, 1, 1 },
{ 1, 1, 1, 1, 1 },
{ 0.5, 0.5, 0.5, 0.5, 0.5 },
{ 0, 0, 0, 0, 0 },
},
{
{ 1, 1, 1, 1, 1 },
{ 1, 1, 1, 1, 1 },
{ 1, 1, 1, 1, 1 },
{ 1, 1, 1, 1, 1 },
{ 1, 1, 1, 1, 1 },
{ 0.5, 1, 1, 1, 0.5 },
{ 0, 1, 1, 1, 0 },
},
{
{ 1, 1, 1, 1, 1 },
{ 1, 1, 1, 1, 1 },
{ 1, 1, 1, 1, 1 },
{ 1, 1, 1, 1, 1 },
{ 1, 1, 1, 1, 1 },
{ 0.5, 1, 1, 1, 0.5 },
{ 0, 1, 1, 1, 0 },
},
{
{ 1, 1, 1, 1, 1 },
{ 1, 1, 1, 1, 1 },
{ 1, 1, 1, 1, 1 },
{ 1, 1, 1, 1, 1 },
{ 1, 1, 1, 1, 1 },
{ 0.5, 0.5, 0.5, 0.5, 0.5 },
{ 0, 0, 0, 0, 0 },
},
}
terrain:WriteVoxels(region, resolution, materials, occupancies)
local REGION_START = Vector3.new(-20, -20, -20)
local REGION_END = Vector3.new(20, 20, 20)
local CFRAME = CFrame.new(0, 20, 0)
local SIZE = 50
local function getRegionVolumeVoxels(region)
local resolution = 4
local size = region.Size
return (size.x / resolution) * (size.y / resolution) * (size.z / resolution)
end
local function isRegionTooLargeForReadWriteVoxels(region)
return getRegionVolumeVoxels(region) > 4194304
end
local function isRegionTooLarge(region)
return getRegionVolumeVoxels(region) > 67108864
end
-- Helper function to get an axis-aligned Region3 from the given cframe and size
local function getAABBRegion(cframe, size)
local inv = cframe:Inverse()
local x = size * inv.RightVector
local y = size * inv.UpVector
local z = size * inv.LookVector
local w = math.abs(x.X) + math.abs(x.Y) + math.abs(x.Z)
local h = math.abs(y.X) + math.abs(y.Y) + math.abs(y.Z)
local d = math.abs(z.X) + math.abs(z.Y) + math.abs(z.Z)
local pos = cframe.Position
local halfSize = Vector3.new(w, h, d) / 2
return Region3.new(pos - halfSize, pos + halfSize):ExpandToGrid(4)
end
-- Specific functions for checking individual methods
local function isRegionTooLargeForFillBall(cframe, radius)
local diameter = radius * 2
return isRegionTooLarge(getAABBRegion(cframe, Vector3.new(diameter, diameter, diameter)))
end
local function isRegionTooLargeForFillBlock(cframe, size)
return isRegionTooLarge(getAABBRegion(cframe, size))
end
local function isRegionTooLargeForFillCylinder(cframe, height, radius)
local diameter = radius * 2
return isRegionTooLarge(getAABBRegion(cframe, Vector3.new(diameter, height, diameter)))
end
local function isRegionTooLargeForFillRegion(region)
return isRegionTooLarge(region)
end
local function isRegionTooLargeForFillWedge(cframe, size)
return isRegionTooLarge(getAABBRegion(cframe, size))
end
local function isRegionTooLargeForReplaceMaterial(region)
return isRegionTooLarge(region)
end
local region = Region3.new(REGION_START, REGION_END)
print(isRegionTooLargeForReadWriteVoxels(region))
print(isRegionTooLargeForFillBall(CFRAME, SIZE))
print(isRegionTooLargeForFillBlock(CFRAME, SIZE))
print(isRegionTooLargeForFillCylinder(CFRAME, SIZE, SIZE))
print(isRegionTooLargeForFillRegion(region))
print(isRegionTooLargeForFillWedge(CFRAME, SIZE))
print(isRegionTooLargeForReplaceMaterial(region))