Terrain
*Ta zawartość została przetłumaczona przy użyciu narzędzi AI (w wersji beta) i może zawierać błędy. Aby wyświetlić tę stronę w języku angielskim, kliknij tutaj.
Teren pozwala tworzyć dynamicznie zmienialne środowiska z niewielkim lub żadnym lagiem.Obecnie opiera się na siatce 4×4×4 komórek, w której każda komórka ma numer pomiędzy 0 a 1 reprezentujący to, ile geometria powinna zajmować komórkę i materiał komórki.Zajętość określa, w jaki sposób komórka będzie się zmieniać razem z otaczającymi ją komórkami, a wynikiem jest złudzenie, że nie ma ograniczenia siatki.
Aby uzyskać więcej informacji, zobacz Teren.
Podsumowanie
Właściwości
Włącza lub wyłącza dekorację terenu.
Określa długość animowanej trawy.
MaterialColors reprezentuje edytor dla funkcjaKolor materiału i nie może być edytowany przez skrypty .
Aby uzyskać kolor materiału, użyj: Terrain:GetMaterialColor() Aby ustawić kolor materiału, użyj: Terrain:SetMaterialColor()
Wyświetla granice największego możliwego edytowalnego regionu.
Odcień wody na terenie.
Kontroluje, jak mętne są odblaski wody na terenie.
Przezroczystość wody na terenie.
Ustawia maksymalną wysokość fal wody terenu w szpilkach.
Ustawia, ile razy fale wody terenu będą się poruszać w górę i w dół na minutę.
Określa, czy część jest nieruchoma z fizyki.
Prędkość kątowa montażu części.
Centrum masy złożenia części w przestrzeni świata.
Liniowa prędkość montażu części.
Całkowita masa montażu części.
Odwołanie do części korzeniowej zbioru.
Określa rodzaj powierzchni dla tylnej strony części (+ kierunek Z).
Określa rodzaj powierzchni dla dolnej strony części (-Y kierunek).
Określa kolor części.
Określa pozycję i orientację BasePart w świecie.
Określa, czy część może zderzyć się z innymi częściami.
Określa, czy część jest rozważana podczas operacji zapytania przestrzennego.
Określa, czy zdarzenia Touched i TouchEnded wystrzelają z części.
Określa, czy część rzuca cień, czy nie.
Opisuje pozycję świata, w której znajduje się centrum masy części.
Opisuje nazwę grupakolizji części.
Określa kolor części.
Wskazuje aktualne właściwości fizyczne części.
Określa kilka fizycznych właściwości części.
Używany do włączania lub wyłączania sił aerodynamicznych na częściach i zespołach.
Rzeczywisty rozmiar fizyczny BasePart zgodnie z silnikiem fizycznym.
Określa rodzaj powierzchni dla przodu części (-Z kierunek).
Określa rodzaj powierzchni dla lewej strony części (-X kierunek).
Określa mnożnik dla BasePart.Transparency, który jest widoczny tylko dla lokalnego klienta.
Określa, czy część jest wybieralna w Studio.
Opisuje masę części, produkt jej gęstości i objętości.
Określa, czy część przyczynia się do całkowitej masy lub bezwładności jej twardego ciało.
Określa teksturę i domyślne właściwości fizyczne części.
Nazwa MaterialVariant.
Opisuje rotację części w świecie.
Określa przesunięcie osi części od jej CFrame.
Opisuje pozycję części w świecie.
Czas od ostatniej rejestrowanej aktualizacjafizyki.
Określa, ile część odzwierciedla niebo.
Opisuje najmniejszą zmianę rozmiaru dozwoloną przez metodę Skalowanie.
Opisuje twarze, na których można zmienić rozmiar części.
Określa rodzaj powierzchni dla prawej strony części (+X kierunek).
Główna zasada określania głównej części złożenia.
Rotacja części w stopniach dla trzech osi.
Określa wymiary części (długość, szerokość, wysokość).
Określa rodzaj powierzchni dla górnej części części (+ kierunek Y).
Określa, jak dużo część może być widoczna poprzez (odwrotność przeźroczystości części).
Metody
Zwraca pozycję świata w centrum komórki terenu (x, y, z).
Zwraca pozycję dolnego lewego kąta komórki siatki (x, y, z).
Oczyszcza teren.
Przechowuje kawałek terenu w obiekcie TerrainRegion, aby później mógł zostać ponownie załadowany.Uwaga: TerrainRegion dane nie są replikowane między serwerem a klientem.
Zwraca liczbę niepróżnych komórek w terenie.
Wypełnia kulę gładkiego terenu w dannej przestrzeni.
Wypełnia blok gładkiego terenu daną lokalizacją, rotacją, rozmiarem i materiałem.
Wypełnia cylinder gładkiego terenu w określonej przestrzeni.
Wypełnia przestrzeń Region3 płynnym terenem.
Wypełnia wolumen o kształcie klinowym terenu danym Enum.Material i CFrame i rozmiarem obszaru.
Zwraca obecny kolor materiału terenu dla określonego materiału terenu.
Zastosuj kawałek terenu do obiektu Teren. Uwaga: TerrainRegion dane nie są replikowane między serwerem a klientem.
Zwraca region danych woxel terenu w formacie tabeli na podstawie nazw kanałów.
Zwraca określony region gładkiego terenu w formacie tabeli.
- ReplaceMaterial(region : Region3,resolution : number,sourceMaterial : Enum.Material,targetMaterial : Enum.Material):()
Zastępuje teren materiału w regionie innym materiałem.
Ustawia obecny kolor materiału terenu dla określonego materiału terenu.
Zwraca lokalizację komórki siatki, która zawiera punkt pozycja .
Zwraca lokalizację komórki siatki, która zawiera pozycję punktu, preferując puste komórki siatki, gdy pozycja jest na krawędzi siatki.
Zwraca lokalizację komórki siatki, która zawiera pozycję punktu, preferując puste komórki siatki, gdy pozycja znajduje się na krawędzi siatki.
Ustawia region terenu za pomocą słownika danych kanału voxelowego.
Ustawia pewien region gładkiego terenu za pomocą formatu tabeli.
Zastosuj impuls kątowy do złożenia.
Zastosuj impuls do zgromadzenia na zgromadzeniu center of mass .
Zastosuj impuls do złożenia w określonej pozycji.
Zwraca, czy części mogą się ze sobą zderzać.
Sprawdza, czy możesz ustawić własność sieci części.
Zwraca tabelę części połączonych z obiektem za pomocą dowolnego rodzaju sztywnego stawu.
Zwróć wszystkie stawy lub ograniczenia, które są połączone z tą częścią.
Zwraca wartość właściwości Mass .
Zwraca obecnego gracza, który jest właścicielem sieci tej części lub nil w przypadku serwera.
Zwraca prawdę, jeśli silnik gry automatycznie decyduje o właścicielu sieci dla tej części.
Zwraca podstawową część zespołu części.
Zwraca tabelę wszystkich BasePart.CanCollide prawdziwych części, które się z tym częścią pokrywają.
Zwraca liniową prędkość montażu części w danym położeniu względem tej części.
Wyświetla prawdę, jeśli obiekt jest połączony z częścią, która go utrzyma w miejscu (np. częścią Anchored), w przeciwnym razie wyświetla fałsz.
Zmienia rozmiar obiektu tak jak za pomocą narzędzia przesuwania rozmiaru Studio.
Ustawia danego gracza jako właściciela sieci dla tej i wszystkich połączonych części.
Pozwala silnikowi gry dynamicznie decydować, kto będzie zajmował się fizyką części (jeden z klientów lub serwer).
- IntersectAsync(parts : Instances,collisionfidelity : Enum.CollisionFidelity,renderFidelity : Enum.RenderFidelity):Instance
Tworzy nową IntersectOperation z pokrywającej się geometrii części i innych części w danym obszarze.
- SubtractAsync(parts : Instances,collisionfidelity : Enum.CollisionFidelity,renderFidelity : Enum.RenderFidelity):Instance
Tworzy nowy UnionOperation z części, odejmując geometrię zajętą przez części w danym array.
- UnionAsync(parts : Instances,collisionfidelity : Enum.CollisionFidelity,renderFidelity : Enum.RenderFidelity):Instance
Tworzy nowy UnionOperation z części, plus geometrię zajętą przez części w danym array.
Otrzymuje pivot z PVInstance .
Przekształca PVInstance wraz z całym jego potomkiem PVInstances tak, że osie zostaną teraz umieszczone w określonym CFrame .
Zdarzenia
Zdarzenia odziedziczeni z: BasePartWypala się, gdy część przestaje dotykać innej części w wyniku ruchu fizycznego.
Wypala się, gdy część dotyka innej części w wyniku ruchu fizycznego.
Właściwości
Decoration
Obecnie włącza lub wyłącza animowaną trawę na materiale terenu Trawa , chociaż przyszłe modyfikacje tej właściwości mogą kontrolować dodatkowe dekoracyjne funkcje.
GrassLength
Określa długość animowanej trawy na materiale terenu Trawa , zakładając, że Decoration jest włączone. Poprawne wartości wynoszą od 0,1 do 1.
MaterialColors
MaterialColors reprezentuje edytor dla funkcjaKolor materiału i nie może być edytowany przez skrypty .
Aby uzyskać kolor materiału, użyj: Terrain:GetMaterialColor()
Aby ustawić kolor materiału, użyj: Terrain:SetMaterialColor()
WaterWaveSize
Ustawia maksymalną wysokość fal wody terenu w szpilkach. Obecnie jest to ograniczone między 0 a 1.
WaterWaveSpeed
Ustawia, ile razy fale wody terenu będą się poruszać w górę i w dół na minutę. Obecnie jest to ograniczone między 0 a 100.
Metody
CellCenterToWorld
Zwraca pozycję świata w centrum komórki terenu (x, y, z).
Parametry
Zwroty
CellCornerToWorld
Zwraca pozycję dolnego lewego kąta komórki siatki (x, y, z).
Parametry
Zwroty
Clear
Oczyszcza teren.
Zwroty
CopyRegion
Przechowuje kawałek terenu w obiekcie TerrainRegion, aby później mógł zostać ponownie załadowany.Uwaga: TerrainRegion dane nie są replikowane między serwerem a klientem.
Parametry
Zwroty
Przykłady kodu
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
Wypełnia kulę gładkiego terenu w dannej przestrzeni.
Parametry
Pozycja centrum piłki terenu.
Promień w szpilkach kuli terenu.
The Enum.Material z piłki terenu.
Zwroty
Przykłady kodu
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
Wypełnia blok gładkiego terenu daną lokalizacją, rotacją, rozmiarem i materiałem.
Parametry
Pozycja i orientacja bloku terenu.
Rozmiar w szpilkach kwadratowego bloku - zarówno wysokość, jak i szerokość.
The Enum.Material z bloku terenu.
Zwroty
FillCylinder
Wypełnia cylinder o gładkim terenie w określonej przestrzeni. Przestrzeń jest określana za pomocą CFrame, wysokości i promienia.
local Workspace = game:GetService("Workspace")Workspace.Terrain:FillCylinder(CFrame.new(0, 50, 0), 5, 30, Enum.Material.Asphalt)
Parametry
Pozycja i orientacja cylindra terenu.
Wysokość w szpilkach cylindra terenu.
Promień w szpilkach terenu cylindra.
The Enum.Material z cylindra terenu.
Zwroty
FillRegion
Wypełnia przestrzeń Region3 płynnym terenem.
Parametry
Zwroty
FillWedge
wypełnia kształtem klinowy objętość z danym i rozmiarem obszaru.Orientacja klinu jest taka sama jak odpowiednik WedgePart.
Parametry
Pozycja i orientacja klinu do wypełnienia.
Rozmiar klinu do wypełnienia.
Materiał, z którym klin zostanie wypełniony.
Zwroty
GetMaterialColor
Zwraca obecny kolor materiału terenu dla określonego materiału terenu.
Parametry
Zwroty
PasteRegion
Zastosuj kawałek terenu do obiektu Teren. Uwaga: TerrainRegion dane nie są replikowane między serwerem a klientem.
Parametry
Zwroty
Przykłady kodu
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
Zwraca region danych woxel terenu w formacie tabeli na podstawie nazw kanałów.
Parametry
Wybrany region do odczytania. Musi być zgodny z siatką woxeli. Wyrzuci błąd, jeśli region jest zbyt duży; limit obecnie wynosi 4194304 woxeli³.
Rozdzielczość woksela. Musi wynosić 4.
Zbiór identyfikatorów kanałów (tekstów), które muszą być uzyskiwane z danych woksela.Każda ID kanału reprezentuje typ danych przechowywanych w voxeluObecnie wspierane ID to {"SolidMaterial", "SolidOccupancy", "LiquidOccupancy"}.
Zwroty
Zwraca dane woksel jako słownik na podstawie wejścia channelIds. Klucze reprezentują każdą ID kanału z odpowiednią wartością jako tablicę 3D danych.
- SolidMaterial — Materiał Enum.Material z voxela.Zauważ, że Water nie jest już wspierany; zamiast tego woxel, który zawiera wodę, będzie miał wartość LiquidOccupancy .
- SolidOccupancy — Zajęcie materiału woxela, określone w kanałSolidMaterial. Jest to wartość pomiędzy 0 (próżnia) a 1 (pełne).
Słownik zawiera również klucz Size z wartością reprezentującą rozmiar matrycy 3D dla każdej danych kanału.
Przykłady kodu
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
Zwraca określony region gładkiego terenu w formacie tabeli.
Parametry
Wybrany region do odczytania. Musi być zgodny z siatką woxeli. Wyrzuci błąd, jeśli region jest zbyt duży. Limit obecnie wynosi 4194304 woxeli^3.
Rozdzielczość woksela. Musi wynosić 4.
Zwroty
Zwraca surowe dane woxelowe jako dwie matryce 3D.
- materials - 3D arkusz z Enum.Material z obszaru docelowego. Zawiera również pole Rozmiar, równe wymiarom połączonych arkuszy.
- occupancies - 3D matryca wartości zajętości z obszaru docelowego. Zawiera również pole Rozmiar, równe wymiarom połączonych matryc.
Przykłady kodu
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
Zastąpienie materiału zastępuje teren pewnego Enum.Material w ramach Region3 innym materiałem.Zasadniczo jest to operacja wyszukiwania i wymiany na Terrain materiałach.
Ograniczenia
Podczas wywołania tej metody parametr resolution musi być dokładnie 4.Ponadto Region3 musi być zgodny z siatką materiałów terenu, tj.:składniki minimalnych i maksymalnych punktów Region3 muszą być dzielne przez 4.Użyj Region3:ExpandToGrid(), aby uczynić region kompatybilnym z tą funkcją.
Parametry
Region, w którym występowaćoperacja zastąpienia.
Rozdzielczość, w której odbędzie miejsceoperacja zamiany; w tej chwili musi to być dokładnie 4.
Stary materiał, który zostanie zastąpiony.
Nowy materiał.
Zwroty
Przykłady kodu
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
Ustawia obecny kolor materiału terenu dla określonego materiału terenu. Materiał terenu zmieni swój podstawowy kolor w kierunku określonego koloru.
Parametry
Zwroty
WorldToCell
Zwraca lokalizację komórki siatki, która zawiera punkt pozycja .
Parametry
Zwroty
WorldToCellPreferEmpty
Zwraca lokalizację komórki siatki, która zawiera pozycję punktu, preferując puste komórki siatki, gdy pozycja jest na krawędzi siatki.
Parametry
Zwroty
WorldToCellPreferSolid
Zwraca lokalizację komórki siatki, która zawiera pozycję punktu, preferując puste komórki siatki, gdy pozycja znajduje się na krawędzi siatki.
Parametry
Zwroty
WriteVoxelChannels
Ustawia region terenu za pomocą słownika danych kanału voxelowego.
Parametry
Wybrany region, do którego należy napisać. Musi być zgodny z siatką woxeli. Wyrzuci błąd, jeśli region jest zbyt duży; limit obecnie wynosi 4194304 woxeli³.
Rozdzielczość woksela. Musi wynosić 4.
Słownik danych woksel podobnych do wartości zwrotnej ReadVoxelChannels() .Klucze reprezentują każdą ID kanału z ich odpowiednią wartością jako tablicę 3D danych.Słownik może wspierać pojedyncze lub wielokanałowe wejścia.
- SolidMaterial — Materiał Enum.Material z voxela.Zauważ, że Water nie jest już wspierany; zamiast tego woxel, który zawiera tylko wodę, powinien zostać wprowadzony jako SolidMaterial = Enum.Material.Air, LiquidOccupancy = x, gdzie x jest liczbą pomiędzy 0 (ekskluzywną) a 1 (włączną).
- SolidOccupancy — Zajęcie materiału woxela, określone w kanałSolidMaterial. Powinno to być wartość pomiędzy 0 (próżnia) a 1 (pełne).
Zwroty
Przykłady kodu
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
Ustawia pewien region gładkiego terenu za pomocą formatu tabeli.
Parametry
Wybrany region, do którego należy napisać. Musi być zgodny z siatką woxeli. Wyrzuci błąd, jeśli region jest zbyt duży.
Rozdzielczość woksela. Musi wynosić 4.
3D-matryca Enum.Material. Wymiary musi dokładnie pasować do rozmiaru docelowego regionu w pikselach.
3D matryca zajęć voxel (liczba pomiędzy 0 a 1). Wymiary muszą dokładnie odpowiadać rozmiarowi docelowego regionu w voxelach.
Zwroty
Przykłady kodu
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))