지형은 작은 지연을 가진 동적으로 변형 가능한 환경을 만들 수 있습니다. 현재 4×4×4 그리드의 셀로 구성되어 있으며, 각 셀에는 0에서 1 사이의 숫자가 있습니다. 이 숫자는 지오메트리가 셀을 차지하는 양과 재료를 나타냅니다. 이 재료는
자세한 내용은 지형을 참조하십시오.
요약
속성
지형 장식을 활성화 또는 비활성화합니다.
애니메이션 잔디의 길이를 지정합니다.
MaterialColors 재료 색상 기능에 대한 편집기를 나타내며 스크립트에 의해 편집할 수 없습니다.
재료의 색을 가져오려면: Terrain:GetMaterialColor() 를 사용합니다. 재료의 색을 설정하려면: Terrain:SetMaterialColor()
가장 큰 편집 가능한 영역의 경계를 표시합니다.
지형 물의 색조.
지형의 물 반사를 얼마나 불투명하게 합니다.
지형 물의 투명도.
지형 물결의 최대 높이를 스터드 단위로 설정합니다.
지형 물결이 분당마다 상승하고 하강하는 횟수를 설정합니다.
물리적으로 부품이 움직일 수 없는지 여부를 결정합니다.
부품 조립의 각도 속도.
부품 조립의 중심 공간.
부품 조립의 직선 속도.
부품 조립의 총 질량.
조립의 루트 부분에 대한 참조.
부품의 뒷면 표면 유형을 결정합니다 (+Z 방향).
부품의 하단 면에 대한 표면 유형을 결정합니다(Y 방향).
부품의 색을 결정합니다.
세계에서 BasePart의 위치 및 방향을 결정합니다.
부품이 다른 부품과 충돌할 수 있는지 여부를 결정합니다.
공간 쿼리 작업 중에 부품이 고려되는지 여부를 결정합니다.
부품에 화재가 발생하는지 여부를 결정합니다. Touched 및 TouchEnded 이벤트가 부품에서 발생하는지 여부를 결정합니다.
부품이 그림자를 캐스트하는지 여부를 결정합니다.
부품의 중심 마사가 위치한 세계 위치를 설명합니다.
부품 충돌 그룹의 이름을 설명합니다.
부품의 색을 결정합니다.
부품의 현재 물리적 속성을 나타냅니다.
부품의 여러 물리적 속성을 결정합니다.
부품 및 조립에 대한 공기 동력 힘을 활성화하거나 비활성화합니다.
물리적 엔터티의 CFrame 의 물리적 부분입니다.
물리적 엔진에 의해 보는 BasePart의 실제 크기.
부품의 앞면에 대한 표면 유형을 결정합니다(Z 방향).
부품의 왼쪽 표면 유형을 결정합니다(ـX 방향).
로컬 클라이언트에만 표시되는 BasePart.Transparency 의 배수를 결정합니다.
Studio에서 부품을 선택할 수 있는지 여부를 결정합니다.
부품의 질량, 밀도 및 볼륨의 제품을 설명합니다.
부품이 유연 신체총 질량이나 비활성에 기여하는지 여부를 결정합니다.
부품의 텍스처 및 기본 물리 속성을 결정합니다.
Class.MaterialVariant 의 이름.
부품의 회전을 설명합니다.
부품의 피벗 오프셋을 지정합니다. CFrame 에서.
세계의 부품 위치를 설명합니다.
마지막으로 기록된 물리 업데이트 이후의 시간.
부품이 하늘 상자를 얼마나 반영하는지 결정합니다.
크기 조정 메서드에 의해 허용되는 가장 작은 변경 내용을 설명합니다.
부품의 크기를 조정할 수 있는 얼굴을 설명합니다.
부품의 오른쪽 면에 대한 표면 유형을 결정합니다 (+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):void
지역 내의 재료 지형을 다른 재료로 대체합니다.
지정된 지형 재료 색상을 현재 지형 재료에 적용합니다.
점 위치 가 포함된 그리드 셀 위치를 반환합니다.
위치가 그리드 모서리에 있을 때 포인트 위치를 포함하는 그리드 셀 위치를 반환합니다.
위치가 그리드 모서리에 있을 때 포인트 위치를 포함하는 그리드 셀 위치를 반환합니다.
복셀 채널 데이터 사전을 사용하여 지역을 설정합니다.
테이블 형식을 사용하여 특정 지역의 부드러운 지형을 설정합니다.
조립에 각진 충격을 적용합니다.
조립의 중심에 충격을 적용하십시오. center of mass .
지정된 위치에 임팩트를 적용합니다.
부품이 서로 충돌할 수 있는지 여부를 반환합니다.
부품 소유자의 네트워크 소유권을 설정할 수 있는지 여부를 확인합니다.
모든 종류의 고정 관절을 통해 개체에 연결된 부품 테이블을 반환합니다.Returns a table of parts connected to the object by any kind of rigid joint.
이 부분에 연결된 모든 관절 또는 제한을 반환합니다.
Class.BasePart.Mass|Mass 속성의 값을 반환합니다.
이 부분의 네트워크 소유자인 현재 플레이어를 반환하거나 서버의 경우 일반 0을 반환합니다.
이 부분에 대한 네트워크 소유자를 게임 엔진이 자동으로 결정하면 true를 반환합니다.
부품 조립의 기본 부분을 반환합니다.
이 부품과 교차하는 모든 BasePart.CanCollide 진실한 부품의 테이블을 반환합니다.
이 부품과 관련된 지정된 위치에 대해 부품 조립의 직선 속도를 반환합니다.
부품에 연결할 개체가 있으면 참이 되고 그렇지 않으면 참이 되지 않습니다.
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 를 부품에서 만들고 지정된 배열에 있는 부품의 기하학을 점유합니다.
Class.PVInstance의 피벗을 가져옵니다.
모든 후손 PVInstance 과 함께 폼 PVInstances 으로 핵심이 이제 CFrame 에 위치 하도록 변환 합니다.
이벤트
이벤트가 BasePart에서 상속되었습니다물리적 이동의 결과로 부품이 다른 부품을 만지지 않게 되면 화재가 발생합니다.
물리적 이동의 결과로 부품이 다른 부품을 만질 때 발생합니다.
속성
MaterialColors
MaterialColors 재료 색상 기능에 대한 편집기를 나타내며 스크립트에 의해 편집할 수 없습니다.
재료의 색을 가져오려면: Terrain:GetMaterialColor()
재료의 색을 설정하려면: Terrain:SetMaterialColor()
메서드
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, 높이 및 반경을 사용하여 정의됩니다.
사용
workspace.Terrain:FillCylinder(CFrame.new(0, 50, 0), 5, 30, Enum.Material.Asphalt)
매개 변수
반환
FillWedge
FillWedge() 는 지정된 Terrain 의 쐐기 모양 볼륨을 채우고, 주어진 Enum.Material 및 지역의 0> Datatype.CFrame0> 와 크기로 구성됩니다. 쐐기의 방향은 동일한 쐐기 3>Class.
매개 변수
반환
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 복셀 3개입니다.
복셀 해상도. 4여야 합니다.
복셀 데이터에서 액세스해야 하는 채널 ID 배열(문자열). 각 채널 ID는 복셀에 저장된 데이터 유형을 나타냅니다. 현재 지원되는 ID는 {"SolidMaterial", "SolidOccupancy", "LiquidOccupancy"}입니다.
반환
입력의 channelIds 기반으로 복셀 데이터를 사전으로 반환합니다. 키는 각 채널 ID에 해당하는 값을 3D 데이터 배열로 나타냅니다.
- SolidOccupancy — 채널 SolidMaterial에 지정된 복셀 재료의 점유량. 이 값은 0(Empty)과 1(Full) 사이의 값입니다.
- LiquidOccupancy — 솔리드 재료의 솔리드 재료 솔리드 재료 솔리드 재료 솔리드 재료 솔리드 재료 솔리드 재료 솔리드 재료 솔리드 재료 솔리드 재
사전에는 각 채널 데이터의 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여야 합니다.
반환
원시 복셀 데이터를 두 개의 3D 배열로 반환합니다.
- materials - 대상 영역의 3D 배열 Enum.Material 에서 크기 필드가 포함되어 있습니다. 또한 중첩된 배열의 크기와 같은 크기 필드를 포함합니다.
- 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 는 특정 Enum.Material``Datatype.Region3 내의 다른 재료로 찾아 대체 작업을 수행합니다. 기본적으로, 이것은 Terrain 재료에 대한 검색 및 대체 작업입니다.
제약 사항
이 메서드를 호출할 때 resolution 매개 변수는 정확히 4여야 합니다. 또한, 지역 3의 최소 및 최대 점 구성 요소는 지형 재료 그리드에 정렬해야 하며, 이는 지역 3의 최소 점 및 최대 점의 구성 요소를 4개로 나눌 수 있습니다. 이
매개 변수
교체 작업이 발생지역입니다.
교체 작업이 플레이스해상도; 현재 이것은 정확히 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여야 합니다.
Class.Terrain:ReadVoxelChannels()|ReadVoxelChannels()의 반환 값과 같은 복셀 데이터 디쿠버전. 키는 각 채널 ID를 배열 3D 데이터로 표시합니다. 디쿠버는 단일 또는 여러 채널 입력을 지원할 수 있습니다.
- SolidMaterial — 복셀의 재료입니다. Enum.Material 은 더 이상 지원되지 않습니다; 대신, 수만 개의 물을 포함하는 복셀이 입력되어야 합니다. SolidMaterial = Enum.Material.
- SolidOccupancy — 채널 SolidMaterial에 지정된 복셀 재료의 점유량. 이 값은 0(공백)과 1(가득) 사이의 값이어야 합니다.
- LiquidOccupancy — 솔리드 재료의 솔리드 재료 솔리드 재료 솔리드 재료 솔리드 재료 솔리드 재료 솔리드 재료 솔리드 재료 솔리드 재료 솔리드 재
반환
코드 샘플
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여야 합니다.
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))