Terrain
*Konten ini diterjemahkan menggunakan AI (Beta) dan mungkin mengandung kesalahan. Untuk melihat halaman ini dalam bahasa Inggris, klik di sini.
Tainbow memungkinkan Anda untuk menciptakan lingkungan yang dapat dinamis dengan sedikit atau tanpa ketinggalan. Ini saat ini didasarkan pada 4×4×4 grid sel, di mana setiap sel memiliki nomor antara 0 dan 1 mewakili seberapa banyak geometri harus mengambil sel, dan material sel. Penempatan menentukan cara sel akan bermorph bersama dengan sel mengelilingi, dan hasilny
Untuk lebih banyak informasi, lihat Tanah .
Rangkuman
Properti
Mengaktifkan atau menonaktifkan dekorasi tanah.
Mengukur panjang rumput animasi.
WarnaMaterial mewakili editor untuk fitur Warna Material, dan tidak dapat diubah oleh skrip .
Untuk mendapatkan warna material, gunakan: Terrain:GetMaterialColor() Untuk menetapkan warna material, gunakan: Terrain:SetMaterialColor()
Menunjukkan batas-batas dari wilayah yang dapat diedit terbesar.
Warna air lapangan.
Mengontrol seberapa opak refleksi air lapangan.
Keseruan air lapangan.
Tetapkan ketinggian maksimum gelombang air di studs.
Mengatur berapa banyak kali gelombang air lapangan akan bergerak ke atas dan ke bawah per menit.
Menentukan apakah bagian itu tidak dapat dipindahkan oleh fisika.
Kecepatan sudut dari pemasangan bagian.
Pusat massa pemasangan bagian di ruang dunia.
Kecepatan liniasi bagian.
Jumlah total pemasangan bagian.
Sebuah referensi ke bagian akhir dari pemasangan.
Mendeterminas jenis permukaan untuk Wajah Belakang sebuah bagian (+Z arah).
Mendeterminas jenis permukaan untuk Wajah Bawah bagian (-Y).
Mengubah warna bagian.
Mengidentifikasi posisi dan orientasi BasePart di dunia.
Menentukan apakah bagian dapat bertabrakan dengan bagian lain.
Mengukur apakah bagian dianggap selama operasi pencarian ruang.
Menentukan apakah acara Touched dan TouchEnded di pihak kiri pihak kiri pihak kiri pihak kiri pihak kiri pihak kiri pihak kiri pihak kiri pihak kiri pihak kiri pihak kiri pihak kiri pihak kiri pihak kiri pihak kiri pihak kiri pihak kiri pihak kiri pihak kiri pihak kiri pihak kiri pihak kiri pihak kiri pihak kiri pihak kiri
Menentukan apakah atau tidak bagian menggunakan bayangan.
Menggambarkan lokasi posisi dunia di mana pusat massa bagian berada.
Menggambarkan nama gruptabrakan bagian.
Mengubah warna bagian.
Menunjukkan proporsi fisik saat ini dari bagian.
Mengidentifikasi beberapa sifat fisik bagian.
Digunakan untuk mengaktifkan atau menonaktifkan kekuatan aerodinamik pada bagian dan asal.
Datatype.CFrame dari ekstensi fisik Class.BasePart .
Ukuran fisik sebenarnya dari BasePart seperti yang dilihat oleh mesin fisika.
Mendeterminas jenis permukaan untuk Wajah Depan sebuah bagian (-Z arah).
Mendeterminas jenis permukaan untuk Wajah Kiri sebuah bagian (-X arah).
Mengidentifikasi pengganda untuk BasePart.Transparency yang hanya terlihat bagi klien lokal.
Mengesokkan apakah bagian dapat dipilih di Studio.
Menggambarkan massa bagian, produk dari kedensitas dan volume.
Menentukan apakah bagiannya berkontribusi pada total massa atau inersia tubuh kerasnya.
Mengidentifikasi tekstur dan proporsi fisik default sebuah bagian.
Nama dari MaterialVariant .
Menggambarkan rotasi bagian di dunia.
MengukurOffset bagian dari pivotnya dari CFrame nya.
Menggambarkan posisi bagian di dunia.
Waktu sejak updatefisika terakhir.
Menentukan seberapa banyak bagian mencerminkan langit.
Menggambarkan perubahan ukuran terkecil yang diizinkan oleh metode Resize.
Menggambarkan wajah mana yang dapat diubah ukurannya.
Mengidentifikasi jenis permukaan untuk Wajah Kanan bagian (+X arah).
Aturan utama dalam menentukan bagian akar dari sebuahAssembly.
Rotasi bagian dalam derajat untuk tiga sumbu.
Mengukur dimensi sebuah bagian (panjang, lebar, tinggi).
Mendeterminas jenis permukaan untuk Wajah Atas bagian (+Y arah).
Menentukan seberapa banyak bagian dapat dilihat melalui (kebalikan dari keopakean bagian).
Metode
Mengembalikan posisi dunia dari pusat sel tanah (x, y, z).
Mengembalikan posisi sudut kiri bawah dari sel konsentrasi (x, y, z).
Bersihkan tanah.
Menyimpan sepotong tanah ke dalam objek TerrainRegion sehingga dapat diakses kembali nanti. Catatan: TerrainRegion data tidak diklon antara server dan klien.
Mengembalikan jumlah sel non- Kosong di Tanah.
Mengisi bola tanah halus di ruang tertentu.
Mengisi blok tanah halus dengan lokasi, rotasi, ukuran, dan bahan yang diberikan.
Mengisi silinder tanah halus di ruang tertentu.
Mengisi ruang Region3 dengan tanah yang halus.
Mengisi volume terreno berbentuk segi enam dengan Enum.Material yang diberikan dan CFrame dan Ukuran daerah.
Mengembalikan warna material tanah saat ini untuk material tanah tertentu.
Menerapkan beberapa bagian dari tanah ke objek Tanah. Catatan: TerrainRegion data tidak diklon antara server dan klien.
Mengembalikan data voxel tanah di format tabel berdasarkan nama saluran.
Mengembalikan wilayah tertentu dari tanah halus dalam format tabel.
- ReplaceMaterial(region : Region3,resolution : number,sourceMaterial : Enum.Material,targetMaterial : Enum.Material):void
Mengganti tanah dalam material tertentu di wilayah dengan material lain.
Tetapkan warna material tanah saat ini untuk material tanah tertentu.
Mengembalikan lokasi sel grid yang berisi posisi posisi .
Mengembalikan lokasi sel grid yang berisi posisi titik, menyukai sel grid kosong saat posisi berada di ujung grid.
Mengembalikan lokasi sel grid yang berisi posisi titik, menyukai sel grid non- Kosong saat posisi berada di sudut grid.
Mengatur wilayah tanah menggunakan definisi data saluran voxel.
Tetapkan wilayah tertentu dari tanah halus menggunakan format tabel.
Terapkan dorongan sudut ke kumpulan.
Terapkan dorongan ke kumpulan pada kumpulan pemasangan di pemasangan's center of mass .
Terapkan dorongan ke kumpulan pada posisi yang ditentukan.
Mengembalikan apakah bagian dapat bertabrakan satu sama lain.
Memeriksa apakah Anda dapat menetapkan kepemilikan jaringan bagian.
Mengembalikan tabel bagian yang terhubung ke objek dengan jenis tali keras apa pun.
Kembalikan semua Joints atau Constraint yang terhubung ke Bagian ini.
Mengembalikan nilai dari properti Mass .
Mengembalikan pemain saat ini yang merupakan pemilik jaringan bagian ini, atau nol dalam kasus server.
Mengembalikan benar jika mesin game secara otomatis memutuskan pemilik jaringan untuk bagian ini.
Mengembalikan bagian dasar dari pengumpulan bagian.
Mengembalikan tabel semua BasePart.CanCollide bagian yang benar yang berintervensi dengan bagian ini.
Mengembalikan kecepatan lini bagian yang diberikan relatif terhadap posisi ini.
Mengembalikan benar jika objek terhubung ke bagian yang akan menahan objek tersebut (eg bagian Anchored), jika tidak mengembalikan salah.
Mengubah ukuran objek hanya seperti menggunakan alat resize Studio.
Tetapkan pemain yang diberikan sebagai pemilik jaringan untuk ini dan semua bagian yang terhubung.
Memungkinkan mesin game secara dinamis memutuskan siapa yang akan menangani fisika bagian (salah satu klien atau server).
- IntersectAsync(parts : Instances,collisionfidelity : Enum.CollisionFidelity,renderFidelity : Enum.RenderFidelity):Instance
Menciptakan IntersectOperation baru dari geometri yang bertumpang-tindih dari bagian dan bagian lain dalam array yang diberikan.
- SubtractAsync(parts : Instances,collisionfidelity : Enum.CollisionFidelity,renderFidelity : Enum.RenderFidelity):Instance
Menciptakan UnionOperation baru dari bagian, minus geometri yang ditempati oleh bagian dalam array yang diberikan.
- UnionAsync(parts : Instances,collisionfidelity : Enum.CollisionFidelity,renderFidelity : Enum.RenderFidelity):Instance
Menciptakan UnionOperation baru dari bagian, plus geometri yang ditempati oleh bagian dalam array yang diberikan.
Mendapatkan pivot dari Class.PVInstance .
Mengubah PVInstance bersama dengan semua anaknya PVInstances sehingga pivot sekarang berada di CFrame yang ditentukan.
Acara
Acara diwarisi dari BasePartBerdapi saat bagian berhenti menyentuh bagian lain sebagai hasil dari gerakan fisik.
Berdapi saat bagian menyentuh bagian lain sebagai hasil dari gerakan fisik.
Properti
Decoration
Saat ini mengaktifkan atau menonaktifkan rumput animasi di material tanah Rumput , meskipun modifikasi masa depan dari properti ini dapat mengontrol fitur dekoratif tambahan.
GrassLength
Mengukur panjang rumput animasi di material tanah Rumput , mengasumsikan bahwa Decoration diaktifkan.Nilai yang valid adalah antara 0,1 dan 1.
MaterialColors
WarnaMaterial mewakili editor untuk fitur Warna Material, dan tidak dapat diubah oleh skrip .
Untuk mendapatkan warna material, gunakan: Terrain:GetMaterialColor()
Untuk menetapkan warna material, gunakan: Terrain:SetMaterialColor()
WaterWaveSize
Tetapkan ketinggian maksimum dari gelombang air lapangan dalam studs. Ini saat ini dibatasi antara 0 dan 1.
WaterWaveSpeed
Mengatur berapa banyak kali gelombang air lapangan akan naik dan turun per menit. Ini saat ini dibatasi antara 0 dan 100.
Metode
CellCenterToWorld
Mengembalikan posisi dunia dari pusat sel tanah (x, y, z).
Parameter
Memberikan nilai
CellCornerToWorld
Mengembalikan posisi sudut kiri bawah dari sel konsentrasi (x, y, z).
Parameter
Memberikan nilai
Clear
Bersihkan tanah.
Memberikan nilai
CopyRegion
Menyimpan sepotong tanah ke dalam objek TerrainRegion sehingga dapat diakses kembali nanti. Catatan: TerrainRegion data tidak diklon antara server dan klien.
Parameter
Memberikan nilai
Contoh Kode
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 halus di ruang tertentu.
Parameter
Memberikan nilai
Contoh Kode
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 halus dengan lokasi, rotasi, ukuran, dan bahan yang diberikan.
Parameter
CFrame (posisi dan orientasi) dari blok tanah.
Ukuran dalam studs dari blok persegi - kedua tinggi dan lebar.
The Enum.Material dari blok tanah.
Memberikan nilai
FillCylinder
Mengisi silinder tanah halus di ruang tertentu. Ruang di definisikan menggunakan CFrame, ketinggian, dan radius.
Penggunaan
workspace.Terrain:FillCylinder(CFrame.new(0, 50, 0), 5, 30, Enum.Material.Asphalt)
Parameter
CFrame (posisi dan orientasi) dari silinder tanah.
Tinggi dalam studs dari silinder tanah.
Radius dalam studs dari silinder tanah.
Material dari silinder tanah.
Memberikan nilai
FillWedge
FillWedge() mengisi volume berbentuk segi tiga dari Terrain dengan Enum.Material yang diberikan dan area 0> Datatype.CFrame0> dan ukuran. Orientasi wedge sama dengan FillWedge()3> yang setara.
Parameter
Posisi dan orientasi dari sudut untuk diisi.
Ukuran sudut kecil untuk diisi.
Bahan yang akan digunakan untuk memenuhi sudut.
Memberikan nilai
GetMaterialColor
Mengembalikan warna material tanah saat ini untuk material tanah yang ditentukan.
Parameter
Memberikan nilai
PasteRegion
Menerapkan beberapa bagian dari tanah ke objek Tanah. Catatan: TerrainRegion data tidak diklon antara server dan klien.
Parameter
Memberikan nilai
Contoh Kode
--[[
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
Mengembalikan data voxel tanah di format tabel berdasarkan nama saluran.
Parameter
Target wilayah untuk dibaca. Harus diberikan alineasi dengan grid voxel. Akan menghasilkan kesalahan jika wilayah terlalu besar; batas saat ini adalah 4194304 voxel³.
Resolusi Voxel. Harus 4.
Array of channel IDs (string) yang perlu diakses dari data voxel. Setiap channel ID mewakili jenis data yang tersimpan di voxel. ID sah saat ini adalah {"SolidMaterial", "SolidOccupancy", "LiquidOccupancy"} .
Memberikan nilai
Mengembalikan data voxel sebagai definisi berdasarkan input channelIds. Key mewakili setiap ID saluran dengan nilai masing-masing sebagai matriks 3D.
- SolidMaterial — Material Enum.Material voxel. Catat bahwa Water tidak lagi didukung; sebaliknya, voxel yang berisi air akan memiliki nilai 0> LiquidOccupancy0> .
- SolidOccupancy — Sisi occupasi material voxel seperti yang ditentukan dalam channelSolidMaterial. Ini adalah nilai antara 0 (kosong) dan 1 (penuh).
- LiquidOccupancy — Menentukan kepemilikan material Water dalam voxel sebagai nilai antara 0 (tidak ada air) dan 1 (penuh dengan air). Jika SolidOccupancy adalah 1 dan 0> SolidMaterial0> bu
Daftar kata juga berisi kunci Size dengan nilai mewakili ukuran 3D 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
Mengembalikan wilayah tertentu dari tanah halus dalam format tabel.
Parameter
Target wilayah untuk dibaca. Harus diberikan alineasi dengan grid voxel. Akan menghasilkan kesalahan jika wilayah terlalu besar. Batasnya saat ini adalah 4194304 voxel^3.
Resolusi Voxel. Harus 4.
Memberikan nilai
Mengembalikan data voxel asli sebagai dua matriks 3D.
- materials - 3D array dari Enum.Material dari area target. Juga berisi lapangan Ukuran, sama dengan dimensi dari matriks yang terbuka.
- occupancies - 3D array nilai ketersediaan dari area target. Juga mengandung lapangan Ukuran, sama dengan ukuran array yang terbuka.
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
ReplaceMaterial mengganti tanah dari beberapa Enum.Material dalam satu Region3 dengan material lain. Pada dasarnya, ini adalah operasi temukan dan ganti pada bahan Terrain.
Konstruksi
Ketika menyebut metode ini, parameter resolution harus persis 4. Selain itu, Region3 harus diatur agar sesuai dengan matriks g Material Tanah, yaitu komponen dari titik minimum dan maksimum Region3 harus dibagi 4. Gunakan Region3:ExpandToGrid() untuk membuat wilayah kompatibel dengan fungsi ini.
Parameter
Wilayah di mana operasi pengganti akan terjadi.
Resolusi di mana operasi pengganti akan tempat; pada saat ini ini harus persis 4.
Bahan lama yang akan diganti.
Bahan baru.
Memberikan nilai
Contoh Kode
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 tanah saat ini untuk material tanah tertentu. Material tanah akan menggeser warna dasarnya menuju warna tertentu.
Parameter
Memberikan nilai
WorldToCell
Mengembalikan lokasi sel grid yang berisi posisi posisi .
Parameter
Memberikan nilai
WorldToCellPreferEmpty
Mengembalikan lokasi sel grid yang berisi posisi titik, menyukai sel grid kosong saat posisi berada di ujung grid.
Parameter
Memberikan nilai
WorldToCellPreferSolid
Mengembalikan lokasi sel grid yang berisi posisi titik, menyukai sel grid non- Kosong saat posisi berada di sudut grid.
Parameter
Memberikan nilai
WriteVoxelChannels
Mengatur wilayah tanah menggunakan definisi data saluran voxel.
Parameter
Target wilayah untuk ditulis. Harus diatur dengan grid voxel. Akan menghasilkan kesalahan jika wilayah terlalu besar; batas saat ini adalah 4194304 voxel³.
Resolusi Voxel. Harus 4.
Daftar data voxel yang mirip dengan nilai kembali dari ReadVoxelChannels() . Tombol mewakili setiap ID saluran dengan nilai masing-masing sebagai matriks 3D data. Dictionary dapat mendukung satu atau lebih entri saluran.
- SolidMaterial — Materi Enum.Material voxel. Catat bahwa Water tidak lagi didukung; sebaliknya, voxel yang hanya berisi air harus di입력 sebagai 0> SolidMaterial = Enum.Material.Air, LiquidOcc
- SolidOccupancy — Keramaian material voxel seperti yang ditentukan dalam saluran SolidMaterial. Ini seharusnya menjadi nilai antara 0 (kosong) dan 1 (penuh).
- LiquidOccupancy — Menentukan kepemilikan material Water dalam voxel sebagai nilai antara 0 (tidak ada air) dan 1 (penuh dengan air). Jika SolidOccupancy adalah 1 dan 0> SolidMaterial0> bu
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
Tetapkan wilayah tertentu dari tanah halus menggunakan format tabel.
Parameter
Target wilayah untuk ditulis. Harus diberikan alineasi dengan grid voxel. Akan menghasilkan kesalahan jika wilayah terlalu besar.
Resolusi Voxel. Harus 4.
3D array of Enum.Material. Dimensi harus persis dengan ukuran wilayah target dalam voxel.
3D array of voxel occupations (number between 0 and 1). Dimensi harus persis dengan ukuran wilayah target dalam voxels.
Memberikan nilai
Contoh Kode
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))