EditableMesh

Visualizza obsoleti

*Questo contenuto è tradotto usando AI (Beta) e potrebbe contenere errori. Per visualizzare questa pagina in inglese, clicca qui.

Non costruibile

EditableMesh cambia la mesh visiva applicata quando viene collegata a un MeshPart, consentendo la query e la modifica della mesh sia in Studio che nell'esperienza.

Abilitazione delle esperienze pubblicate

Per scopi di sicurezza, l'uso di EditableMesh fallisce per impostazione predefinita per le esperienze pubblicate.Per abilitare l'uso, devi essere verificato l'età 13+ e l'ID verificato.Dopo essere stato verificato, apri le Impostazioni di gioco di Studio, seleziona Sicurezza , e abilita il pulsante Consenti API mesh/immagine toggle.

Permessi

Per prevenire l'uso improprio, AssetService:CreateEditableMeshAsync() consentirà solo di caricare e modificare le risorse di mesh:

  • Che sono di proprietà del creatore dell'esperienza (se l'esperienza è di proprietà di un individuo).
  • Che sono di proprietà di un gruppo (se l'esperienza è di proprietà del gruppo).
  • Che sono di proprietà dell'utente Studio registrato (se il file del luogo non è stato ancora salvato o pubblicato su Roblox).

Limiti di memoria

Le risorse modificabili sono attualmente costose per l'utilizzo della memoria.Per minimizzare il suo impatto sulle prestazioni del client, EditableMesh ha rigide budget di memoria lato client, anche se il server, Studio e i plugin operano con memoria illimitata.L'utilizzo di FixedSize può aiutarti a rimanere entro il budget di memoria e, in alcuni scenari, il collegamento di uno EditableMesh a più MeshParts (multiriferimento) può aiutare con l'ottimizzazione della memoria.

Creazione e Visualizzazione

Un EditableMesh può essere creato da un esistente Content di un MeshPart o un ID mesh utilizzando AssetService:CreateEditableMeshAsync() , o un vuoto EditableMesh può essere creato con AssetService:CreateEditableMesh() .Può quindi essere visualizzato, modificato e aggiornato il suo modello di collisione.Non tutti i passaggi sono necessari; per esempio, potresti voler creare un EditableMesh solo per raycast senza mai visualizzarlo.


local AssetService = game:GetService("AssetService")
-- Crea mesh modificabile vuoto
local editableMesh = AssetService:CreateEditableMesh()
-- Crea EditableMesh dall'ID risorsa
local editableMeshFromAsset = nil
local success, errorMessage = pcall(function()
editableMeshFromAsset = AssetService:CreateEditableMeshAsync(Content.fromAssetId(ASSET_ID))
end)
-- Crea EditableMesh da un altro EditableMesh
local editableMeshFromAnother = nil
local success, errorMessage = pcall(function()
editableMeshFromAnother = AssetService:CreateEditableMeshAsync(Content.fromObject(OTHER_EDITABLE_MESH))
end)
-- Crea EditableMesh dalla MeshPart
local editableMeshFromMeshPart = nil
local success, errorMessage = pcall(function()
editableMeshFromMeshPart = AssetService:CreateEditableMeshAsync(MESH_PART.MeshContent)
end)

Un EditableMesh viene visualizzato quando è collegato a un nuovo MeshPart , attraverso AssetService:CreateMeshPartAsync() .Puoi creare più istanze che fanno riferimento alla stessa , o link a un'esistente attraverso .


local AssetService = game:GetService("AssetService")
local Workspace = game:GetService("Workspace")
-- Crea EditableMesh dall'ID risorsa
local editableMeshFromAsset = nil
local success, errorMessage = pcall(function()
editableMeshFromAsset = AssetService:CreateEditableMeshAsync(Content.fromAssetId(ASSET_ID))
end)
-- Crea una nuova MeshPart collegata all'EditableMesh
local newMeshPart = nil
local success, errorMessage = pcall(function()
newMeshPart = AssetService:CreateMeshPartAsync(Content.fromObject(editableMeshFromAsset))
end)
-- In alternativa, collega la nuova MeshPart creata sopra a una MeshPart esistente
local existingMeshPart = Workspace:FindFirstChild("EXISTING_MESH_PART")
existingMeshPart:ApplyMesh(newMeshPart)

Per ricalcolare la collisione e la geometria fluida dopo l'editing, puoi nuovamente chiamare AssetService:CreateMeshPartAsync() e MeshPart:ApplyMesh() per aggiornare un MeshPart esistente.Si consiglia generalmente di farlo alla fine di un'edizione concettuale, non dopo singole chiamate a metodi che manipolano la geometria.I cambiamenti visivi della mesh verranno sempre riflessi immediatamente dal motore, senza la necessità di chiamare AssetService:CreateMeshPartAsync() .

Maglie di dimensione fissa

Durante la creazione di una EditableMesh da una risorsa mesh esistente (via AssetService:CreateEditableMeshAsync() ), la mesh risultante è predefinita di dimensioni fisse.Le maglie di dimensione fissa sono più efficienti in termini di memoria, ma non puoi cambiare il numero di vertici, facce o attributi.Solo i valori degli attributi di vertex e delle posizioni possono essere modificati.


local AssetService = game:GetService("AssetService")
-- Crea EditableMesh senza predefinito di dimensione fissa
local editableMeshFromAsset = nil
local success, errorMessage = pcall(function()
editableMeshFromAsset = AssetService:CreateEditableMeshAsync(Content.fromAssetId(ASSET_ID), {FixedSize = false})
end)

ID del vertice/viso stabile

Molti EditableMesh prendono vertex , normale , UV , colore e viso ID.Sono rappresentati come interi in Luau ma richiedono una gestione speciale.La principale differenza è che gli ID sono stabili e rimangono gli stessi anche se altre parti della mesh cambiano.Ad esempio, se un EditableMesh ha cinque vertici {1, 2, 3, 4, 5} e rimuovi il vertice 4 , i nuovi vertici saranno {1, 2, 3, 5} .

Nota che gli ID non sono garantiti di essere in ordine e ci possono essere buchi nella numerazione, quindi quando si itera attraverso i vertici o le facce, dovresti iterare attraverso la tabella restituita da GetVertices() o GetFaces() .

Attributi del vertice diviso

Un vertice è un angolo di un volto e si connette topologicamente i volti insieme.I vertici possono avere diversi attributi: posizione, normale, coordinate UV, colore e trasparenza.

A volte è utile per tutti i volti che toccano un vertice utilizzare gli stessi valori di attributo, ma a volte vorrai che i volti diversi utilizzino diversi valori di attributo sullo stesso vertice.Ad esempio, su una sfera liscia, ogni vertice avrà solo un normale singolo.In contrasto, all'angolo di un cubo, il vertice avrà 3 normali diverse (uno per ogni faccia adiacente).Puoi anche avere cuciture nelle coordinate UV o cambiamenti improvvisi nei colori del vertice.

Durante la creazione di facce, ogni vertice predefinito avrà uno di ogni attributo: uno normale, una coordinata UV e un colore/trasparenza.Se vuoi creare una cucitura, dovresti creare nuovi attributi e impostarli sul viso.Ad esempio, questo codice creerà un cubo acuto:


local AssetService = game:GetService("AssetService")
-- Dati 4 ID di vertice, aggiunge un nuovo normale e 2 triangoli, creando un quadrato acuto
local function addSharpQuad(editableMesh, vid0, vid1, vid2, vid3)
local nid = editableMesh:AddNormal() -- Questo crea un ID normale che viene calcolato automaticamente
local fid1 = editableMesh:AddTriangle(vid0, vid1, vid2)
editableMesh:SetFaceNormals(fid1, {nid, nid, nid})
local fid2 = editableMesh:AddTriangle(vid0, vid2, vid3)
editableMesh:SetFaceNormals(fid2, {nid, nid, nid})
end
-- Crea un cubo con bordi incavati tra i 6 lati
local function makeSharpCube()
local editableMesh = AssetService:CreateEditableMesh()
local v1 = editableMesh:AddVertex(Vector3.new(0, 0, 0))
local v2 = editableMesh:AddVertex(Vector3.new(1, 0, 0))
local v3 = editableMesh:AddVertex(Vector3.new(0, 1, 0))
local v4 = editableMesh:AddVertex(Vector3.new(1, 1, 0))
local v5 = editableMesh:AddVertex(Vector3.new(0, 0, 1))
local v6 = editableMesh:AddVertex(Vector3.new(1, 0, 1))
local v7 = editableMesh:AddVertex(Vector3.new(0, 1, 1))
local v8 = editableMesh:AddVertex(Vector3.new(1, 1, 1))
addSharpQuad(editableMesh, v5, v6, v8, v7) -- Davanti
addSharpQuad(editableMesh, v1, v3, v4, v2) -- Indietro
addSharpQuad(editableMesh, v1, v5, v7, v3) -- Sinistra
addSharpQuad(editableMesh, v2, v4, v8, v6) -- Destra
addSharpQuad(editableMesh, v1, v2, v6, v5) -- In basso
addSharpQuad(editableMesh, v3, v7, v8, v4) -- Superiore
editableMesh:RemoveUnused()
return editableMesh
end

Avvolgimento

Le facce mesh hanno un lato frontale e un lato posteriore.Durante il disegno delle maglie, solo la parte anteriore dei volti viene disegnata per impostazione predefinita, anche se puoi cambiare questo impostando la proprietà mesh' DoubleSided a true.

L'ordine dei vertici attorno al viso determina se stai guardando davanti o dietro.La parte anteriore del viso è visibile quando i vertici vanno antiorario intorno ad essa.

Order of the vertices around the face

Posizioni FACS

Le teste animabili utilizzano il Sistema di codifica delle azioni facciali (FACS).Vedi la referenza alle posizioni FACS per informazioni utili quando si usano GetFacsPoses() e metodi simili.

Ogni posa FACS viene specificata da un valore Enum.FacsActionUnit .Per la posa FACS, le ossa virtuali possono ciascuna avere un CFrame che trasforma l'osso iniziale CFrame nella posa di legame della mesh in quella del CFrame per la posa dell'azione dell'unità FACS.Tutti gli osso CFrames sono nello spazio locale della mesh.

Queste pose FACS vengono mescolate insieme durante l'animazione.A volte, il mescolamento delle posizioni di base produce risultati scadenti.In questi casi, puoi annullare la fusione di combinazioni specifiche di pose di base con una posa correttiva che è più piacevole.Una posa correttiva è specificata da 2 o 3 valori Enum.FacsActionUnit correttivi.Come una posa FACS di base, per una posa correttiva, le ossa virtuali possono ciascuna avere un CFrame che trasforma l'iniziale CFrame delle ossa nella posa di legame della mesh nel CFrame per quel FACS correttivo.

Limitazioni

EditableMesh attualmente ha un limite di 60.000 vertici e 20.000 triangoli. Tentare di aggiungere troppi vertici o triangoli causerà un errore.

Sommario

Proprietà

  • Sola Lettura
    Non Replicato
    Sicurezza Roblox
    Lettura Parallela

    Restituisce true se una mesh è di dimensione fissa.

Metodi

Proprietà

FixedSize

Sola Lettura
Non Replicato
Sicurezza Roblox
Lettura Parallela

Metodi

AddColor

Parametri

color: Color3
Valore predefinito: ""
alpha: number
Valore predefinito: ""

Restituzioni

AddNormal

Parametri

normal: Vector3
Valore predefinito: ""

Restituzioni

AddTriangle

Parametri

vertexId0: number
Valore predefinito: ""
vertexId1: number
Valore predefinito: ""
vertexId2: number
Valore predefinito: ""

Restituzioni

AddUV

Parametri

Valore predefinito: ""

Restituzioni

AddVertex

Parametri

Valore predefinito: ""

Restituzioni

Destroy

()

Restituzioni

()

FindClosestPointOnSurface

Parametri

point: Vector3
Valore predefinito: ""

Restituzioni

FindClosestVertex

Parametri

toThisPoint: Vector3
Valore predefinito: ""

Restituzioni

FindVerticesWithinSphere

Parametri

center: Vector3
Valore predefinito: ""
radius: number
Valore predefinito: ""

Restituzioni

GetAdjacentFaces

Parametri

faceId: number
Valore predefinito: ""

Restituzioni

GetAdjacentVertices

Parametri

vertexId: number
Valore predefinito: ""

Restituzioni

GetCenter


Restituzioni

GetColor

Parametri

colorId: number
Valore predefinito: ""

Restituzioni

GetColorAlpha

Parametri

colorId: number
Valore predefinito: ""

Restituzioni

GetColors


Restituzioni

GetFaceColors

Parametri

faceId: number
Valore predefinito: ""

Restituzioni

GetFaceNormals

Parametri

faceId: number
Valore predefinito: ""

Restituzioni

GetFaceUVs

Parametri

faceId: number
Valore predefinito: ""

Restituzioni

GetFaceVertices

Parametri

faceId: number
Valore predefinito: ""

Restituzioni

GetFaces


Restituzioni

GetNormal

Parametri

normalId: number
Valore predefinito: ""

Restituzioni

GetNormals


Restituzioni

GetPosition

Parametri

vertexId: number
Valore predefinito: ""

Restituzioni

GetSize


Restituzioni

GetUV

Parametri

uvId: number
Valore predefinito: ""

Restituzioni

GetUVs


Restituzioni

GetVertices


Restituzioni

IdDebugString

Parametri

id: number
Valore predefinito: ""

Restituzioni

MergeVertices

Map

Parametri

mergeTolerance: number
Valore predefinito: ""

Restituzioni

Map

RaycastLocal

Parametri

origin: Vector3
Valore predefinito: ""
direction: Vector3
Valore predefinito: ""

Restituzioni

Campioni di codice

EditableMesh:RaycastLocal()

local AssetService = game:GetService("AssetService")
local Workspace = game:GetService("Workspace")
-- Initialize EditableMesh in space
local editableMesh = nil
local success, errorMsg = pcall(function()
editableMesh = AssetService:CreateEditableMeshAsync(Content.fromUri("rbxassetid://ASSET_ID"))
end)
local meshPart = nil
if success and editableMesh then
meshPart = AssetService:CreateMeshPartAsync(
Content.fromObject(editableMesh),
{ CollisionFidelity = Enum.CollisionFidelity.Hull }
)
meshPart.Parent = Workspace
else
warn(errorMsg)
end
-- Function that will cast a ray from the given point, returning the world point of the hit and the UV coordinate
local function castRayFromCamera(meshPart: MeshPart, editableMesh: EditableMesh, viewportPoint: Vector3)
if not meshPart then
return
end
-- Calculate how much the object is being scaled in each dimension
local renderScale = meshPart.Size / meshPart.MeshSize
-- Create ray from camera along the direction of a clicked point
local ray = Workspace.CurrentCamera:ViewportPointToRay(viewportPoint.X, viewportPoint.Y)
-- Convert to object space to use with RaycastLocal()
local relativeOrigin = meshPart.CFrame:PointToObjectSpace(ray.Origin) / renderScale
local relativeTarget = meshPart.CFrame:PointToObjectSpace(ray.Origin + ray.Direction * 100) / renderScale
local relativeDirection = relativeTarget - relativeOrigin
local faceId, point, barycentricCoordinate, vertId1, vertId2, vertId3 =
editableMesh:RaycastLocal(relativeOrigin, relativeDirection)
if not faceId then
-- Didn't hit any faces
return
end
-- Compute the hit point in world space
local worldHitPoint = meshPart.CFrame:PointToWorldSpace(point * renderScale)
-- Get the UVs on the face
local uvId1 = editableMesh:GetVertexFaceUV(vertId1, faceId)
local uvId2 = editableMesh:GetVertexFaceUV(vertId2, faceId)
local uvId3 = editableMesh:GetVertexFaceUV(vertId3, faceId)
local uv1 = editableMesh:GetUV(uvId1)
local uv2 = editableMesh:GetUV(uvId2)
local uv3 = editableMesh:GetUV(uvId3)
-- Interpolate UVs within the face based on the barycentric coordinate
local u = (barycentricCoordinate.x * uv1.x) + (barycentricCoordinate.y * uv2.x) + (barycentricCoordinate.z * uv3.x)
local v = (barycentricCoordinate.x * uv1.y) + (barycentricCoordinate.y * uv2.y) + (barycentricCoordinate.z * uv3.y)
return worldHitPoint, Vector2.new(u, v)
end

RemoveFace

()

Parametri

faceId: number
Valore predefinito: ""

Restituzioni

()

RemoveUnused


Restituzioni

ResetNormal

()

Parametri

normalId: number
Valore predefinito: ""

Restituzioni

()

SetColor

()

Parametri

colorId: number
Valore predefinito: ""
color: Color3
Valore predefinito: ""

Restituzioni

()

SetColorAlpha

()

Parametri

colorId: number
Valore predefinito: ""
alpha: number
Valore predefinito: ""

Restituzioni

()

SetFaceColors

()

Parametri

faceId: number
Valore predefinito: ""
ids: Array
Valore predefinito: ""

Restituzioni

()

SetFaceNormals

()

Parametri

faceId: number
Valore predefinito: ""
ids: Array
Valore predefinito: ""

Restituzioni

()

SetFaceUVs

()

Parametri

faceId: number
Valore predefinito: ""
ids: Array
Valore predefinito: ""

Restituzioni

()

SetFaceVertices

()

Parametri

faceId: number
Valore predefinito: ""
ids: Array
Valore predefinito: ""

Restituzioni

()

SetNormal

()

Parametri

normalId: number
Valore predefinito: ""
normal: Vector3
Valore predefinito: ""

Restituzioni

()

SetPosition

()

Parametri

vertexId: number
Valore predefinito: ""
Valore predefinito: ""

Restituzioni

()

SetUV

()

Parametri

uvId: number
Valore predefinito: ""
Valore predefinito: ""

Restituzioni

()

Triangulate

()

Restituzioni

()

Eventi