지형을 사용하면 느린 시간이 거의 없거나 동적으로 변환할 수 있는 환경을 쉽게 만들 수 있습니다.현재 각 세포에 0에서 1 사이의 숫자가 기하 도형이 세포를 차지해야 하는 양과 세포의 재료를 나타내는 4×4×4 격자에 기반하고 있습니다.점유도는 셀이 주변 셀과 어떻게 결합되는지 결정하며, 결과는 그리드 제약 조건이 없는 것처럼 보이게 합니다.
자세한 내용은 지형을 참조하십시오.
요약
속성
지형 장식을 활성화하거나 비활성화합니다.
애니메이션된 잔디의 길이를 지정합니다.
MaterialColors는 재료 색상 기능의 편집기를 나타내며, 스크립트로 편집할 수 없습니다 .
재료의 색을 가져오려면: Terrain:GetMaterialColor() 재료의 색을 설정하려면: Terrain:SetMaterialColor()
가능한 가장 큰 편집 가능 영역의 경계를 표시합니다.
지형 물의 색조.
지형의 물 반사가 얼마나 불투명한지 제어합니다.
지형 물의 투명도.
지형 물결의 최대 높이를 스터드로 설정합니다.
지형 물 파도가 분당 몇 번 이동하고 내려갈지 설정합니다.
부품이 물리적으로 이동할 수 없는지 여부를 결정합니다.
부품 조립의 각속도.
세계 공간에서 부품의 질량 중심.
부품 조립의 선형 속도.
부품 조립의 총 질량.
어셈블리의 루트 부분에 대한 참조.
부품의 뒷면 표면 유형을 결정합니다(+Z 방향).
부품의 하단 면에 대한 표면 유형을 결정합니다 (-Y 방향).
부품의 색상을 결정합니다.
세계에서 BasePart 의 위치와 방향을 결정합니다.
부품이 다른 부품과 충돌할 수 있는지 여부를 결정합니다.
부품이 공간 쿼리 작업 중에 고려되는지 여부를 결정합니다.
부품에서 Touched 및 TouchEnded 이벤트가 발생하는지 여부를 결정합니다.
부품이 그림자를 캐스팅하는지 여부를 결정합니다.
부품의 질량 중심이 위치한 세계 위치를 설명합니다.
부품의 충돌 그룹 이름을 설명합니다.
부품의 색상을 결정합니다.
부품의 현재 물리적 속성을 나타냅니다.
부품의 물리적 속성을 여러 가지 결정합니다.
부품과 조립에서 공기역학 힘을 활성화하거나 비활성화하는 데 사용됩니다.
물리 엔진에서 보는 BasePart의 실제 크기.
부품의 앞면 표면 유형을 결정합니다 (-Z 방향).
부품의 왼쪽 면에 대한 표면 유형을 결정합니다 (-X 방향).
로컬 클라이언트에만 표시되는 BasePart.Transparency의 배수를 결정합니다.
부품이 Studio에서 선택 가능한지 여부를 결정합니다.
부품의 질량, 밀도와 용량의 곱을 설명합니다. Describes the mass of the part, the product of its density and volume.
부품이 단단한 신체총 질량이나 중력에 기여하는지 여부를 결정합니다.
부품의 텍스처와 기본 물리적 속성을 결정합니다.
이름 의 MaterialVariant .
세계에서 부품의 회전을 설명합니다.
부품의 피벗 오프셋을 부품의 CFrame에서 지정합니다.
세계에서 부품의 위치를 설명합니다.
마지막으로 기록된 물리 업데이트 이후 시간.
부품이 하늘상자를 얼마나 반영하는지 결정합니다.
Resize 메서드에서 허용하는 가장 작은 크기 변경을 설명합니다.
부품을 재설정할 수 있는 얼굴을 설명합니다.
부품의 오른쪽 면에 대한 표면 유형을 결정합니다 (+X 방향).
어셈블리의 루트 부분을 결정하는 주 규칙.
세 축에 대한 부품의 회전 정도(도).
부품의 차원(길이, 너비, 높이)을 결정합니다.
부품의 상단 면에 대한 표면 유형을 결정합니다(+Y 방향).
부품을 얼마나 볼 수 있는지 결정합니다(부품 불투명도의 반대).
메서드
지형 세포의 중심 위치 세계 좌표(x, y, z)를 반환합니다.
그리드 셀의 왼쪽 아래쪽 전방 모서리 위치(x, y, z)를 반환합니다.
지형을 지웁니다.
나중에 다시 로드할 수 있도록 지형의 일부를 TerrainRegion 개체에 저장합니다.참고: TerrainRegion 데이터는 서버와 클라이언트 사이에서 복제되지 않습니다.
지형에서 비어 있지 않은 세포 수를 반환합니다.
지정된 공간에 부드러운 지형의 공을 채웁니다.
부드러운 지형 블록을 지정된 위치, 회전, 크기 및 재료로 채웁니다.
지정된 공간에서 부드러운 지형의 실린더를 채웁니다.
부드러운 지형으로 Region3 공간을 채웁니다.
지형의 쐐기 모양 볼륨을 주어진 Enum.Material 및 지역의 CFrame과 크기로 채우고
지정된 지형 재료에 대한 현재 지형 재료 색을 반환합니다.
지형 영역을 지형 개체에 적용합니다. 참고: TerrainRegion 데이터는 서버와 클라이언트 사이에서 복제되지 않습니다.
채널 이름에 따라 테이블 형식으로 지형 복셀 데이터의 영역을 반환합니다.
테이블 형식으로 부드러운 지형의 특정 영역을 반환합니다.
- ReplaceMaterial(region : Region3,resolution : number,sourceMaterial : Enum.Material,targetMaterial : Enum.Material):()
지역 내의 재료의 지형을 다른 재료로 바꿉니다.
지정된 지형 재료의 현재 지형 재료 색을 설정합니다.
점 위치 를 포함하는 그리드 셀 위치를 반환합니다.
점 위치를 포함하는 그리드 셀 위치를 반환하여 위치가 그리드 가장자리에 있을 때 빈 그리드 셀을 선호합니다.
점 위치가 포함된 그리드 셀 위치를 반환하여 위치가 그리드 가장자리에 있을 때 비어 있지 않은 그리드 셀을 선호합니다.
보벨 채널 데이터 사전을 사용하여 지형 영역을 설정합니다.
테이블 형식을 사용하여 부드러운 지형의 특정 영역을 설정합니다.
어셈블리에 각진 펄스를 적용합니다.
조립의 center of mass에 임펄스를 적용하여 조립에 적용합니다.
지정된 위치에 임펄스를 조립에 적용합니다.
부품이 서로 충돌할 수 있는지 여부를 반환합니다.
부품의 네트워크 소유권을 설정할 수 있는지 확인합니다.
어떤 종류의 강성 조인으로 개체에 연결된 부품의 테이블을 반환합니다.
이 부분에 연결된 모든 조인 또는 제약 조건을 반환합니다.
Mass 속성의 값을 반환합니다.
이 부분의 네트워크 소유자인 현재 플레이어를 반환하거나 서버의 경우 nil 입니다.
게임 엔진이 이 부분에 대한 네트워크 소유자를 자동으로 결정하면 true를 반환합니다.
부품 집합의 기본 부분을 반환합니다.
이 부분과 교차하는 모든 BasePart.CanCollide 진실한 부품의 테이블을 반환합니다.
이 부품과 관련하여 지정된 위치에서 부품의 선형 속도를 반환합니다.
개체가 장소에 유지될 부품에 연결되어 있으면 true를 반환하고, 그렇지 않으면 false를 반환합니다.
Studio 크기 조정 도구를 사용하는 것과 마찬가지로 개체의 크기를 변경합니다.
지정된 플레이어를 네트워크 소유자로 설정하여 이 및 모든 연결된 부품에 대해 네트워크 소유권을 부여합니다.
게임 엔진이 부품의 물리학을 처리할 클라이언트 또는 서버 중 하나를 동적으로 결정하게 합니다.
- IntersectAsync(parts : Instances,collisionfidelity : Enum.CollisionFidelity,renderFidelity : Enum.RenderFidelity):Instance
부품의 겹치는 기하학과 주어진 배열의 다른 부품에서 새로운 IntersectOperation를 생성합니다.
- SubtractAsync(parts : Instances,collisionfidelity : Enum.CollisionFidelity,renderFidelity : Enum.RenderFidelity):Instance
부품에서 지정된 배열에 있는 부품의 기하학을 빼고 새로운 UnionOperation를 부품에서 만듭니다.
- UnionAsync(parts : Instances,collisionfidelity : Enum.CollisionFidelity,renderFidelity : Enum.RenderFidelity):Instance
부품에서 새로운 UnionOperation 를 생성하고, 지정된 배열에 있는 부품의 기하학을 더합니다.
PVInstance의 피벗을 가져옵니다.
피벗이 지금 지정된 PVInstance 에 위치하도록 모든 하위 요소 PVInstances 와 함께 변환하여 피벗이 지금 지정된 CFrame 에 위치합니다.
이벤트
이벤트가 BasePart에서 상속되었습니다물리적 이동의 결과로 부품이 다른 부품에 접촉하지 않게 되면 발생합니다.
물리적 이동의 결과로 부품이 다른 부품에 닿을 때 발생합니다.
속성
MaterialColors
MaterialColors는 재료 색상 기능의 편집기를 나타내며, 스크립트로 편집할 수 없습니다 .
재료의 색을 가져오려면 다음을 사용하십시오: Terrain:GetMaterialColor()
재료의 색상을 설정하려면 다음을 사용하십시오: Terrain:SetMaterialColor()
메서드
CellCenterToWorld
지형 세포의 중심 위치 세계 좌표(x, y, z)를 반환합니다.
매개 변수
반환
CellCornerToWorld
그리드 셀의 왼쪽 아래쪽 전방 모서리 위치(x, y, z)를 반환합니다.
매개 변수
반환
Clear
지형을 지웁니다.
반환
CopyRegion
나중에 다시 로드할 수 있도록 지형의 일부를 TerrainRegion 개체에 저장합니다.참고: TerrainRegion 데이터는 서버와 클라이언트 사이에서 복제되지 않습니다.
매개 변수
반환
코드 샘플
local terrainRegion = workspace.Terrain:CopyRegion(workspace.Terrain.MaxExtents)
workspace.Terrain:Clear()
task.wait(5)
workspace.Terrain:PasteRegion(terrainRegion, workspace.Terrain.MaxExtents.Min, true)
FillBall
지정된 공간에 부드러운 지형의 공을 채웁니다.
매개 변수
반환
코드 샘플
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
부드러운 지형 블록을 지정된 위치, 회전, 크기 및 재료로 채웁니다.
매개 변수
반환
FillCylinder
지정된 공간에서 부드러운 지형의 실린더를 채웁니다. 공간은 CFrame, 높이 및 반경을 사용하여 정의됩니다.
local Workspace = game:GetService("Workspace")Workspace.Terrain:FillCylinder(CFrame.new(0, 50, 0), 5, 30, Enum.Material.Asphalt)
매개 변수
반환
FillWedge
는 주어진 및 지역의 및 크기로 쐐기 모양의 볼륨을 채웁니다.쐐기의 방향은 동일한 대체 요소 WedgePart 와 동일합니다.
매개 변수
채울 쐐기의 위치와 방향.
채울 쐐기의 크기.
쐐기가 채워질 재료.
반환
PasteRegion
지형 영역을 지형 개체에 적용합니다. 참고: TerrainRegion 데이터는 서버와 클라이언트 사이에서 복제되지 않습니다.
매개 변수
반환
코드 샘플
--[[
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
채널 이름에 따라 테이블 형식으로 지형 복셀 데이터의 영역을 반환합니다.
매개 변수
읽을 대상 지역. 복셀 그리드에 맞춰야 합니다. 지역이 너무 커면 오류가 발생합니다; 현재 제한은 4194304 복셀³입니다.
복셀 해상도. 4여야 합니다.
볼륨 데이터에서 액세스해야 하는 채널 ID(문자열) 배열.각 채널 ID는 보텍스에 저장된 데이터 유형을 나타냅니다.현재 지원되는 ID는 {"SolidMaterial", "SolidOccupancy", "LiquidOccupancy"}입니다.
반환
입력의 channelIds에 따라 볼륨 데이터를 사전으로 반환합니다. 키는 각 채널 ID와 해당 값을 3D 데이터 배열로 나타냅니다.
- SolidOccupancy — 채널 SolidMaterial에 지정된 복셀의 재료 점유율. 이는 0(비어 있음)과 1(가득 참) 사이의 값입니다.
- LiquidOccupancy — 복셀에서 Water 물질의 점유율을 0(물 없음)과 1(물 가득) 사이의 값으로 지정합니다. 가 1이고 가 아닌 경우, 이것은 0이 됩니다.
사전에는 각 채널 데이터의 3D 배열 크기를 나타내는 값을 포함하는 Size 키도 포함됩니다.
코드 샘플
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
테이블 형식으로 부드러운 지형의 특정 영역을 반환합니다.
매개 변수
읽을 대상 지역. 복셀 그리드에 맞춰야 합니다. 지역이 너무 커면 오류가 발생합니다. 현재 한도는 4194304 복셀^3입니다.
복셀 해상도. 4여야 합니다.
반환
원시 복셀 데이터를 2D 배열로 반환합니다.
- materials - 대상 영역의 Enum.Material 3D 배열. 또한 크기 필드가 포함되어 중첩된 배열의 크기와 동일합니다.
- occupancies - 대상 영역의 점유 값 3D 배열. 또한 중첩된 배열의 크기 필드와 동일한 크기 필드를 포함합니다.
코드 샘플
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는 특정 내의 지형을 다른 재료로 교체합니다.본질적으로, 그것은 Terrain 재료에 대한 검색 및 교체 작업입니다.
제약 조건
이 메서드를 호출할 때, resolution 매개변수는 정확히 4여야 합니다.또한 지역3는 지형 재료 그리드에 맞춰야 하며, 즉Region3의 최소 및 최대 점의 구성 요소는 4로 나눌 수 있어야 합니다.Region3:ExpandToGrid()를 사용하여 지역을 이 함수와 호환되도록 만듭니다.
매개 변수
교체 작업이 발생할 영역.
교체 작업이 플레이스해상도; 현재 정확히 4여야 합니다.
교체될 이전 재료.
새로운 재료.
반환
코드 샘플
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
지정된 지형 재료의 현재 지형 재료 색을 변경합니다. 지형 재료는 기본 색상을 지정된 색상으로 이동합니다.
매개 변수
반환
WorldToCellPreferEmpty
점 위치를 포함하는 그리드 셀 위치를 반환하여 위치가 그리드 가장자리에 있을 때 빈 그리드 셀을 선호합니다.
매개 변수
반환
WorldToCellPreferSolid
점 위치가 포함된 그리드 셀 위치를 반환하여 위치가 그리드 가장자리에 있을 때 비어 있지 않은 그리드 셀을 선호합니다.
매개 변수
반환
WriteVoxelChannels
보벨 채널 데이터 사전을 사용하여 지형 영역을 설정합니다.
매개 변수
쓰기 대상 영역. 복셀 그리드에 맞춰야 합니다. 영역이 너무 커면 오류가 발생합니다; 현재 제한은 4194304 복셀³입니다.
복셀 해상도. 4여야 합니다.
VOXEL 데이터의 사전은 ReadVoxelChannels()의 반환 값과 유사합니다.키는 각 채널 ID와 해당 값을 3D 데이터 배열로 나타냅니다.사전은 단일 또는 여러 채널 입력을 지원할 수 있습니다.
- SolidMaterial — 복셀의 Enum.Material 재료.더 이상 Water 가 지원되지 않으므로, 물만 포함하는 복셀은 SolidMaterial = Enum.Material.Air, LiquidOccupancy = x 으로 입력되어야 하며, x 는 0(독점)과 1(포함) 사이의 숫자입니다.
- SolidOccupancy — 채널 SolidMaterial에서 지정된 복셀의 재료 점유율. 이는 0(비어 있음)과 1(가득 참) 사이의 값이어야 합니다.
- LiquidOccupancy — 복셀에서 Water 물질의 점유율을 0(물 없음)과 1(물 가득) 사이의 값으로 지정합니다. 가 1이고 가 아닌 경우, 이것은 0이 됩니다.
반환
코드 샘플
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
테이블 형식을 사용하여 부드러운 지형의 특정 영역을 설정합니다.
매개 변수
쓰기 대상 영역. 복셀 그리드에 맞춰야 합니다. 영역이 너무 커면 오류가 발생합니다.
복셀 해상도. 4여야 합니다.
Enum.Material의 3D 배열 차원은 볼셀에서 대상 영역의 크기와 정확히 일치해야 합니다.
복셀 점유도의 3D 배열(0에서 1 사이의 숫자). 차원은 복셀에서 대상 영역의 크기와 정확히 일치해야 합니다.
반환
코드 샘플
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))