Terrain
*Nội dung này được dịch bằng AI (Beta) và có thể có lỗi. Để xem trang này bằng tiếng Anh, hãy nhấp vào đây.
Địa hình cho phép bạn tạo các môi trường có thể biến đổi năng động với ít hoặc không có độ trễ.Hiện tại nó dựa trên một lưới 4×4×4 của các tế bào, mỗi tế bào có một số từ 0 đến 1 đại diện cho việc geometry chiếm bao nhiêu tế bào, và chất liệu của tế bào.Tỷ lệ chiếm sử dụng xác định cách tế bào sẽ biến dạng cùng với các tế bào xung quanh, và kết quả là sự ảo giác không có hạn chế lưới.
Để biết thêm thông tin, xem Địa hình.
Tóm Tắt
Thuộc Tính
Bật hoặc tắt trang trí địa hình.
Xác định chiều dài của cỏ hoạt hình.
MaterialColors đại diện cho trình biên tập cho tính năng Màu vật liệu, và không thể được chỉnh sửa bởi các tập lệnh .
Để lấy màu của một vật liệu, sử dụng: Terrain:GetMaterialColor() Để đặt màu của một vật liệu, sử dụng: Terrain:SetMaterialColor()
Hiển thị ranh giới của khu vực có thể chỉnh sửa lớn nhất có thể.
Màu nhuộm của nước địa hình.
Kiểm soát mức độ mờ nước phản chiếu của địa hình.
Sự minh bạch của nước địa hình.
Đặt độ cao tối đa của làn sóng nước địa hình bằng đinh tán.
Đặt số lần mà làn sóng nước địa hình sẽ di chuyển lên và xuống mỗi phút.
Xác định xem một phần có bất di chuyển bởi vật lý hay không.
Tốc độ góc của lắp ráp phần.
Trung tâm của khối lượng của lắp ráp phần trong không gian thế giới.
Tốc độ song song của lắp ráp phần.
Tổng khối lượng lắp ráp của phần.
Một tham chiếu đến phần gốc của lắp ráp.
Xác định loại bề mặt cho mặt sau của một phần (+hướng Z).
Xác định loại bề mặt cho mặt dưới của một phần (-Y hướng).
Xác định màu của một phần.
Xác định vị trí và hướng của BasePart trong thế giới.
Xác định xem một phần có thể va chạm với các phần khác hay không.
Xác định xem phần có được xem xét trong các hoạt động truy vấn không gian không.
Xác định xem sự kiện Touched và TouchEnded có bắt lửa trên phần hay không.
Xác định xem một phần có phải phát ra bóng hay không.
Mô tả vị trí thế giới mà trung tâm khối lượng của một phần nằm.
Mô tả tên của nhóm va chạm của một phần.
Xác định màu của một phần.
Chỉ ra các tính chất vật lý hiện tại của phần.
Xác định một số tính chất vật lý của một phần.
Dùng để bật hoặc tắt lực khí động trên các bộ phận và lắp ráp.
Kích thước vật lý thực sự của BasePart theo quan điểm của động cơ vật lý.
Xác định loại bề mặt cho mặt trước của một phần (-Z hướng).
Xác định loại bề mặt cho mặt trái của một phần (-X hướng).
Xác định một hệ số cho BasePart.Transparency mà chỉ có thể nhìn thấy bởi khách hàng địa phương.
Xác định xem một phần có thể được chọn trong Studio hay không.
Mô tả khối lượng của phần, sản phẩm của độ dày và khối lượng của nó.
Xác định xem phần có đóng góp vào tổng khối lượng hoặc lượng lưu lưu của cơ thâncứng hay không.
Xác định kết cấu và tính chất vật lý mặc định của một phần.
Tên của MaterialVariant .
Mô tả việc xoay của phần trong thế giới.
Xác định offset của trục của phần từ CFrame của nó.
Mô tả vị trí của phần trong thế giới.
Thời gian kể từ lần cập nhật vật lý cuối cùng.
Xác định bao nhiêu một phần phản ánh hộp trời.
Mô tả thay đổi nhỏ nhất về kích thước có thể cho phép bởi phương pháp Thay đổi kích thước.
Mô tả các khuôn mặt mà một phần có thể được thay đổi kích cỡ.
Xác định loại bề mặt cho mặt phải của một phần (+X hướng).
Quy tắc chính trong việc xác định phần gốc của một tập hợp.
Sự xoay của phần theo độ cho ba trục.
Xác định kích thước của một phần (chiều dài, chiều rộng, chiều cao).
Xác định loại bề mặt cho mặt trên của một phần (+ hướng Y).
Xác định bao nhiêu một phần có thể được nhìn thấy thông qua (ngược lại với độ mờ phần).
Phương Pháp
Trả vị trí thế giới của trung tâm của tế bào địa hình (x, y, z).
Trả vị trí của góc trái thấp hơn về phía trước của tế bào lưới (x, y, z).
Xóa địa hình.
Lưu một khối địa hình thành một đối tượng TerrainRegion để có thể tải lại sau.Lưu ý: TerrainRegion dữ liệu không sao lưu giữa máy chủ và khách hàng.
Trả về số lượng tế bào không trống trong Địa hình.
Lấp đầy một quả bóng địa hình mịn trong không gian đã cho.
Lấp đầy một khối địa hình mịn với vị trí, tốc độ xoay, kích thước và chất liệu đã cho.
Lấp đầy một xi-lanh của địa hình mịn trong một không gian nhất định.
Lấp đầy một không gian Region3 với địa hình mịn.
Lấp đầy một khối lượng hình khối của Địa hình với Enum.Material và CFrame và Kích thước của khu vực.
Trả về màu vật liệu địa hình hiện tại cho vật liệu địa hình được chỉ định.
Áp dụng một khối địa hình cho đối tượng Địa hình. Lưu ý: TerrainRegion dữ liệu không sao lưu giữa máy chủ và khách hàng.
Trả về một khu vực dữ liệu voxel địa hình theo dạng bảng dựa trên tên kênh.
Trả về một khu vực nhất định của địa hình mịn trong định dạng bảng.
- ReplaceMaterial(region : Region3,resolution : number,sourceMaterial : Enum.Material,targetMaterial : Enum.Material):()
Thay thế địa hình của một vật liệu trong một khu vực bằng vật liệu khác.
Đặt màu vật liệu địa hình hiện tại cho vật liệu địa hình được chỉ định.
Trả vị trí của các ô lưới chứa điểm vị trí .
Trả vị trí của ô lưới chứa vị trí điểm, ưu tiên các ô lưới trống khi vị trí nằm trên cạnh lưới.
Trả vị trí của ô lưới chứa vị trí điểm, ưu tiên các ô lưới không trống khi vị trí nằm trên cạnh lưới.
Đặt một khu vực địa hình bằng cách sử dụng một từ điển của dữ liệu kênh voxel.
Đặt một khu vực nhất định của địa hình bằng cách sử dụng định dạng bảng.
Áp dụng một động lực góc cho lắp ráp.
Áp dụng một động lực cho lắp ráp tại lắp ráp center of mass .
Áp dụng một xung lực cho lắp ráp ở vị trí được chỉ định.
Trả về xem các bộ phận có thể va chạm với nhau hay không.
Kiểm tra xem bạn có thể đặt quyền sở hữu mạng của một phần hay không.
Trả về một bảng các bộ phận kết nối với đối tượng bằng bất kỳ loại khớp cứng nào.
Trả lại tất cả Các khớp hoặc Giới hạn được kết nối với Phần này.
Trả giá trị của thuộc tính Mass .
Trả về người chơi hiện tại là chủ sở hữu mạng của phần này, hoặc nil trong trường hợp của máy chủ.
Trả về true nếu động cơ trò chơi tự động quyết định chủ sở hữu mạng cho phần này.
Trả lại phần cơ bản của một tập hợp các bộ phận.
Trả về một bảng tất cả các BasePart.CanCollide phần đúng có chồng lấp với phần này.
Trả về tốc độ song song của lắp ráp phần ở vị trí đã cho so với phần này.
Trả về true nếu đối tượng được kết nối với một phần sẽ giữ nó ở vị trí (ví dụ một phần Anchored), nếu không trả về false.
Thay đổi kích thước của một đối tượng giống như sử dụng công cụ thay đổi kích thước Studio.
Đặt người chơi được cung cấp làm chủ mạng cho này và tất cả các bộ phận kết nối.
Cho phép động cơ trò chơi quyết định người sẽ xử lý vật lý của phần (một trong những khách hàng hoặc máy chủ).
- IntersectAsync(parts : Instances,collisionfidelity : Enum.CollisionFidelity,renderFidelity : Enum.RenderFidelity):Instance
Tạo một đối tượng mới IntersectOperation từ hình học chồng lấp của phần và các phần khác trong danh sách được cho.
- SubtractAsync(parts : Instances,collisionfidelity : Enum.CollisionFidelity,renderFidelity : Enum.RenderFidelity):Instance
Tạo một đoạn mới UnionOperation từ phần, trừ định hình được chiếm bởi các phần trong mảng được cho.
- UnionAsync(parts : Instances,collisionfidelity : Enum.CollisionFidelity,renderFidelity : Enum.RenderFidelity):Instance
Tạo một đoạn mới UnionOperation từ phần, cộng với hình học được chiếm bởi các phần trong mảng đã cho.
Nhận trung tâm của một PVInstance .
Biến đổi PVInstance cùng với tất cả con cháu của nó PVInstances như vậy mà trục trung tâm bây giờ được đặt tại điểm CFrame được chỉ định.
Sự Kiện
Sự Kiện kế thừa từ BasePartBắt lửa khi một phần ngừng chạm vào một phần khác do chuyển động vật lý.
Bắt lửa khi một phần chạm vào phần khác do chuyển động vật lý.
Thuộc Tính
Decoration
Hiện tại bật hoặc tắt cỏ hoạt hình trên vật liệu địa hình Cỏ , mặc dù các thay đổi trong tương lai của thuộc tính này có thể kiểm soát các tính năng trang trí bổ sung.
GrassLength
Xác định chiều dài của cỏ hoạt hình trên vật liệu địa hình Cỏ , cho rằng Decoration được bật. Các giá trị hợp lệ nằm giữa 0.1 và 1.
MaterialColors
MaterialColors đại diện cho trình biên tập cho tính năng Màu vật liệu, và không thể được chỉnh sửa bởi các tập lệnh .
Để lấy màu của một vật liệu, sử dụng: Terrain:GetMaterialColor()
Để đặt màu của một vật liệu, sử dụng: Terrain:SetMaterialColor()
WaterWaveSize
Đặt độ cao tối đa của làn sóng nước địa hình bằng đinh tán. Hiện tại bị giới hạn giữa 0 và 1.
WaterWaveSpeed
Đặt số lần mà làn sóng nước địa hình sẽ di chuyển lên và xuống mỗi phút. Hiện tại bị giới hạn giữa 0 và 100.
Phương Pháp
CellCenterToWorld
Trả vị trí thế giới của trung tâm của tế bào địa hình (x, y, z).
Tham Số
Lợi Nhuận
CellCornerToWorld
Trả vị trí của góc trái thấp hơn về phía trước của tế bào lưới (x, y, z).
Tham Số
Lợi Nhuận
Clear
Xóa địa hình.
Lợi Nhuận
CopyRegion
Lưu một khối địa hình thành một đối tượng TerrainRegion để có thể tải lại sau.Lưu ý: TerrainRegion dữ liệu không sao lưu giữa máy chủ và khách hàng.
Tham Số
Lợi Nhuận
Mẫu mã
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
Lấp đầy một quả bóng địa hình mịn trong không gian đã cho.
Tham Số
Vị trí của trung tâm của quả bóng địa hình.
Bán kính trong studs của quả bóng địa hình.
The Enum.Material của quả bóng địa hình.
Lợi Nhuận
Mẫu mã
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
Lấp đầy một khối địa hình mịn với vị trí, tốc độ xoay, kích thước và chất liệu đã cho.
Tham Số
Vị trí và hướng của khối địa hình.
Kích thước bằng đinh tán của khối hình vuông - cả chiều cao và chiều rộng.
Cục Enum.Material của khối địa hình.
Lợi Nhuận
FillCylinder
Lấp đầy một xi lanh của địa hình mịn trong một không gian nhất định. Không gian được xác định bằng cách sử dụng một CFrame, chiều cao và bán kính.
local Workspace = game:GetService("Workspace")Workspace.Terrain:FillCylinder(CFrame.new(0, 50, 0), 5, 30, Enum.Material.Asphalt)
Tham Số
Vị trí và hướng của xi lanh địa hình.
Chiều cao bằng đinh tán của xi lanh địa hình.
Bán kính trong đinh tán của xi lanh địa hình.
The Enum.Material của terrain cylinder.
Lợi Nhuận
FillRegion
Lấp đầy một không gian Region3 với địa hình mịn.
Tham Số
Lợi Nhuận
FillWedge
lấp đầy một khối có hình dạng góc cạnh có kích thước với khoảng và kích thước của khu vực và kích thước được đưa ra.Hướng của khối góc giống như một tương đương WedgePart .
Tham Số
Vị trí và hướng của cạnh để lấp đầy.
Kích cỡ của đòn bẩy để lấp đầy.
Vật liệu mà khối góc sẽ được lấp đầy.
Lợi Nhuận
GetMaterialColor
Trả về màu vật liệu địa hình hiện tại cho vật liệu địa hình được chỉ định.
Tham Số
Lợi Nhuận
PasteRegion
Áp dụng một khối địa hình cho đối tượng Địa hình. Lưu ý: TerrainRegion dữ liệu không sao lưu giữa máy chủ và khách hàng.
Tham Số
Lợi Nhuận
Mẫu mã
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
Trả về một khu vực dữ liệu voxel địa hình theo dạng bảng dựa trên tên kênh.
Tham Số
Khu vực mục tiêu để đọc. Phải được căn chỉnh với lưới voxel. Sẽ xảy ra lỗi nếu khu vực quá lớn; giới hạn hiện tại là 4194304 voxels³.
Độ phân giải voxel. Phải là 4.
Hệ thống các ID kênh (chuỗi) cần phải truy cập từ dữ liệu voxel.Mỗi ID kênh đại diện cho một loại dữ liệu được lưu trong voxel.Các ID hỗ trợ hiện tại là {"SolidMaterial", "SolidOccupancy", "LiquidOccupancy"} .
Lợi Nhuận
Trả về dữ liệu voxel dưới dạng một từ điển dựa trên đầu vào channelIds. Các chìa khóa đại diện cho mỗi ID kênh với giá trị tương ứng như một mảng dữ liệu 3D.
- SolidMaterial — Vật liệu Enum.Material của voxel.Lưu ý rằng Water không còn được hỗ trợ nữa; thay vào đó, một voxel chứa nước sẽ có giá trị là LiquidOccupancy .
- SolidOccupancy — Sự chiếm giữ của vật liệu voxel như được định nghĩa trong kênh SolidMaterial. Đây là một giá trị giữa 0 (trống) và 1 (đầy đủ).
Từ điển cũng chứa một chìa khóa Size với giá trị đại diện cho kích thước 3D của mỗi kênh dữ liệu.
Mẫu mã
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
Trả về một khu vực nhất định của địa hình mịn trong định dạng bảng.
Tham Số
Khu vực mục tiêu để đọc. Phải được căn chỉnh với lưới voxel. Sẽ xảy ra lỗi nếu khu vực quá lớn. Giới hạn hiện tại là 4194304 voxels^3.
Độ phân giải voxel. Phải là 4.
Lợi Nhuận
Trả về dữ liệu voxel thô như hai mảng 3D.
- materials - 3D mảng của Enum.Material từ khu vực mục tiêu. Cũng bao gồm một trường Kích thước, tương đương với kích thước của các mảng lồng nhau.
- occupancies - 3D mảng các giá trị sử dụng từ khu vực mục tiêu. Cũng bao gồm một trường Kích thước, tương đương với kích thước của các mảng lồng nhau.
Mẫu mã
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
Thay thế Vật liệu thay thế mặt địa hình của một cụ thể Enum.Material trong một Region3 với một vật liệu khác.Về cơ bản, đó là một hoạt động tìm và thay thế trên Terrain vật liệu.
Hạn chế
Khi gọi phương thức này, tham số resolution phải chính xác 4.Ngoài ra, Vùng 3 phải được căn chỉnh với lưới vật liệu địa hình, tức làcác thành phần của điểm tối thiểu và tối đa của Vùng 3 phải chia hết cho 4.Sử dụng Region3:ExpandToGrid() để làm cho một khu vực tương thích với chức năng này.
Tham Số
Khu vực mà hoạt động thay thế sẽ xảy ra.
Độ phân giải mà hoạt động thay thế sẽ diễn địa điểm; tại thời điểm này phải chính xác 4.
Vật liệu cũ sẽ được thay thế.
Vật liệu mới.
Lợi Nhuận
Mẫu mã
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
Đặt màu vật liệu địa hình hiện tại cho vật liệu địa hình được chỉ định. Vật liệu địa hình sẽ thay đổi màu cơ sở của nó theo màu được chỉ định.
Tham Số
Lợi Nhuận
WorldToCell
Trả vị trí của các ô lưới chứa điểm vị trí .
Tham Số
Lợi Nhuận
WorldToCellPreferEmpty
Trả vị trí của ô lưới chứa vị trí điểm, ưu tiên các ô lưới trống khi vị trí nằm trên cạnh lưới.
Tham Số
Lợi Nhuận
WorldToCellPreferSolid
Trả vị trí của ô lưới chứa vị trí điểm, ưu tiên các ô lưới không trống khi vị trí nằm trên cạnh lưới.
Tham Số
Lợi Nhuận
WriteVoxelChannels
Đặt một khu vực địa hình bằng cách sử dụng một từ điển của dữ liệu kênh voxel.
Tham Số
Khu vực mục tiêu để viết. Phải được căn chỉnh với lưới voxel. Sẽ xảy ra lỗi nếu khu vực quá lớn; giới hạn hiện tại là 4194304 voxels³.
Độ phân giải voxel. Phải là 4.
Từ điển dữ liệu voxel tương tự như giá trị trả về của ReadVoxelChannels() .Các khóa đại diện cho mỗi ID kênh với giá trị tương ứng của chúng như một mảng dữ liệu 3D.Từ điển có thể hỗ trợ đầu vào kênh đơn hoặc nhiều.
- SolidMaterial — Vật liệu Enum.Material của voxel.Lưu ý rằng Water không còn được hỗ trợ nữa; thay vào đó, một voxel chỉ chứa nước nên được nhập là SolidMaterial = Enum.Material.Air, LiquidOccupancy = x , nơi x là một số từ 0 (độc quyền) đến 1 (bao gồm).
- SolidOccupancy — Sự chiếm chỗ của vật liệu voxel như được định nghĩa trong kênh SolidMaterial. Đây nên là một giá trị giữa 0 (trống) và 1 (đầy đủ).
Lợi Nhuận
Mẫu mã
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
Đặt một khu vực nhất định của địa hình bằng cách sử dụng định dạng bảng.
Tham Số
Khu vực mục tiêu để viết. Phải được căn chỉnh với lưới voxel. Sẽ xảy ra lỗi nếu khu vực quá lớn.
Độ phân giải voxel. Phải là 4.
3D mảng của Enum.Material. Chiều phải chính xác phù hợp với kích thước của khu vực mục tiêu trong voxels.
3D mảng của số lượng voxel chiếm (số nằm giữa 0 và 1). Chiều phải chính xác phù hợp với kích thước của khu vực mục tiêu trong voxel.
Lợi Nhuận
Mẫu mã
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))