Terrain
*Dieser Inhalt wurde mit KI (Beta) übersetzt und kann Fehler enthalten. Um diese Seite auf Englisch zu sehen, klicke hier.
Terrain ermöglicht es Ihnen, dynamisch veränderliche Umgebungen mit wenig bis keiner Verzögerung zu erstellen.Es basiert derzeit auf einem 4×4×4-Gitter von Zellen, in denen jede Zelle eine Zahl zwischen 0 und 1 hat, die darstellt, wie viel die Geometrie die Zelle einnehmen sollte, und das Material der Zelle.Die Besetzung bestimmt, wie sich die Zelle zusammen mit den umliegenden Zellen verändern wird, und das Ergebnis ist die Illusion, keine Netzwerk-Einschränkung zu haben.
Für weitere Informationen, siehe Terrain.
Zusammenfassung
Eigenschaften
Aktiviert oder deaktiviert die Geländedekoration.
Gibt die Länge des animierten Grases an.
MaterialColors repräsentiert den Editor für die Materialfarbenfunktion und kann nicht von Skripten bearbeitet werden .
Um die Farbe eines Materials zu erhalten, verwende: Terrain:GetMaterialColor() Um die Farbe eines Materials festzulegen, verwende: Terrain:SetMaterialColor()
Zeigt die Grenzen der größten möglichen bearbeitbaren Region an.
Die Farbe des Terrainwassers.
Steuert, wie undurchsichtig die Wasserreflexion des Terrains ist.
Die Transparenz des Terrainwassers.
Legt die maximale Höhe der Geländewasserwellen in Stollen fest.
Legt fest, wie oft die Geländewasserwellen pro Minute auf- und abgehen.
Bestimmt, ob ein Teil durch die Physik unbewegbar ist.
Die anguläre Geschwindigkeit der Montagemaschine des Teils.
Das Zentrum der Masse der Montagemaschine des Teils im Platz.
Die lineare Geschwindigkeit der Montagemaschine des Teils.
Die Gesamtmenge der Montagemaske des Teils.
Eine Referenz auf den Wurzelteil der Montagemaschine.
Bestimmt, ob das Teil physisch mit der Audio-Simulation interagieren wird, ähnlich wie CastShadow für Beleuchtung.
Bestimmt die Art der Oberfläche für die Rückseite eines Teils.
Bestimmt die Art der Oberfläche für das untere Gesicht eines Teils.
Bestimmt die Farbe eines Teils.
Bestimmt die Position und Ausrichtung des BasePart in der Welt.
Bestimmt, ob ein Teil mit anderen Teilen kollidieren kann.
Bestimmt, ob das Teil während räumlicher Abfrageoperationen berücksichtigt wird.
Bestimmt, ob Touched und TouchEnded Ereignisse auf der Seite abgefeuert werden.
Bestimmt, ob ein Teil einen Schatten wirft oder nicht.
Beschreibt die Weltposition, in der sich das Zentrum der Masse eines Teils befindet.
Beschreibt den Namen der Gruppeeines Teils.
Bestimmt die Farbe eines Teils.
Zeigt die aktuellen physischen Eigenschaften des Teils an.
Bestimmt mehrere physische Eigenschaften eines Teils.
Wird verwendet, um aerodynamische Kräfte auf Teilen und Montagemaschinen 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 das Vordergesicht eines Teils.
Bestimmt die Art der Oberfläche für das linke Gesicht eines Teils.
Legt einen Multiplikator für BasePart.Transparency fest, der nur für den lokalen Client sichtbar ist.
Bestimmt, ob ein Teil in Studio auswählbar ist.
Beschreibt die Masse des Teils, das Produkt seiner Dichte und Größe.
Bestimmt, ob das Teil zur Gesamtmenge oder zur Inertie seines steifen Körpers beiträgt.
Bestimmt die Textur und die Standardphysikalischen Eigenschaften eines Teils.
Der Name von MaterialVariant.
Beschreibt die Rotation des Teils in der Welt.
Gibt den Versatz des Drehpunkts des Teils von seinem CFrame an.
Beschreibt die Position des Teils in der Welt.
Zeit seit dem letzten aufgezeichneten Physik-Update.
Bestimmt, wie viel ein Teil die Skybox widerspiegelt.
Beschreibt die kleinste Änderung in der Größe, die von der Resize()-Methode zulässig ist.
Beschreibt die Gesichter, auf denen ein Teil skaliert werden kann.
Bestimmt die Art der Oberfläche für die richtige Seite eines Teils.
Die Hauptregel bei der Bestimmung des Wurzelteils einer Montagemaschine.
Die Rotation des Teils in Grad für die drei Achsen.
Bestimmt die Dimensionen eines Teils (Länge, Breite, Höhe).
Bestimmt die Art der Oberfläche für die Vorderseite eines Teils.
Bestimmt, wie viel ein Teil durchgesehen werden kann (das Gegenteil der Part-Opazität).
Methoden
Gibt die Weltposition des Zentrums der Geländezelle (x, y, z) zurück.
Gibt die Position der unteren linken Vorderkante der Gitterzelle (x, y, z) zurück.
Räumt das Terrain ab.
Lagert einen Teil des Terrains in ein TerrainRegion Objekt, damit er später wieder geladen werden kann.Hinweis: TerrainRegion Daten werden zwischen Server und Client nicht repliziert.
Gibt die Anzahl der nicht leeren Zellen im Terrain zurück.
Füllt einen Ball mit glattem Gelände in einem bestimmten Raum.
Füllt einen Block mit glattem Gelände mit einer bestimmten Position, Rotation, Größe und Material.
Füllt einen Zylinder mit glattem Gelände in einem bestimmten Raum.
Füllt einen Region3 Raum mit glattem Gelände.
Füllt ein keilförmiges Volumen des Terrains mit dem angegebenen Enum.Material und dem CFrame und der Größe des Gebiets.
Gibt die aktuelle Geländematerialfarbe für das angegebene Geländematerial zurück.
- IterateVoxelsAsync_beta(region : Region3,resolution : number,channelIds : Array):TerrainIterateOperation
- ModifyVoxelsAsync_beta(region : Region3,resolution : number,channelIds : Array):TerrainModifyOperation
Wendet ein Terrain-Chunk auf das Terrain-Objekt an. Hinweis: TerrainRegion Daten werden zwischen Server und Client nicht repliziert.
Gibt eine Region von Geländevoxeldaten im Tabellenformat zurück, basierend auf den Kanalnamen.
Gibt eine bestimmte Region glattes Terrain im Tabellenformat zurück.
- ReplaceMaterial(region : Region3,resolution : number,sourceMaterial : Enum.Material,targetMaterial : Enum.Material):()
Ersetzt das Terrain eines Materials innerhalb einer Region durch ein anderes Material.
Legt die aktuelle Terrainmaterialfarbe für das angegebene Terrainmaterial fest.
Gibt die Position der Rasterzelle zurück, die den Punkt Position enthält.
Gibt die Position der Gitterzelle zurück, die den Punktpunkt enthält, bevorzugt leere Gitterzellen, wenn die Position an einem Gitterrand ist.
Gibt die Position der Gitterzelle zurück, die den Punktpunkt enthält, bevorzugt nicht leere Gitterzellen, wenn die Position an einem Gitterrand ist.
Legt eine Region des Terrains mit einem Wörterbuch von Voxel-Kanaldaten fest.
Legt eine bestimmte Region glattes Terrains mit Tabellenformat fest.
- WriteVoxelsAsync_beta(region : Region3,resolution : number,channelIds : Array):TerrainWriteOperation
Wenden Sie einen angulären Impuls auf die Montagemaschine an.
Wenden Sie einen Impuls auf die Montagemaschine im Montagemodus center of mass an.
Wenden Sie einen Impuls auf die Montagemaschine an an der angegebenen Position.
Gibt zurück, ob die Teile miteinander kollidieren können.
Überprüft, ob Sie das Netzwerkbesitz eines Teils festlegen können.
Gibt eine Tabelle von Teilen zurück, die mit dem Objekt durch eine starre Verbindung verbunden sind.
Gib alle Gelenke oder Einschränkungen zurück, die mit diesem Teil verbunden sind.
Gibt den Wert der Mass Eigenschaftenzurück.
Gibt den aktuellen Spieler zurück, der der Netzwerkbesitzer dieses Teils ist, oder nil im Falle des Servers.
Gibt wahr zurück, wenn die SpielEngine das Netzwerkbesitzer automatisch für diesen Teil entscheidet.
Gibt das Basisteil einer Montagemaschine von Teilen zurück.
Gibt eine Tabelle aller BasePart.CanCollide Teile zurück, die sich mit diesem Teil überlappen.
Gibt die lineare Geschwindigkeit der Montagemaschine des Teils an der angegebenen Position in Bezug auf dieses Teil zurück.
Gibt wahr zurück, wenn das Objekt mit einem Teil verbunden ist, das es an einer Stelle hält (z. B. ein Anchored Teil), sonst gibt es false zurück.
Ändert die Größe eines Objekts genau wie mit dem Tool.
Setzt den angegebenen Spieler als Netzwerkbesitzer für dieses und alle verbundenen Teile.
Lässt die SpielEngine dynamisch entscheiden, wer die Physik des Teils handhabt (einer der Clients oder der Server).
- IntersectAsync(parts : Instances,collisionfidelity : Enum.CollisionFidelity,renderFidelity : Enum.RenderFidelity):Instance
Erstellt eine neue IntersectOperation aus der überlappenden Geometrie des Teils und der anderen Teile in dem angegebenen Array.
- SubtractAsync(parts : Instances,collisionfidelity : Enum.CollisionFidelity,renderFidelity : Enum.RenderFidelity):Instance
Erstellt ein neues UnionOperation vom Teil, minus die Geometrie, die von den Teilen im angegebenen Array besetzt wird.
- UnionAsync(parts : Instances,collisionfidelity : Enum.CollisionFidelity,renderFidelity : Enum.RenderFidelity):Instance
Erstellt ein neues UnionOperation vom Teil plus die Geometrie, die von den Teilen im angegebenen Array besetzt wird.
Holt den Pivot eines PVInstance .
Verwandelt die PVInstance zusammen mit all ihren Nachkommen PVInstances, so dass der Pivot jetzt an der angegebenen CFrame position ist.
Ereignisse
Ereignisse von BasePart übernommenFeuert, wenn ein Teil aufgrund einer physischen Bewegung aufhört, ein anderes Teil zu berühren.
Feuert, wenn ein Teil aufgrund einer physischen Bewegung einen anderen Teil berührt.
Eigenschaften
Decoration
Aktiviert oder deaktiviert derzeit animiertes Gras auf dem Gras -Terrainmaterial, obwohl zukünftige Änderungen dieser Eigenschaft zusätzliche dekorative Merkmale steuern können.
GrassLength
Gibt die Länge des animierten Grases auf dem Gras -Terrainmaterial 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 Materialfarbenfunktion und kann nicht von Skripten bearbeitet werden .
Um die Farbe eines Materials zu erhalten, verwende: Terrain:GetMaterialColor()
Um die Farbe eines Materials festzulegen, verwende: Terrain:SetMaterialColor()
WaterWaveSize
Legt die maximale Höhe der Geländewasserwellen in Stollen fest. Dies ist derzeit auf zwischen 0 und 1 beschränkt.
WaterWaveSpeed
Legt fest, wie oft die Geländewasserwellen pro Minute auf- und absteigen. Dies ist derzeit auf zwischen 0 und 100 beschränkt.
Methoden
CellCenterToWorld
Gibt die Weltposition des Zentrums der Geländezelle (x, y, z) zurück.
Parameter
Rückgaben
CellCornerToWorld
Gibt die Position der unteren linken Vorderkante der Gitterzelle (x, y, z) zurück.
Parameter
Rückgaben
Clear
Räumt das Terrain ab.
Rückgaben
ClearVoxelsAsync_beta
Parameter
Rückgaben
CopyRegion
Lagert einen Teil des Terrains in ein TerrainRegion Objekt, damit er später wieder geladen werden kann.Hinweis: TerrainRegion Daten werden zwischen Server und Client nicht repliziert.
Parameter
Rückgaben
Code-Beispiele
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
Füllt einen Ball mit glattem Gelände in einem bestimmten Raum.
Parameter
Die Position des Zentrums des Terrainballs.
Der Radius in Klötzen des Geländeballs.
Die Enum.Material des Geländeballs.
Rückgaben
Code-Beispiele
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
Füllt einen Block mit glattem Gelände mit einer bestimmten Position, Rotation, Größe und Material.
Parameter
Die Position und Ausrichtung des Geländeblocks.
Die Größe in Studs des quadratischen Blocks - sowohl die Höhe als auch die Breite.
Die Enum.Material des Geländeblocks.
Rückgaben
FillCylinder
Füllt einen Zylinder mit glattem Gelände in einem bestimmten Raum. Der Raum wird mit einem CFrame, Höhe und Radius definiert.
local Workspace = game:GetService("Workspace")Workspace.Terrain:FillCylinder(CFrame.new(0, 50, 0), 5, 30, Enum.Material.Asphalt)
Parameter
Die Position und Ausrichtung des Geländezylinders.
Die Höhe in Stollen des Geländezylinders.
Der Radius in Klötzen des Geländezylinders.
Die Enum.Material des Geländezylinders.
Rückgaben
FillRegion
Füllt einen Region3 Raum mit glattem Gelände.
Parameter
Rückgaben
FillWedge
füllt ein keilförmiges Volumen von mit dem angegebenen und der Größe und dem Bereich der Zone.Die Ausrichtung des Keils ist gleich wie eine entsprechende WedgePart .
Parameter
Die Position und Ausrichtung des Keils zum Ausfüllen.
Die Größe des Keils zum Ausfüllen.
Das Material, mit dem der Keil gefüllt wird.
Rückgaben
GetMaterialColor
Gibt die aktuelle Geländematerialfarbe für das angegebene Geländematerial zurück.
Parameter
Rückgaben
IterateVoxelsAsync_beta
Parameter
Rückgaben
ModifyVoxelsAsync_beta
Parameter
Rückgaben
PasteRegion
Wendet ein Terrain-Chunk auf das Terrain-Objekt an. Hinweis: TerrainRegion Daten werden zwischen Server und Client nicht repliziert.
Parameter
Rückgaben
Code-Beispiele
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
Gibt eine Region von Geländevoxeldaten im Tabellenformat zurück, basierend auf den Kanalnamen.
Parameter
Zielregion zum Lesen. Muss mit dem Voxel-Gitter ausgerichtet sein. Wirft einen Fehler, wenn die Region zu groß ist; die Begrenzung beträgt derzeit 4194304 Voxel³.
Voxel-Auflösung. Muss 4 sein.
Array von Kanal-IDs (Schnüren), die vom Voxel-Daten abgerufen werden müssen.Jede Kanal-ID repräsentiert eine Art von Daten, die in Voxel gespeichert wird.Derzeit unterstützte IDs sind {"SolidMaterial", "SolidOccupancy", "LiquidOccupancy"}.
Rückgaben
Gibt Voxeldaten als ein Wörterbuch zurück, basierend auf der Eingabe channelIds. Schlüssel repräsentieren jede Kanal-ID mit ihrem jeweiligen Wert als Array von 3D-Daten.
- SolidMaterial — Das Enum.Material Material des Voxels.Beachte, dass Water nicht mehr unterstützt wird; stattdessen wird ein Voxel, das Wasser enthält, einen Wert von LiquidOccupancy haben.
- SolidOccupancy — Die Besetzung des Materials des Voxels, wie in dem Kanal SolidMaterial angegeben. Dies ist ein Wert zwischen 0 (leer) und 1 (voll).
Das Wörterbuch enthält auch einen Size-Schlüssel mit einem Wert, der die 3D-Arraygröße von jedem Kanaldaten darstellt.
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
Gibt eine bestimmte Region glattes Terrain im Tabellenformat zurück.
Parameter
Zielregion zum Lesen. Muss mit dem Voxel-Gitter ausgerichtet sein. Wirft einen Fehler, wenn die Region zu groß ist. Die Grenze ist derzeit 4194304 Voxel^3.
Voxel-Auflösung. Muss 4 sein.
Rückgaben
Gibt rohe Voxel-Daten als zwei 3D-Arrays zurück.
- materials - 3D-Matrix von Enum.Material aus dem Zielbereich. Enthält auch ein Größenfeld, das den Dimensionen der verschachtelten Arrays entspricht.
- occupancies - 3D-Matrix der Belegungswerte aus dem Zielbereich. Enthält auch ein Größenfeld, das den Dimensionen der verschachtelten 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 -- Gleich wie Besetzungen.Größe
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)
ReadVoxelsAsync_beta
Parameter
Rückgaben
ReplaceMaterial
ReplaceMaterial ersetzt das Terrain eines bestimmten Enum.Material innerhalb eines Region3 mit einem anderen Material.Im Wesentlichen ist es eine Find-and-Replace-Operation auf Terrain Materialien.
Einschränkungen
Wenn diese Methode aufgerufen wird, muss der resolution-Parameter genau 4 sein.Zusätzlich muss die Region3 mit dem Geländematerialgitter ausgerichtet werden, d.h.die Komponenten der Mindest- und Höchstpunkte der Region3 müssen durch 4 teilbar sein.Verwende Region3:ExpandToGrid(), um eine Region kompatibel mit dieser Funktion zu machen.
Parameter
Die Region, in der die Ersetzungsoperation stattfinden wird.
Die Auflösung, bei der die Ersetzungsoperation stattfinden wird; im Moment muss es genau 4 sein.
Das alte Material, das ersetzt werden soll.
Das neue Material.
Rückgaben
Code-Beispiele
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
Legt die aktuelle Terrainmaterialfarbe für das angegebene Terrainmaterial fest. Das Terrainmaterial wird seine Basisfarbe in Richtung der angegebenen Farbe verschieben.
Parameter
Rückgaben
WorldToCell
Gibt die Position der Rasterzelle zurück, die den Punkt Position enthält.
Parameter
Rückgaben
WorldToCellPreferEmpty
Gibt die Position der Gitterzelle zurück, die den Punktpunkt enthält, bevorzugt leere Gitterzellen, wenn die Position an einem Gitterrand ist.
Parameter
Rückgaben
WorldToCellPreferSolid
Gibt die Position der Gitterzelle zurück, die den Punktpunkt enthält, bevorzugt nicht leere Gitterzellen, wenn die Position an einem Gitterrand ist.
Parameter
Rückgaben
WriteVoxelChannels
Legt eine Region des Terrains mit einem Wörterbuch von Voxel-Kanaldaten fest.
Parameter
Zielregion, an die geschrieben werden muss. Muss sich an das Voxel-Gitter anpassen. Wird einen Fehler werfen, wenn die Region zu groß ist; die Begrenzung beträgt derzeit 4194304 Voxel³.
Voxel-Auflösung. Muss 4 sein.
Wörterbuch von Voxel-Daten ähnlich wie die Rückgabewert von ReadVoxelChannels().Schlüssel repräsentieren jede Kanal-ID mit ihrem jeweiligen Wert als Array von 3D-Daten.Das Wörterbuch kann einzelne oder mehrere Kanaleingänge unterstützen.
- SolidMaterial — Das Enum.Material Material des Voxels.Beachten Sie, dass Water nicht mehr unterstützt wird; stattdessen sollte ein Voxel, das nur Wasser enthält, als SolidMaterial = Enum.Material.Air, LiquidOccupancy = x eingegeben werden, wo x eine Zahl zwischen 0 (exklusiv) und 1 (inklusiv) ist.
- SolidOccupancy — Die Besetzung des Materials des Voxels, wie in dem Kanal SolidMaterial angegeben. Dies sollte ein Wert zwischen 0 (leer) und 1 (voll) sein.
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
Legt eine bestimmte Region glattes Terrains mit Tabellenformat fest.
Parameter
Zielregion, zu der geschrieben werden muss. Muss sich an das Voxel-Gitter anpassen. Wirft einen Fehler, wenn die Region zu groß ist.
Voxel-Auflösung. Muss 4 sein.
3D- Array von Enum.Material. Dimensionen müssen genau der Größe der Zielregion in Voxelen entsprechen.
3D-Matrix der Voxelbesetzungen (Zahl zwischen 0 und 1). Die Dimensionen müssen genau der Größe der Zielregion in Voxeln entsprechen.
Rückgaben
Code-Beispiele
Beispiel
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))