Terrain
*Dieser Inhalt wurde mit KI (Beta) übersetzt und kann Fehler enthalten. Um diese Seite auf Englisch zu sehen, klicke hier.
Mit Terrain kannst du dynamisch verwandbare Umgebungen mit wenig bis gar kein Verzögerung erzeugen. Es basiert derzeit auf einer 4×4×4-Gitter von Zellen, in der jede Zelle eine Zahl zwischen 0 und 1 hat, die repräsentiert, wie viel die Geometrie die Zelle einnehmen soll und das Material der Zelle. Die Besetzung bestimmt, wie die Zelle zusammen mit den umgebenden Zellen verwandelt wird, und das Ergebnis ist die Illusion, keine Gitter Beschränkungzu haben.
For more information, see Terrain .
Zusammenfassung
Eigenschaften
Aktiviert oder deaktiviert Terrain-Decoration.
Gibt die Länge des animierten Grasses an.
MaterialColors repräsentiert den Editor für die Materialfarbe-Funktion, und kann nicht von Skripten bearbeitet werden .
Um die Farbe eines Materials zu erhalten, verwenden Sie: Terrain:GetMaterialColor() Um die Farbe eines Materials zu setzen, verwenden Sie: Terrain:SetMaterialColor()
Zeigt die Grenzen der größten bearbeitbaren Region an.
Die Farbe des Terrain-Wassers.
Steuert, wie undurchsichtig die Wasserreflexionen des Terrains sind.
Die Transparenz der Geländewasser.
Setzt die maximale Höhe der Terrain-Wasserwellen in Studs.
Setzt die Anzahl der Terrain-Wasserwellen pro Minute, die nach oben und unten bewegen.
Bestimmt, ob ein Teil auf physikalische Weise unbewegbar ist.
Die angelicale Geschwindigkeit der Montagemaschine.
Die Mitte der Masse der Montagemaschine im Platz.
Die lineare Geschwindigkeit der Montagemaschine.
Die Gesamtmenge der Montagemaschine.
Eine Verweis auf den Wurzelteil der Konfiguration.
Bestimmt die Art der Oberfläche für die Rückseite eines Teils (+Z-Richtung).
Bestimmt die Art der Oberfläche für das Untergesicht eines Teils (-Y-Richtung).
Bestimmt die Farbe eines Teils.
Bestimmt die Position und Ausrichtung der BasePart in der Welt.
Bestimmt, ob ein Teil mit anderen Teilen kollidieren kann.
Bestimmt, ob das Teil während der räumlichen Anfrage-Operationen betrachtet wird.
Bestimmt, ob Touched und TouchEnded Ereignisse auf der Teil abgefeuert werden.
Bestimmt, ob ein Teil einen Schatten wirft oder nicht.
Beschreibt die Weltposition, in der sich der Zentrum eines Teils befindet.
Beschreibt die Name einer Gruppe.
Bestimmt die Farbe eines Teils.
Zeigt die aktuellen physischen Eigenschaften des Teils an.
Bestimmt mehrere physikalische Eigenschaften eines Teils.
Wird verwendet, um aerodynamische Kräfte auf Teile und Montagen zu aktivieren oder zu deaktivieren.
Die tatsächliche physische Größe des BasePart als von der Physik-Engine betrachtet.
Bestimmt die Art der Oberfläche für die Vorderseite eines Teils (-Z-Richtung).
Bestimmt die Art der Oberfläche für die linke Seite eines Teils (-X-Richtung).
Bestimmt einen Multiplikator für BasePart.Transparency, der nur für den lokalen Client sichtbar ist.
Bestimmt, ob ein Teil in Studio auswählbar ist.
Beschreibt die Masse der Teil, das Produkt seiner Dichte und Volumen.
Bestimmt, ob der Teil zur Gesamtmenge oder zur Inaktivität seines Festen Körpers beiträgt.
Bestimmt die Textur und die Standard- physischen Eigenschaften eines Teils.
Der Name von MaterialVariant .
Beschreibt dieRotation der Teil in der Welt.
Gibt den Versatz des Teils von seinem CFrame .
Beschreibt die Position der Teil in der Welt.
Zeit seit dem letzten aufgezeichneten Physik-Update.
Bestimmt, wie viel ein Teil den Himmelskasten widerspiegelt.
Beschreibt die kleinste Größenänderung, die durch die Größenanpassungsmethode erlaubt ist.
Beschreibt die Gesichter, auf denen ein Teil skaliert werden kann.
Bestimmt die Art der Oberfläche für die rechte Seite eines Teils (+X-Richtung).
Die Hauptregel bei der Bestimmung des Hauptteils einer Konfiguration.
DieRotation der Teil in Grad für die drei Achsen.
Bestimmt die Dimensionen eines Teils (Länge, Breite, Höhe).
Bestimmt die Oberflächenart für die obere Gesichtseite eines Teils (+ Y-Richtung).
Bestimmt, wie viel ein Teil durch (den Umkehrwert der Teil-Opakez) gesehen werden kann.
Methoden
Gibt die Weltposition der Mitte der Geländezelle zurück (x, y, z).
Rückgibt die Position der unteren linken-vorwärts-Ecke des Netzwerks (x, y, z).
Löscht das Gelände.
Speichert einen Teil des Terrains in einem TerrainRegion -Objekt, sodass er später wieder geladen werden kann. Beachten Sie: TerrainRegion -Daten werden nicht zwischen dem Server und dem Client repliziert.
Kehre die Anzahl der nicht leeren Zellen im Terrain zurück.
Füllt einen Ball mit glattem Terrain in einem bestimmten Platz.
Füllt einen Block mit glattem Terrain mit einer bestimmten Position, Rotation, Größe und Material.
Füllt einen Zylinder mit glattem Terrain in einem bestimmten Platz.
Füllt einen Region3-Raum mit glattem Gelände.
Füllt einen Keil mit Terrain mit dem gegebenen Enum.Material und der CFrame und Größe des Bereichs.
Gibt die aktuelle Gelbfarbe für spezifisches Gelände zurück.
Apply aChunk of Terrain to the Terrain Objekt. Note: TerrainRegion data does not replicate between server and client.
Kehre ein Region von Terrain-Voxel-Daten in Tabelle-Form basierend auf Kanal-Namen zurück.
Kehre ein bestimmtes Region von glattem Terrain in Tabelle format zurück.
- ReplaceMaterial(region : Region3,resolution : number,sourceMaterial : Enum.Material,targetMaterial : Enum.Material):void
Ersetzt das Terrain eines Materials innerhalb einer Region durch ein anderes Material.
Setzt die aktuelle Gelbemтериалfarbe für bestimmtes Gelände.
Rückgibt die Rasterzellen-Position, die den Punkt Position enthält.
Kehre die Position der Rasterzelle zurück, die die Position des Punkts enthält, und bevorzuge leere Rasterzellen, wenn die Position auf einer Rasterkante ist.
Kehre die Rasterzelle zurück, die die Position anzeigt, wobei nicht leere Rasterzellen bevorzugt werden, wenn die Position auf einem Rasterkante ist.
Setzt einen Region des Terrains mit einer Voxel-Kanal-Daten-Diktion.
Setzt einen bestimmten Bereich des glatten Terrains mit dem Tabelle format.
Wenden Sie einen angulären Impuls auf die Montagemaschine an.
Apply an impulse to the assembly at theAssembly's center of mass .
Geben Sie einem Montageimpuls die erforderliche Position.
Gibt zurück, ob die Teile miteinander kollidieren können.
Überprüft, ob du das Netzwerkbesitz einer Teil so einstellen kannst, dass es sich.
Gibt eine Tabelle von Teilen zurück, die mit dem Objekt durch eine beliebige Art von Verbindungverbunden sind.
Kehre alle Joints oder Einschränkungen zurück, die mit dieser Teil verbunden sind.
Kehrt den Wert der Mass Eigenschaftenzurück.
Gibt den aktuellen Spieler zurück, der der Netzwerk-Eigentümer dieses Teils ist, oder null in Falle des Servers.
Kehrt wahr zurück, wenn die Spielmaschine die Netzwerkbesitzer automatisch für diesen Teil festgelegt hat.
Rückgibt die Basis eines Teile montierens.
Gibt eine Tabelle zurück, in der alle BasePart.CanCollide wahren Teile, die mit dieser Teil intersect.
Gibt die lineare Geschwindigkeit der Montage des Teils an der angegebenen Position in Bezug auf diesen Teil zurück.
Gibt zurück, wenn das Objekt mit einem Teil verbunden ist, das es an Ort hält (z. B. eine Anchored Part), oder anders zurückgegeben wird.
Ändert die Größe eines Objekts genau wie mit dem Tool.
Setzt den angegebenen Spieler als Netzwerk-Eigentümer für dies und alle verbundenen Teile.
Lässt die SpielEngine dynamisch entscheiden, wer die Physik der Teile (eines der Clients oder des Servers) verantwortet.
- IntersectAsync(parts : Instances,collisionfidelity : Enum.CollisionFidelity,renderFidelity : Enum.RenderFidelity):Instance
Erstellt eine neue IntersectOperation von der überlappenden Geometrie des Teils und den anderen Teilen in der angegebenen Array.
- SubtractAsync(parts : Instances,collisionfidelity : Enum.CollisionFidelity,renderFidelity : Enum.RenderFidelity):Instance
Erstellt einen neuen UnionOperation von der Abteilung, minus die Geometrie, die von den Teilen in der angegebenen Arraybesetzt ist.
- UnionAsync(parts : Instances,collisionfidelity : Enum.CollisionFidelity,renderFidelity : Enum.RenderFidelity):Instance
Erstellt einen neuen UnionOperation von der Teil, plus die Geometrie, die von den Teilen in der angegebenen Arraybelegt ist.
Erhalten Sie die Ausrichtung einer PVInstance.
Transformiert die PVInstance zusammen mit all ihren Nachkommen PVInstances, wodurch der Pivot jetzt an der angegebenen CFrame liegt.
Ereignisse
Ereignisse von BasePart übernommenFeuert ab, wenn ein Teil aufgrund einer physischen Bewegung ein anderes Teil berührt.
Feuert ab, wenn ein Teil eine andere Teil berührt als Ergebnis einer physischen Bewegung.
Eigenschaften
Decoration
Aktiviert derzeit entweder animierten Gras auf dem Gras Gelände-Material, oder deaktiviert es, obwohl zukünftige Änderungen dieser Eigenschaft zusätzliche dekorative Funktionen steuern können.
GrassLength
Gibt die Länge des animierten Grases auf dem Grass Terrain-Material an, unter der Annahme, dass Decoration aktiviert ist. Gültige Werte liegen zwischen 0,1 und 1.
MaterialColors
MaterialColors repräsentiert den Editor für die Materialfarbe-Funktion, und kann nicht von Skripten bearbeitet werden .
Um die Farbe eines Materials zu erhalten, verwenden Sie: Terrain:GetMaterialColor()
Um die Farbe eines Materials zu setzen, verwenden Sie: Terrain:SetMaterialColor()
WaterWaveSize
Setzt die maximale Höhe der Geländewassers Wellen in Studs. Dies ist derzeit auf zwischen 0 und 1 eingeschränkt.
WaterWaveSpeed
Setzt die Anzahl der Terrain-Wasserwellen pro Minute, die sich nach oben und unten bewegen. Dies ist derzeit auf zwischen 0 und 100 beschränkt.
Methoden
CellCenterToWorld
Gibt die Weltposition der Mitte der Geländezelle zurück (x, y, z).
Parameter
Rückgaben
CellCornerToWorld
Rückgibt die Position der unteren linken-vorwärts-Ecke des Netzwerks (x, y, z).
Parameter
Rückgaben
Clear
Löscht das Gelände.
Rückgaben
CopyRegion
Speichert einen Teil des Terrains in einem TerrainRegion -Objekt, sodass er später wieder geladen werden kann. Beachten Sie: TerrainRegion -Daten werden nicht zwischen dem Server und dem Client repliziert.
Parameter
Rückgaben
Code-Beispiele
local terrainRegion = workspace.Terrain:CopyRegion(workspace.Terrain.MaxExtents)
workspace.Terrain:Clear()
task.wait(5)
workspace.Terrain:PasteRegion(terrainRegion, workspace.Terrain.MaxExtents.Min, true)
FillBall
Füllt einen Ball mit glattem Terrain in einem bestimmten Platz.
Parameter
Die Position des Zentrums des Terrain-Balls.
Der Radius in Studs der Terrain-Kugel.
Die Enum.Material des Terrain-Balls.
Rückgaben
Code-Beispiele
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
Füllt einen Block mit glattem Terrain mit einer bestimmten Position, Rotation, Größe und Material.
Parameter
Das cframe (Position und Ausrichtung) des Blöcke.
Die Größe in Studs des Quadrat-Blocks - sowohl die Höhe als auch die Breite.
Die Enum.Material des Blöcke.
Rückgaben
FillCylinder
Füllt einen Zylinder mit glattem Terrain in einem bestimmten Platz. Der Raum wird mit einem CFrame, einer Höhe und einem Radius definiert.
Verwendung
workspace.Terrain:FillCylinder(CFrame.new(0, 50, 0), 5, 30, Enum.Material.Asphalt)
Parameter
Die CFrame (Position und Ausrichtung) des Terrain-Zylinders.
Die Höhe in Studs des Terrain-Zylinders.
Der Radius in Studs des Terrain-Zylinders.
Die Enum.Material des Terrain-Zylinders.
Rückgaben
FillWedge
FillWedge() füllt einen Keil-Volumen von Terrain mit dem gegebenen Enum.Material und dem Bereichs- 0> Datatype.CFrame0> und der Größe. Die Ausrichtung des Keils ist die gleiche wie ein entsprechendes FillWedge()3>.
Parameter
Die Position und Ausrichtung des Keils zum Füllen.
Die Größe des Keils, der gefüllt werden soll.
Das Material, mit dem der Keil gefüllt wird.
Rückgaben
GetMaterialColor
Gibt die aktuelle Gelbemaske für das angegebene Gelände zurück.
Parameter
Rückgaben
PasteRegion
Apply aChunk of Terrain to the Terrain Objekt. Note: TerrainRegion data does not replicate between server and client.
Parameter
Rückgaben
Code-Beispiele
--[[
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
Kehre ein Region von Terrain-Voxel-Daten in Tabelle-Form basierend auf Kanal-Namen zurück.
Parameter
Zielregion, von der du lesen kannst. Muss in Richtung des Voxel-Rasters ausgerichtet sein. Wird mit einem Fehler geworfen, wenn die Region zu groß ist; das Limit beträgt derzeit 4194304 Voxel³.
Voxel-Auflösung. Muss 4 sein.
Array von Kanal-IDs (Strings), die von den Voxel-Daten aus zugänglich sein müssen. Jeder Kanal-ID repräsentiert einen Typ von Daten, der in Voxel gespeichert ist. Aktuell unterstützte IDs sind {"SolidMaterial", "SolidOccupancy", "LiquidOccupancy"} , "SolidOccupancy" und "LiquidOccupancy" .
Rückgaben
Rückgibt Voxel-Daten als Wörterbuch basierend auf der channelIds -Eingabe. Schlüssel repräsentieren jeden Kanal-ID mit ihrem jeweiligen Wert als Matrix 3D-Daten.
- SolidMaterial — Das Material der Enum.Material des Voxels. Beachten Sie, dass Water nicht mehr unterstützt wird; stattdessen hat ein Voxel, der Wasser enthält, einen Wert von 0> LiquidOccupancy0> .
- SolidOccupancy — Die Besetzung des Materials des Voxels, wie in dem SolidMaterial-Kanal angegeben. Dies ist ein Wert zwischen 0 (leer) und 1 (voll).
- LiquidOccupancy — gibt die Besetzung des Water-Materials in einem Voxel als Wert zwischen 0 (kein Wasser) und 1 (voller Wasser) an. Wenn die SolidOccupancy 1 und die 0> SolidMaterial0> nicht sind, wird dies 0
Das Wörterbuch enthält auch einen Size-Schlüssel mit einem Wert, der die 3D-Matrixgröße jedes Kanaldatums repräsentiert.
Code-Beispiele
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
Kehre ein bestimmtes Region von glattem Terrain in Tabelle format zurück.
Parameter
Zielregion, von der gelesen werden kann. Muss in Richtung des Voxel-Rasters ausgerichtet sein. Wird ein Fehler geworfen, wenn die Region zu groß ist. Das Limit beträgt derzeit 4194304 Voxel^3.
Voxel-Auflösung. Muss 4 sein.
Rückgaben
Rückgibt rohe Voxel-Daten in zwei 3D-Arrays.
- materials - 3D-Matrix von Enum.Material aus der Zielbereich. Enthält auch ein Größenfeld, das der Größen der verschachtelten Arrays entspricht.
- occupancies - 3D-Matrix der Besetzungswerte aus der Zielbereich. Enthält auch ein Feld der Größe, das der Größe der in der Endlichkeit geordneteten Arrays entspricht.
Code-Beispiele
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 ersetzt das Terrain eines bestimmten Enum.Material innerhalb eines Region3 mit einem anderen Material. Es ist im Grunde eine Find-and-Replace-Operation auf Terrain-Materialien.
Beschränkungen
Wenn Sie diesen Methoden aufrufen, muss der resolution-Parameter genau 4 sein. Darüber hinaus muss der Region3-Knoten auf das Terrain-Material-Netz ausgerichtet sein, d.h. die Komponenten der Region3's minimum und maximalen Punkte müssen durch 4 aufgeteilt werden. Verwenden Sie Region3:ExpandToGrid(), um eine Region mit dieser Funktion kompatibel zu machen.
Parameter
Die Region, in der die Ersetzung Operation auftreten.
Die Auflösung, bei der die Ersetzungsbetriebs Ortwird; Im Moment muss dies genau 4 sein.
Das alte Material, das ersetzt werden soll.
Das neue Material.
Rückgaben
Code-Beispiele
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
Setzt die aktuelle Geländematerialfarbe für bestimmtes Geländematerial. Das Geländematerial wird seine Basisfarbe in Richtung bestimmter Farbe verschieben.
Parameter
Rückgaben
WorldToCell
Rückgibt die Rasterzellen-Position, die den Punkt Position enthält.
Parameter
Rückgaben
WorldToCellPreferEmpty
Kehre die Position der Rasterzelle zurück, die die Position des Punkts enthält, und bevorzuge leere Rasterzellen, wenn die Position auf einer Rasterkante ist.
Parameter
Rückgaben
WorldToCellPreferSolid
Kehre die Rasterzelle zurück, die die Position anzeigt, wobei nicht leere Rasterzellen bevorzugt werden, wenn die Position auf einem Rasterkante ist.
Parameter
Rückgaben
WriteVoxelChannels
Setzt einen Region des Terrains mit einer Voxel-Kanal-Daten-Diktion.
Parameter
Zielregion, auf die geschrieben werden soll. Muss mit dem Voxel-Raster in Einklang stehen. Wird einen Fehler anzeigen, wenn die Region zu groß ist; das Limit beträgt derzeit 4194304 Voxel³.
Voxel-Auflösung. Muss 4 sein.
Wörterbuch von Voxel-Daten ähnlich dem Rückgabewert von ReadVoxelChannels() . Die Schlüssel repräsentieren jeden Kanal-ID mit ihrem jeweiligen Wert als Arrangement von 3D-Daten. Das Wörterbuch kann einzelne oder mehrere Kanal-Eingaben unterstützen.
- SolidMaterial — Das Material der Enum.Material des Voxels. Beachten Sie, dass Water nicht mehr unterstützt wird; stattdessen sollte ein Voxel, der nur Wasser enthält, als 0> SolidMaterial = Enum.Material.Air, LiquidOccupancy = x
- SolidOccupancy — Die Besetzung des Materials des Voxels, wie in dem SolidMaterial Kanal angegeben. Dies sollte ein Wert zwischen 0 (leer) und 1 (voll) sein.
- LiquidOccupancy — gibt die Besetzung des Water-Materials in einem Voxel als Wert zwischen 0 (kein Wasser) und 1 (voller Wasser) an. Wenn die SolidOccupancy 1 und die 0> SolidMaterial0> nicht sind, wird dies 0
Rückgaben
Code-Beispiele
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
Setzt einen bestimmten Bereich des glatten Terrains mit dem Tabelle format.
Parameter
Zielregion, auf die geschrieben werden soll. Muss in das Voxel-Netzwerk ausgerichtet sein. Wird einen Fehler werfen, wenn die Region zu groß ist.
Voxel-Auflösung. Muss 4 sein.
3D-Matrix von Enum.Material. Dimensionen müssen genau der Größe der Zielregion in Voxeln entsprechen.
3D-Matrix von Voxel-Belegungen (Nummer zwischen 0 und 1). Dimensionen müssen genau der Größe der Zielregion in Voxeln entsprechen.
Rückgaben
Code-Beispiele
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))