Terrain
*このコンテンツは、ベータ版のAI(人工知能)を使用して翻訳されており、エラーが含まれている可能性があります。このページを英語で表示するには、 こちら をクリックしてください。
地形では、遅延がほとんどない動的に変形可能な環境を簡単に作成できます。現在は、各セルが 0から 1の間の数値を持つ 4×4×4 セルグリッドに基づいていますが、それぞれのセルは、幾何学がセルを占有する量と、セルの材料を表しています。占有率は、セルが周囲のセルとどのように結合するかを決定し、結果はグリッド制約がないという錯覚です。
詳しくは、地形を参照してください。
概要
プロパティ
地形装飾を有効化/無効化します。
アニメーションされた草の長さを指定します。
MaterialColors は、Material Color 機能のエディタを表示し、 スクリプトで編集できません 。
素材の色を取得するには、次を使用します:Terrain:GetMaterialColor() 素材の色を設定するには、次を使用します:Terrain:SetMaterialColor()
最大可能な編集可能な領域の境界を表示します。
地形水の色合い。
地形の水反射がどれほど不透明かを制御します。
地形水の透明度。
地形水波の最大高さをスタッドで設定します。
地形水波が毎分何回上下移動するかを設定します。
パーツが物理的に移動不可能かどうかを決定します。
部品の組み立ての角速度。
ワールドスペースでのパーツのアセンブリの質量の中心。
部品の組み立ての線速度。
パーツのアセンブリの総質量。
アセンブリの根部に対する参照。
部品の後面の表面タイプを決定します (+Z 方向)。
部品の底面の表面タイプを決定します (-Y 方向)。
部品の色を決定します。
世界の BasePart の位置と方向を決定します。
パーツが他のパーツと衝突できるかどうかを決定します。
パーツが空間クエリ操作で考慮されるかどうかを決定します。
Touched および TouchEnded イベントがパーツに発射するかどうかを決定します。
パーツがシャドウをキャストするかどうかを決定します。
部品の質量の中心が位置する世界の位置を説明します。
パーツの衝突グループの名前を記述します。
部品の色を決定します。
部品の現在の物理プロパティを示します。
部品の複数の物理的特性を決定します。
部品やアセンブリの空力を有効化または無効化するのに使用します。
物理エンジンによって見られる BasePart の実際のサイズ。
部品の前面の表面タイプを決定します (-Z 方向)。
部品の左面の表面タイプを決定します (-X 方向)。
ローカルクライアントにしか表示されない BasePart.Transparency の乗数を決定します。
スタジオでパーツが選択可能かどうかを決定します。
部品の質量、密度とボリュームの積を記述します。
パーツが剛ボディの総質量または粘性に貢献するかどうかを決定します。
部品のテクスチャとデフォルトの物理プロパティを決定します。
名前の MaterialVariant 。
世界でのパーツの回転を説明します。
パーツのピボットのオフセットを、CFrame から指定します。
世界のパーツの位置を記述します。
最後の物理アップデート以来の時間。
パーツが天空ボックスをどの程度反映するかを決定します。
サイズ変更メソッドで許可される最小の変更を説明します。
パーツがサイズ変更できる顔を説明します。
部品の右面の表面タイプを決定します (+X 方向)。
アセンブリのルート部分を決定する主なルール。
3軸のためのパーツの回転度です。
部品の寸法 (長さ、幅、高さ) を決定します。
部品のトップフェイスの表面タイプを決定します (+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 は、サーバーの場合。
ゲームエンジンが自動的にこの部分のネットワーク所有者を決定する場合、真を返します。
パーツのアセンブリのベース部分を返します。
このパーツと交差するすべての BasePart.CanCollide 真のパーツの表を返します。
このパーツに対する位置に関連して、部品の組み立ての線速度を返します。
オブジェクトがそれを保持するパーツに接続されている場合 (例: Anchored パーツ) は真を返し、そうでない場合は false を返します。
Studio のサイズ変更ツールを使用するのと同じように、オブジェクトのサイズを変更します。
指定されたプレイヤーをこのネットワークの所有者とすべての接続部品の所有者とします。
ゲームエンジンが動的に、パーツの物理を処理する人 (クライアントの 1 人またはサーバー) を決定できます。
- 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 に位置します。
プロパティ
MaterialColors
MaterialColors は、Material Color 機能のエディタを表示し、 スクリプトで編集できません 。
素材の色を取得するには、使用してください: Terrain:GetMaterialColor()
素材の色を設定するには、使用してください: Terrain:SetMaterialColor()
方法
CellCenterToWorld
地形セルの中心の世界位置 (x、y、z) を返します。
パラメータ
戻り値
CellCornerToWorld
グリッドセルの左下向き角の位置 (x、y、z) を返します。
パラメータ
戻り値
Clear
地形をクリアします。
戻り値
CopyRegion
地形のチャンクを TerrainRegion オブジェクトに保存して、後でロードできるようにします。注: TerrainRegion データは、サーバーとクライアント間で複製されません。
パラメータ
戻り値
コードサンプル
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
指定されたスペースに滑らかな地形の球を満たします。
パラメータ
戻り値
コードサンプル
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
滑らかな地形のブロックを指定された場所、回転、サイズ、および素材で満たします。
パラメータ
戻り値
FillCylinder
指定されたスペースに滑らかな地形のシリンダーを満たします。スペースは、CFrame、高さ、および半径を使用して定義されます。
local Workspace = game:GetService("Workspace")Workspace.Terrain:FillCylinder(CFrame.new(0, 50, 0), 5, 30, Enum.Material.Asphalt)
パラメータ
戻り値
FillWedge
は、指定された とエリアの とサイズで、三角形のボリュームを満たします。ウェッジの向きは、同等の WedgePart と同じです。
パラメータ
埋めるウェッジの位置と方向。
埋めるウェッジのサイズ。
ウェッジが満たされる素材。
戻り値
PasteRegion
地形のチャンクを地形オブジェクトに適用します。注: TerrainRegion データは、サーバーとクライアント間で複製されません。
パラメータ
戻り値
コードサンプル
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
チャネル名に基づいて、テーブル形式で地形ボクセルデータの領域を返します。
パラメータ
読み込むターゲット領域。ボクセルグリッドに沿わなければなりません。領域が大きすぎるとエラーが発生します;制限は現在 4194304 ボクセル³です。
ボクセル解像度。4でなければなりません。
ボクセルデータからアクセスする必要があるチャネルID (文字列) のアレイ。各チャンネル ID は、ボクセルに保存されるデータの種類を表します。現在サポートされているIDは {"SolidMaterial", "SolidOccupancy", "LiquidOccupancy"} です。
戻り値
channelIds 入力に基づいて辞書形式でボクセルデータを返します。キーは、それぞれのチャネルIDとそれぞれの値を 3Dデータの配列として表示します。
- SolidMaterial — ボクセルの Enum.Material 素材。注: Water はもうサポートされていません;代わりに、水を含むボクセルの値は LiquidOccupancy になります。
- SolidOccupancy — ボクセルの材料の占有率が SolidMaterial チャンネルで指定されたもの。これは 0 (空) と 1 (満) の間の値です。
辞書には、各チャネルデータの 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でなければなりません。
戻り値
生のボクセルデータを 2つの 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 は、特定の 内の地形を別の材料に置き換えます。本質的には、Terrain マテリアルの検索と置換操作です。
制限
このメソッドを呼び出すとき、resolution パラメータは正確に 4 でなければなりません。さらに、領域 3 は地形材料グリッドに沿わなければならない、すなわちRegion3 の最小値と最大値のコンポーネントは、4で割り切れる必要があります。Region3:ExpandToGrid() を使用して、領域をこの関数と互換性を持たせます。
パラメータ
置換操作が発生する領域。
置換操作が行われる解像度; 現在、正確に 4 である必要があります。
置換する予定の古いマテリアル。
新しい素材。
戻り値
コードサンプル
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
指定された地形材料の現在の地形材料の色を設定します。地形材料は、基本色を指定された色に移行します。
パラメータ
戻り値
WorldToCellPreferEmpty
グリッドセルの位置が含まれるグリッドセルの場所を返し、位置がグリッドの端にあるときは空のグリッドセルを好まします。
パラメータ
戻り値
WorldToCellPreferSolid
グリッドセルの位置を含むグリッドセルの場所を返し、位置がグリッドの端にあるときに非空のグリッドセルを避けます。
パラメータ
戻り値
WriteVoxelChannels
ボクセルチャネルデータの辞書を使用して、地形の領域を設定します。
パラメータ
書き込むターゲットの領域。ボクセルグリッドに沿わなければなりません。領域が大きすぎるとエラーが発生します;制限は現在 4194304 ボクセル³です。
ボクセル解像度。4でなければなりません。
Dictionary of voxel data similar to the return value of ReadVoxelChannels() に類似するボクセルデータの辞書。キーは、それぞれの値を 3D データの配列として、それぞれのチャネル IDを表します。辞書は、単一または複数のチャネル入力をサポートできます。
- SolidMaterial — ボクセルの Enum.Material 素材。注: Water はもうサポートされていません;代わりに、水だけを含むボクセルは SolidMaterial = Enum.Material.Air, LiquidOccupancy = x として入力する必要があり、x は 0 (専用) と 1 (含む) の間の数字です。
- SolidOccupancy — チャンネル SolidMaterial で指定されたボクセルの材料の占有率。これは 0(空) と 1(満) の間の値であるべきです。
戻り値
コードサンプル
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 配列の Enum.Material. Dimensions は、ボクセルでターゲット領域のサイズと完全に一致する必要があります。
3D ボクセルの占有率の配列 (0 から 1 の数字)。寸法は、ボクセル内のターゲット領域のサイズに正確に一致する必要があります。
戻り値
コードサンプル
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))