Terrain
*Bu içerik, yapay zekâ (beta) kullanılarak çevrildi ve hatalar içerebilir. Sayfayı İngilizce görüntülemek için buraya tıkla.
Arazi, az veya hiç gecikme ile dinamik olarak dönüşebilen çevreler oluşturmanıza izin verir.Şu anda her hücrede 0 ile 1 arasında bir sayı bulunduran 4×4×4 hücre tablosuna dayanmaktadır, bu da geometrinin hücreyi ve hücenin malzemesini ne kadar işgal etmesi gerektiğini temsil eder.Doluluk, hücrenin çevreleyen hücrelerle nasıl birleşeceğini ve sonucunun hiçbir ızgara sınırı olmadığı ilüzyonu olacağını belirler.
Daha fazla bilgi için, Arazi bakın.
Özet
Özellikler
Arazi dekorasyonunu etkinleştirir veya devre dışı bırakır.
Animasyonlu çimin uzunluğunu belirler.
MaterialColors, Malzeme Renk özellikiçin editörü temsil eder ve kodlar tarafından düzenlenemez .
Bir malzemenin rengini almak için kullanın: Terrain:GetMaterialColor() Bir malzemenin rengini ayarlamak için kullanın: Terrain:SetMaterialColor()
En büyük düzenlenebilir bölgenin sınırlarını görüntüler.
Arazi suyunun tonu.
Arazi su yansımalarının ne kadar opak olduğunu kontrol eder.
Arazi suyunun transparanlığı.
Arazi su dalgalarının maksimum yüksekliğini studlarda ayarlar.
Arazi su dalgalarının dakika başına kaç kez yukarı ve aşağı hareket edeceğini ayarlar.
Bir parçanın fiziğe göre hareketsiz olup olmadığını belirler.
Parçanın montajındaki açısal hız.
Dünya uzayındaki parçanın montajının kütle merkezi.
Parçanın montajının lineer hızı.
Parçanın montajının toplam masesi.
Montajın kök kısmına bir referans.
Bir parçanın arka yüzü için yüzey türünü belirler (+Z yönü).
Bir parçanın alt yüzü için yüzey türünü belirler (-Y yönü).
Bir parçanın rengini belirler.
Dünyadaki BasePart konumunu ve yönünü belirler.
Bir parçanın diğer parçalarla çarpışıp çarpışmayacağını belirler.
Parçanın uzay sorgu operasyonları sırasında dikkate alınıp alınmadığını belirler.
Touched ve TouchEnded olaylarının parçada ateşlenip ateşlenmediğini belirler.
Bir parçanın gölge atıp atmadığını belirler.
Bir parçanın kütle merkezinin bulunduğu dünya konumunu tanımlar.
Bir parçanın çarpışma grupadını tanımlar.
Bir parçanın rengini belirler.
Parçanın mevcut fiziksel özelliklerini gösterir.
Bir parçanın birkaç fiziksel özelliğini belirler.
Parçalar ve montajlar üzerinde hava dinamik güçlerini etkinleştirmek veya devre dışı bırakmak için kullanılır.
Fizik motoru tarafından ele alınan BasePart 'nin gerçek fiziksel boyutu.
Bir parçanın ön yüzü için yüzey türünü belirler (-Z yönü).
Bir parçanın sol yüzünün yüzey türünü belirler (-X yönü).
Yerel müşteriye yalnızca görünen bir çarpanı BasePart.Transparency belirler, ki bu sadece yerel müşteridir.
Bir parçanın Studio'da seçilebilir olup olmadığını belirler.
Parçanın kütlesini, yoğunluğunun ve hacminin ürününü tanımlar.
Parçanın sert vücuttoplam kütlesine veya süspansiyonuna katkıda bulunup bulunmadığını belirler.
Bir parçanın dokusunu ve varsayılan fiziksel özelliklerini belirler.
MaterialVariant adı.
Dünyadaki parçanın dönüşünü tanımlar.
Parçanın merkezinin CFrame 'sinden ayrılma ofsetini belirtir.
Parçanın dünyadaki konumunu tanımlar.
Son kaydedilen fizik güncellemesinden beri geçen süre.
Bir parçanın gökyüzünü ne kadar yansıttığını belirler.
Yeniden boyutlandırma yöntemi tarafından kabul edilen en küçük boyut değişikliğini tanımlar.
Bir parçanın yeniden boyutlandırılabileceği yüzleri tanımlar.
Bir parçanın Sağ yüzünün yüzey türünü belirler (+X yönü).
Bir montajın kök parçasını belirlemenin ana kuralı.
Üç eksen için parçanın derecelerinde dönmesi.
Bir parçanın boyutlarını belirler (uzunluk, genişlik, yükseklik).
Bir parçanın üst yüzünün türünü belirler (+Y yönü).
Bir parçanın ne kadar görülebildiğini belirler (parça saydamlığının tersi).
Yöntemler
Arazi hücresinin merkezinin dünya konumunu döndürür (x, y, z).
Izgara hücresinin sol alt-ön kenarının konumunu döndürür (x, y, z).
Araziyi temizler.
Bir bölümün arazisini TerrainRegion nesneye saklar, böylece daha sonra yüklenebilir.Not: TerrainRegion verileri sunucu ve istemci arasında yinelenmez.
Arazide boş olmayan hücre sayısını döndürür.
Belirli bir alanda pürüzsüz bir yer topunu doldurur.
Düz bir arazi bloğunu belirli bir konum, dönüş, boyut ve malzeme ile doldurur.
Belirli bir alanda pürüzsüz bir zemin silindirini doldurur.
Bir Region3 alanını pürüzsüz bir araziyle doldurur.
Bir arazi parçasının kenar şeklindeki bir hacmini verilen Enum.Material ve bölgenin CFrame ve Boyutu ile doldurur.
Belirtilen arazi malzemesi için mevcut arazi malzeme rengini döndürür.
Bir bölge parçasını Arazi nesnesine uygular. Not: TerrainRegion verileri sunucu ve istemci arasında yeniden yapılmaz.
Kanal isimlerine dayanarak tablo biçiminde bir arazi vokel verisinin bölümünü döndürür.
Tablo biçiminde belirli bir düz arazi bölgesini geri verir.
- ReplaceMaterial(region : Region3,resolution : number,sourceMaterial : Enum.Material,targetMaterial : Enum.Material):()
Bir bölgedeki bir malzemenin arazisini başka bir malzeme ile değiştirir.
Belirtilen arazi malzemesi için mevcut arazi malzemesi rengini ayarlar.
Nokta konumunu içeren ızgara hücre konumunu döndürür .
Konum konumunu içeren ızgara hücre konumunu döndürür ve konum bir ızgara kenarında olduğunda boş ızgara hücrelerini tercih eder.
Konum konumunu içeren ızgara hücre konumunu döndürür ve konum bir ızgara kenarında olduğunda boş olmayan ızgara hücrelerini tercih eder.
Bir voksel kanal veri sözlüğü kullanarak bir bölgeyi arazi olarak ayarlar.
Tablo biçimi kullanarak belirli bir düz arazi bölgesini ayarlar.
Montaja bir açısal hız uygulayın.
Montajın center of mass 'sinde montaja bir tepki uygulayın.
Belirtilen pozisyonda montaja bir tepki uygulayın.
Parçaların birbiriyle çarpıp çarpıp olmadığını döndürür.
Bir parçanın ağ sahipliğini ayarlayabileceğinizi kontrol eder.
Objeye herhangi bir sert bağlantı ile bağlı bir parça tablosu döndürür.
Bu Parçaya bağlı olan tüm Eklemleri veya Kısıtları geri döndür.
Mass özelliğinin değerini döndürür.
Bu parçanın ağ sahibi olan mevcut oyuncuyu veya nil sunucu durumunda döndürür.
Oyun motoru bu parça için ağ sahibini otomatik olarak karar verirse gerçek döndürür.
Bir parça grubunun temel parçasını döndürür.
Bu parçayla kesişen tüm BasePart.CanCollide gerçek parçaların bir tablosunu döndürür.
Bu parçanın montajının verilen konuma göre lineer hızını döndürür.
Nesne bir yerde tutacak bir parçaya bağlıysa gerçek döndürür (örneğin bir Anchored parçası), aksi takdirde yalan döndürür.
Bir nesnenin boyutunu, Studio yeniden boyutlandırma aracını kullanarak gibi değiştirir.
Verdiğiniz oyuncuyu bu ve tüm bağlı parçalar için ağ sahibi olarak ayarlar.
Oyun motorunun dinamik olarak kimin parçanın fiziğini ele alacağına karar vermesine izin verin (müşterilerden biri veya sunucu).
- IntersectAsync(parts : Instances,collisionfidelity : Enum.CollisionFidelity,renderFidelity : Enum.RenderFidelity):Instance
Parçanın ve verilen dizedeki diğer parçaların örtüşen geometrisinden yeni bir IntersectOperation oluşturur.
- SubtractAsync(parts : Instances,collisionfidelity : Enum.CollisionFidelity,renderFidelity : Enum.RenderFidelity):Instance
Parçadan yeni bir UnionOperation oluşturur, verilen matristeki parçaların geometrisinden eksilerek.
- UnionAsync(parts : Instances,collisionfidelity : Enum.CollisionFidelity,renderFidelity : Enum.RenderFidelity):Instance
Parçadan yeni bir UnionOperation ve verilen matristeki parçalar tarafından işgal edilen geometri oluşturur.
Bir PVInstance 'nin merkezini alır.
Dönüştürür PVInstance tüm altındaki PVInstances ile birlikte pivotun şimdi belirtilen CFrame 'de yer aldığını, böylece dönüşüm aşağıdaki gibi gerçekleşir:
Etkinlikler
Şuradan alınan Etkinlikler: BasePartBir parça, fiziksel hareketin sonucu olarak başka bir parçaya dokunmayı bıraktığında ateş eder.
Bir parça fiziksel hareketin sonucu olarak başka bir parçaya dokunduğunda ateş eder.
Özellikler
Decoration
Şu anda Çim arazisi materyali üzerinde animasyonlu çim etkinleştirir veya devre dışı bırakır, ancak gelecekte bu özelliğin ek dekoratif özelliklerini kontrol edebilir.
GrassLength
Çim arazisi materyali üzerinde animasyonlu çimin uzunluğunu belirtir ve Decoration etkinleştirilmiş olduğunu varsayar. Geçerli değerler 0.1 ile 1 arasındadır.
MaterialColors
MaterialColors, Malzeme Renk özellikiçin editörü temsil eder ve kodlar tarafından düzenlenemez .
Bir malzemenin rengini almak için kullanın: Terrain:GetMaterialColor()
Bir malzemenin rengini ayarlamak için kullanın: Terrain:SetMaterialColor()
WaterWaveSize
Arazi su dalgalarının maksimum yüksekliğini milimetrelerle ayarlar. Bu şu anda 0 ile 1 arasında sınırlıdır.
WaterWaveSpeed
Arazi su dalgalarının dakika başına kaç kez yukarı ve aşağı hareket edeceğini ayarlar. Bu şu anda 0 ile 100 arasında sınırlıdır.
Yöntemler
CellCenterToWorld
Arazi hücresinin merkezinin dünya konumunu döndürür (x, y, z).
Parametreler
Dönüşler
CellCornerToWorld
Izgara hücresinin sol alt-ön kenarının konumunu döndürür (x, y, z).
Parametreler
Dönüşler
Clear
Araziyi temizler.
Dönüşler
CopyRegion
Bir bölümün arazisini TerrainRegion nesneye saklar, böylece daha sonra yüklenebilir.Not: TerrainRegion verileri sunucu ve istemci arasında yinelenmez.
Parametreler
Dönüşler
Kod Örnekleri
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
Belirli bir alanda pürüzsüz bir yer topunu doldurur.
Parametreler
Arazi topunun merkezinin konumu.
Arazi topunun çubuklarının yarıçapı.
Arazi topunun Enum.Material 'sinin.
Dönüşler
Kod Örnekleri
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
Düz bir arazi bloğunu belirli bir konum, dönüş, boyut ve malzeme ile doldurur.
Parametreler
Arazi bloğunun konumu ve yönü.
Kare blokun çivilerinin boyutu - hem yükseklik hem de genişlik.
Arazi bloğunun Enum.Material 'si.
Dönüşler
FillCylinder
Belirli bir alanda pürüzsüz bir zemin silindirini doldurur. Alan, bir CFrame, yükseklik ve yarıçap kullanılarak tanımlanır.
local Workspace = game:GetService("Workspace")Workspace.Terrain:FillCylinder(CFrame.new(0, 50, 0), 5, 30, Enum.Material.Asphalt)
Parametreler
Arazi silindrinin konumu ve yönü.
Arazi silindirinin çivilerinin yüksekliği.
Arazi silindirinin kenarlarındaki yarıçap.
Arazi silindirinin Enum.Material 'si.
Dönüşler
FillRegion
Bir Region3 alanını pürüzsüz bir araziyle doldurur.
Parametreler
Dönüşler
FillWedge
FillWedge() bir kama şeklinde bir hacim doldurur Terrain verilen Enum.Material ve bölgenin CFrame ve boyutu.Köşenin yönü, eşdeğer bir WedgePart ile aynıdır.
Parametreler
Doldurulacak kenarın konumu ve yönü.
Doldurulacak kenarın boyutu.
Kama doldurulacak malzeme.
Dönüşler
GetMaterialColor
Belirtilen arazi malzemesi için mevcut arazi malzeme rengini döndürür.
Parametreler
Dönüşler
PasteRegion
Bir bölge parçasını Arazi nesnesine uygular. Not: TerrainRegion verileri sunucu ve istemci arasında yeniden yapılmaz.
Parametreler
Dönüşler
Kod Örnekleri
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
Kanal isimlerine dayanarak tablo biçiminde bir arazi vokel verisinin bölümünü döndürür.
Parametreler
Okuyacak hedef bölge. Voksel ızgarasına uyumlu olmalıdır. Bölge çok büyükse bir hata atacak; sınır şu anda 4194304 voksel³.
Voksel çözünürlüğü. 4 olmalıdır.
Voksel verilerinden erişilmesi gereken kanal kimlikleri (ip) dizisi.Her kanal ID'si, vokselde saklanan bir tür veriyi temsil eder.Mevcut desteklenen kimlikler {"SolidMaterial", "SolidOccupancy", "LiquidOccupancy"} dir.
Dönüşler
Voksel verilerini channelIds girişine dayalı bir sözlük olarak döndürür. Anahtarlar, her bir kanal ID'sini 3B verilerin bir dizi olarak değerleriyle temsil eder.
- SolidMaterial — Vokelinin Enum.Material malzemesi.Not that Water artık desteklenmiyor; bunun yerine, su içeren bir vokselin değeri LiquidOccupancy olacaktır.
- — Vokselin malzemesinin belirtilen kanaldaki doluluk oranı. Bu, 0 (boş) ve 1 (dolu) arasında bir değerdir.
- LiquidOccupancy — Vokseldeki Water malzemenin doluluk değerini 0 (su yok) ve 1 (su dolu) arasında bir değer olarak belirtir.Eğer 1 ve 0 değilse, bu 0 olacaktır.
Sözlük ayrıca her kanal verisinin 3B dizi boyutunu temsil eden bir değerle Size anahtar içerir.
Kod Örnekleri
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
Tablo biçiminde belirli bir düz arazi bölgesini geri verir.
Parametreler
Okuyacak hedef bölge. Voksel ızgarasına uyumlu olmalıdır. Bölge çok genişse bir hata atacaktır. Sınır şu anda 4194304 voksel^3'tür.
Voksel çözünürlüğü. 4 olmalıdır.
Dönüşler
Ham voksel verilerini iki 3B dize olarak döndürür.
- materials - Hedef bölgeden 3B Enum.Material düzgün bir dizi. Ayrıca bir Boyut alanı içerir, alt dizilere eşit olan boyutlara eşit.
- occupancies - Hedef bölgeden 3B doluluk değerleri düzeninde bir dizi. Ayrıca bir Boyut alanı içerir, alt dizilimlerin boyutlarına eşit.
Kod Örnekleri
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, belirli bir içindeki araziyi başka bir malzeme ile değiştirir.Temel olarak, Terrain malzemelerinde bul ve değiştirme işlemidir.
Sınırlar
Bu yöntemi çağırırken, resolution çözümleyici parametresi kesinlikle 4 olmalıdır.Ayrıca, Bölge3, arazi malzeme ızgarasına uygun olmalıdır, yaniBölge3'ün minimum ve maksimum noktalarının bölünebilir olması gerekir 4.Bir bölgenin bu işlevle uyumlu olmasını sağlamak için Region3:ExpandToGrid() kullanın.
Parametreler
Değiştirme işlemi meydana gelbölge.
Değiştirme işlemi dünyaçözünürlük; şu anda bunun kesinlikle 4 olması gerekiyor.
Değiştirilecek eski materyal.
Yeni materyal.
Dönüşler
Kod Örnekleri
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
Belirtilen arazi malzemesi için mevcut arazi malzemesi rengini değiştirir. Arazi malzemesi temel rengini belirtilen renge doğru kaydıracaktır.
Parametreler
Dönüşler
WorldToCell
Nokta konumunu içeren ızgara hücre konumunu döndürür .
Parametreler
Dönüşler
WorldToCellPreferEmpty
Konum konumunu içeren ızgara hücre konumunu döndürür ve konum bir ızgara kenarında olduğunda boş ızgara hücrelerini tercih eder.
Parametreler
Dönüşler
WorldToCellPreferSolid
Konum konumunu içeren ızgara hücre konumunu döndürür ve konum bir ızgara kenarında olduğunda boş olmayan ızgara hücrelerini tercih eder.
Parametreler
Dönüşler
WriteVoxelChannels
Bir voksel kanal veri sözlüğü kullanarak bir bölgeyi arazi olarak ayarlar.
Parametreler
Yazmak için hedef bölge. Voksel ızgarasına uyumlu olmalıdır. Bölge çok genişse bir hata atacak; sınır şu anda 4194304 voksel³.
Voksel çözünürlüğü. 4 olmalıdır.
voxel verilerinin döndürülen değere benzer sözlük ReadVoxelChannels() .Anahtarlar, her bir kanal kimliğini ilgili değeri ile 3B veri dizesi olarak temsil eder.Sözlük tek veya çok kanallı girişleri destekleyebilir.
- SolidMaterial — Vokelinin Enum.Material malzemesi.Not that Water artık desteklenmiyor; bunun yerine, sadece su içeren bir voksel SolidMaterial = Enum.Material.Air, LiquidOccupancy = x olarak girilmelidir, burada x 0 (özel) ve 1 (katılımcı) arasında bir sayıdır.
- — Vokselin malzemesinin belirtilen kanaldaki doluluk oranı. Bu, 0 (boş) ve 1 (dolu) arasında bir değer olmalıdır.
- LiquidOccupancy — Vokseldeki Water malzemenin doluluk değerini 0 (su yok) ve 1 (su dolu) arasında bir değer olarak belirtir.Eğer 1 ve 0 değilse, bu 0 olacaktır.
Dönüşler
Kod Örnekleri
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
Tablo biçimi kullanarak belirli bir düz arazi bölgesini ayarlar.
Parametreler
Yazmak için hedef bölge. Voksel ızgarasına uyumlu olmalıdır. Bölge çok genişse bir hata atacaktır.
Voksel çözünürlüğü. 4 olmalıdır.
Enum.Material'in 3B düzeni boyutları, vokseldeki hedef bölgenin boyutuna kesinlikle uymalıdır.
3B voksel işgal sayısı (0 ile 1 arasındaki sayı). Boyutlar, vokellerdeki hedef bölgenin boyutuna kesinlikle uymalıdır.
Dönüşler
Kod Örnekleri
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))