Terrain
*Konten ini diterjemahkan menggunakan AI (Beta) dan mungkin mengandung kesalahan. Untuk melihat halaman ini dalam bahasa Inggris, klik di sini.
Tanah memungkinkan Anda membuat lingkungan yang dapat berubah dinamis dengan sedikit hingga tidak ada kelambatan.Saat ini didasarkan pada grid 4×4×4 sel, di mana setiap sel memiliki nomor antara 0 dan 1 yang mewakili berapa banyak geometri harus mengisi sel, dan materi sel.Kepadatan menentukan bagaimana sel akan berubah bersama dengan sel di sekitarnya, dan hasilnya adalah ilusi tidak memiliki batasan grid.
Untuk informasi lebih lanjut, lihat Tanah.
Rangkuman
Properti
Aktifkan atau nonaktifkan dekorasi medan.
Mengidentifikasi panjang rumput beranimasi.
MaterialColors mewakili editor untuk fitur Warna Material, dan tidak dapat diedit oleh skrip .
Untuk mendapatkan warna material, gunakan: Terrain:GetMaterialColor() Untuk menetapkan warna material, gunakan: Terrain:SetMaterialColor()
Menampilkan batas-batas wilayah paling besar yang dapat diedit.
Tinta air Tanah.
Mengontrol seberapa opak refleksi air di Tanah.
Transparansi air Tanah.
Tetapkan ketinggian maksimum gelombang air Tanah dalam stud.
Mengatur berapa kali gelombang air Tanah akan bergerak ke atas dan ke bawah per menit.
Menentukan apakah suku cadang tidak dapat dipindahkan oleh fisika.
Kecepatan sudut dari penggabungan bagian.
Pusat massa dari pengumpulan bagian di ruang dunia.
Kecepatan linier dari penggabungan bagian.
Massa total dari penggabungan bagian.
Referensi ke bagian akar dari kumpulan.
Menentukan jenis permukaan untuk Sisi Belakang suku cadang (+Z arah).
Menentukan jenis permukaan untuk wajah Bawah dari suku cadang (-Y arah).
Menentukan warna suku cadang.
Menentukan posisi dan orientasi BasePart di dunia.
Menentukan apakah bagian dapat bertabrakan dengan bagian lain.
Menentukan apakah bagian tersebut dianggap selama operasi pencarian spasial.
Menentukan apakah Touched dan TouchEnded peristiwa terbakar di bagian.
Menentukan apakah bagian itu melemparkan bayangan atau tidak.
Menggambarkan posisi dunia di mana pusat massa bagian terletak.
Menggambarkan nama grup tabrakan bagian.
Menentukan warna suku cadang.
Menunjukkan properti fisik saat ini dari bagian.
Menentukan beberapa properti fisik dari suku cadang.
Digunakan untuk mengaktifkan atau menonaktifkan kekuatan aerodinamik pada bagian dan kumpulan.
Ukuran fisik aktual dari BasePart sebagai dianggap oleh mesin fisika.
Menentukan jenis permukaan untuk wajah depan suku cadang (-Z arah).
Menentukan jenis permukaan untuk wajah Kiri dari suku cadang (-X arah).
Menentukan pengganda untuk BasePart.Transparency yang hanya terlihat oleh klien lokal.
Menentukan apakah bagian dapat dipilih di Studio.
Menggambarkan massa bagian, produk dari kepadatan dan volumenya.
Menentukan apakah bagian berkontribusi pada massa total atau inersia tubuh kaku.
Menentukan tekstur dan properti fisik default dari suku cadang.
Nama MaterialVariant .
Menggambarkan rotasi bagian di dunia.
Mengidentifikasi offset pivot bagian dari CFrame nya.
Menggambarkan posisi bagian di dunia.
Waktu sejak pembaruan fisika terakhir update.
Menentukan seberapa banyak bagian mencerminkan skybox.
Menggambarkan perubahan terkecil dalam ukuran yang diizinkan oleh metode Resize.
Menggambarkan wajah di mana bagian dapat diubah ukurannya.
Menentukan jenis permukaan untuk wajah Kanan dari suku cadang (+X arah).
Aturan utama dalam menentukan bagian akar dari sebuah kumpulan.
Rotasi bagian dalam derajat untuk tiga sumbu.
Menentukan dimensi suku cadang (panjang, lebar, tinggi).
Menentukan jenis permukaan untuk bagian atas wajah suku cadang (+Y arah).
Menentukan berapa banyak bagian yang dapat dilihat melalui (kebalikan dari oposisi bagian).
Metode
Kembalikan posisi dunia pusat sel medan (x, y, z).
Kembalikan posisi sudut kiri bawah ke depan grid sel (x, y, z).
Menyapu tanah.
Menyimpan potongan tanah ke dalam objek TerrainRegion sehingga dapat dimuat kembali nanti.Catatan: TerrainRegion data tidak diulang antara server dan klien.
Kembalikan jumlah sel non-kosong di Tanah.
Mengisi bola tanah mulus di ruang tertentu.
Mengisi blok tanah mulus dengan lokasi, rotasi, ukuran, dan material yang diberikan.
Mengisi silinder tanah halus di ruang tertentu.
Mengisi ruang Region3 dengan medan mulus.
Mengisi volume berbentuk segi tiga dari Tanah dengan Enum.Material yang diberikan dan CFrame dan Ukuran daerah.
Kembalikan warna material medan saat ini untuk material medan tertentu.
Menerapkan potongan tanah ke objek Tanah. Catatan: TerrainRegion data tidak berkembang di antara server dan klien.
Kembalikan wilayah data vokel medan di format tabel berdasarkan nama saluran.
Kembalikan wilayah tertentu dari medan halus dalam format tabel.
- ReplaceMaterial(region : Region3,resolution : number,sourceMaterial : Enum.Material,targetMaterial : Enum.Material):()
Menggantikan medan sebuah materi di dalam wilayah dengan materi lain.
Tetapkan warna material medan saat ini untuk material medan tertentu.
Kembalikan lokasi sel grid yang berisi posisi titik **** .
Kembalikan lokasi sel grid yang berisi posisi titik, memilih sel grid kosong saat posisi berada di tepi grid.
Kembalikan lokasi sel grid yang berisi posisi titik, memilih sel grid non-kosong saat posisi berada di tepi grid.
Mengatur wilayah tanah menggunakan kamus data saluran voksel.
Mengatur wilayah tertentu dari medan halus menggunakan format tabel.
Terapkan dorongan sudut ke kumpulan.
Terapkan impuls ke kumpulan di kumpulan center of mass .
Terapkan impuls ke kumpulan di posisi yang ditentukan.
Kembalikan apakah bagian dapat bertabrakan satu sama lain.
Memeriksa apakah Anda dapat mengatur kepemilikan jaringan bagian.
Kembalikan tabel bagian yang terhubung ke objek dengan jenis persambungan kaku apa pun.
Kembalikan semua Persyaratan atau Batasan yang terhubung ke Bagian ini.
Kembalikan nilai properti Mass .
Kembalikan pemain saat ini yang merupakan pemilik jaringan dari bagian ini, atau nil dalam kasus server.
Kembali benar jika mesin permainan secara otomatis memutuskan pemilik jaringan untuk bagian ini.
Kembalikan bagian dasar dari kumpulan bagian.
Kembalikan tabel semua bagian BasePart.CanCollide nyata yang berpotongan dengan bagian ini.
Kembalikan kecepatan linier penggabungan bagian pada posisi yang diberikan relatif terhadap bagian ini.
Kembalikan benar jika objek terhubung ke bagian yang akan menahan di tempatnya (sebagai contoh bagian Anchored), jika tidak maka kembalikan false.
Mengubah ukuran objek seperti menggunakan alat perubah ukuran Studio.
Atur pemain yang diberikan sebagai pemilik jaringan untuk ini dan semua bagian yang terhubung.
Membiarkan mesin permainan dinamis memutuskan siapa yang akan menangani fisika bagian (salah satu klien atau server).
- IntersectAsync(parts : Instances,collisionfidelity : Enum.CollisionFidelity,renderFidelity : Enum.RenderFidelity):Instance
Membuat baru IntersectOperation dari geometri tumpang tindih dari bagian dan bagian lain dalam array yang diberikan.
- SubtractAsync(parts : Instances,collisionfidelity : Enum.CollisionFidelity,renderFidelity : Enum.RenderFidelity):Instance
Membuat baru UnionOperation dari bagian, minus geometri yang ditempati oleh bagian dalam array yang diberikan.
- UnionAsync(parts : Instances,collisionfidelity : Enum.CollisionFidelity,renderFidelity : Enum.RenderFidelity):Instance
Membuat baru UnionOperation dari bagian, plus geometri yang ditempati oleh bagian dalam array yang diberikan.
Mendapatkan pivot dari PVInstance .
Mengubah PVInstance bersama dengan semua keturunannya PVInstances sehingga pivot sekarang terletak di lokasi yang ditentukan CFrame .
Acara
Acara diwarisi dari BasePartMelepaskan api ketika bagian berhenti menyentuh bagian lain sebagai hasil dari gerakan fisik.
Melepaskan api ketika bagian menyentuh bagian lain sebagai hasil dari gerakan fisik.
Properti
Decoration
Saat ini mengaktifkan atau menonaktifkan rumput beranimasi di material medan Rumput , meskipun modifikasi masa depan dari properti ini dapat mengontrol fitur dekoratif tambahan.
GrassLength
Mengidentifikasi panjang rumput beranimasi pada material medan Rumput , dengan asumsi Decoration diaktifkan. Nilai yang valid berada di antara 0.1 dan 1.
MaterialColors
MaterialColors mewakili editor untuk fitur Warna Material, dan tidak dapat diedit oleh skrip .
Untuk mendapatkan warna material, gunakan: Terrain:GetMaterialColor()
Untuk menetapkan warna material, gunakan: Terrain:SetMaterialColor()
WaterWaveSize
Mengatur ketinggian maksimum gelombang air Tanah dalam stud. Ini saat ini dibatasi antara 0 dan 1.
WaterWaveSpeed
Mengatur berapa kali gelombang air Tanah akan bergerak naik dan turun per menit. Ini saat ini dibatasi antara 0 dan 100.
Metode
CellCenterToWorld
Kembalikan posisi dunia pusat sel medan (x, y, z).
Parameter
Memberikan nilai
CellCornerToWorld
Kembalikan posisi sudut kiri bawah ke depan grid sel (x, y, z).
Parameter
Memberikan nilai
Clear
Menyapu tanah.
Memberikan nilai
CopyRegion
Menyimpan potongan tanah ke dalam objek TerrainRegion sehingga dapat dimuat kembali nanti.Catatan: TerrainRegion data tidak diulang antara server dan klien.
Parameter
Memberikan nilai
Contoh Kode
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
Mengisi bola tanah mulus di ruang tertentu.
Parameter
Posisi pusat bola medan.
Jari dalam stud dari bola medan.
The Enum.Material dari bola medan.
Memberikan nilai
Contoh Kode
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
Mengisi blok tanah mulus dengan lokasi, rotasi, ukuran, dan material yang diberikan.
Parameter
Posisi dan orientasi blok tanah.
Ukuran dalam stud dari blok persegi - baik ketinggian dan lebar.
The Enum.Material dari blok medan.
Memberikan nilai
FillCylinder
Mengisi silinder tanah mulus di ruang tertentu. Ruang didefinisikan menggunakan CFrame, ketinggian, dan radius.
local Workspace = game:GetService("Workspace")Workspace.Terrain:FillCylinder(CFrame.new(0, 50, 0), 5, 30, Enum.Material.Asphalt)
Parameter
Posisi dan orientasi silinder tanah.
Tinggi dalam stud dari silinder medan.
Jari dalam stud dari silinder medan.
The Enum.Material dari silinder medan.
Memberikan nilai
FillRegion
Mengisi ruang Region3 dengan medan mulus.
Parameter
Memberikan nilai
FillWedge
FillWedge() mengisi volume berbentuk segi tiga dari Terrain dengan Enum.Material dan ukuran area dan yang diberikan CFrame .Orientasi pasak sama dengan setara WedgePart .
Parameter
Posisi dan orientasi pasak untuk diisi.
Ukuran lembaga untuk diisi.
Bahan yang akan diisi dengan pasak.
Memberikan nilai
GetMaterialColor
Kembalikan warna material medan saat ini untuk material medan yang ditentukan.
Parameter
Memberikan nilai
PasteRegion
Menerapkan potongan tanah ke objek Tanah. Catatan: TerrainRegion data tidak berkembang di antara server dan klien.
Parameter
Memberikan nilai
Contoh Kode
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
Kembalikan wilayah data vokel medan di format tabel berdasarkan nama saluran.
Parameter
Wilayah target untuk dibaca. Harus sesuai dengan grid voxel. Akan menyebabkan kesalahan jika wilayah terlalu besar; batas saat ini adalah 4194304 voksels³.
Resolusi voksel. Harus menjadi 4.
Array ID saluran (string) yang perlu diakses dari data voksel.Setiap ID saluran mewakili jenis data yang disimpan di voxel.ID yang didukung saat ini adalah {"SolidMaterial", "SolidOccupancy", "LiquidOccupancy"} .
Memberikan nilai
Kembalikan data vokel sebagai kamus berdasarkan input channelIds . Kunci mewakili setiap ID saluran dengan nilai masing-masing sebagai array data 3D.
- SolidMaterial — Bahan Enum.Material dari vokel.Perhatikan bahwa Water tidak lagi didukung; sebagai gantinya, vokel yang berisi air akan memiliki nilai LiquidOccupancy .
- SolidOccupancy — Pemenuhan material vokel seperti yang ditentukan di saluran SolidMaterial. Ini adalah nilai antara 0 (kosong) dan 1 (penuh).
Kamus juga berisi kunci Size dengan nilai yang mewakili ukuran array 3D dari setiap data saluran.
Contoh Kode
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
Kembalikan wilayah tertentu dari medan halus dalam format tabel.
Parameter
Wilayah target untuk dibaca. Harus sesuai dengan grid voxel. Akan menyebabkan kesalahan jika wilayah terlalu besar. Batas saat ini adalah 4194304 voksels^3.
Resolusi voksel. Harus menjadi 4.
Memberikan nilai
Kembalikan data vokel mentah sebagai dua array 3D.
- - array 3D dari area target. Juga berisi bidang Ukuran, sama dengan dimensi array terkait.
- occupancies - array 3D nilai occupasi dari area target. Juga berisi bidang Ukuran, sama dengan dimensi array terkait.
Contoh Kode
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
Pengganti Bahan menggantikan medan dari tertentu Enum.Material dalam Region3 dengan bahan lain.Pada dasarnya, ini adalah operasi temukan dan ganti pada Terrain materi.
Kontraksi
Saat memanggil metode ini, parameter resolution harus persis 4.Selain itu, Region3 harus disesuaikan dengan grid materi medan, yaitukomponen minimum dan maksimum dari Region3 harus dibagi 4.Gunakan Region3:ExpandToGrid() untuk membuat wilayah kompatibel dengan fungsi ini.
Parameter
Wilayah di mana operasi penggantian akan terjadi.
Resolusi di mana operasi penggantian akan tempat; saat ini harus persis 4.
Bahan lama yang harus diganti.
Bahan baru.
Memberikan nilai
Contoh Kode
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
Tetapkan warna material medan saat ini untuk material medan tertentu. Material medan akan bergeser warna dasarnya menuju warna tertentu.
Parameter
Memberikan nilai
WorldToCell
Kembalikan lokasi sel grid yang berisi posisi titik **** .
Parameter
Memberikan nilai
WorldToCellPreferEmpty
Kembalikan lokasi sel grid yang berisi posisi titik, memilih sel grid kosong saat posisi berada di tepi grid.
Parameter
Memberikan nilai
WorldToCellPreferSolid
Kembalikan lokasi sel grid yang berisi posisi titik, memilih sel grid non-kosong saat posisi berada di tepi grid.
Parameter
Memberikan nilai
WriteVoxelChannels
Mengatur wilayah tanah menggunakan kamus data saluran voksel.
Parameter
Wilayah target untuk ditulis. Harus sesuai dengan grid voxel. Akan menyebabkan kesalahan jika wilayah terlalu besar; batas saat ini adalah 4194304 voksels³.
Resolusi voksel. Harus menjadi 4.
Kamus data voksel yang mirip dengan nilai pengembalian dari ReadVoxelChannels() .Kunci mewakili setiap ID saluran dengan nilai masing-masing sebagai array data 3D.Kamus dapat mendukung input saluran tunggal atau banyak.
- SolidMaterial — Bahan Enum.Material dari vokel.Perhatikan bahwa Water tidak lagi didukung; sebagai gantinya, vokel yang hanya berisi air harus dimasukkan sebagai SolidMaterial = Enum.Material.Air, LiquidOccupancy = x , di mana x adalah angka antara 0 (eksklusif) dan 1 (inklusif).
- SolidOccupancy — Pemenuhan material vokel seperti yang ditentukan di saluran SolidMaterial. Ini harus menjadi nilai antara 0 (kosong) dan 1 (penuh).
Memberikan nilai
Contoh Kode
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
Mengatur wilayah tertentu dari medan halus menggunakan format tabel.
Parameter
Wilayah target untuk ditulis. Harus disesuaikan dengan grid voxel. Akan menyebabkan kesalahan jika wilayah terlalu besar.
Resolusi voksel. Harus menjadi 4.
배열 3D dari Enum.Material. Dimensi harus persis cocok dengan ukuran wilayah target dalam voksels.
배열 3D dari keberadaan voksel (angka antara 0 dan 1). Dimensi harus sesuai dengan ukuran wilayah target dalam vokel.
Memberikan nilai
Contoh Kode
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))