EditableMesh
*Questo contenuto è tradotto usando AI (Beta) e potrebbe contenere errori. Per visualizzare questa pagina in inglese, clicca qui.
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.

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à
Restituisce true se una mesh è di dimensione fissa.
Metodi
Aggiunge un nuovo colore alla geometria e restituisce un ID colore stabile.
Aggiunge un nuovo normale alla geometria e restituisce un ID normale stabile.
Aggiunge un nuovo triangolo alla mesh e restituisce un ID del viso stabile.
Aggiunge un nuovo UV alla geometria e restituisce un ID UV stabile.
Aggiunge un nuovo vertice alla geometria e restituisce un ID vertice stabile.
Distrugge la messe.
Trova il punto più vicino sulla superficie della mesh.
Trova il vertice più vicino a un punto specifico nello spazio.
Trova tutti i vertici all'interno di una sfera specifica.
Restituisce una lista di facce adiacenti a una data faccia.
Restituisce una lista di vertici adiacenti a un vertice dato.
Restituisce il colore per l'ID del colore specificato.
Restituisce il colore alpha (trasparenza) all'ID del colore specificato.
Restituisce tutti i colori della mesh.
Restituisce gli ID del colore del viso per i vertici sul viso.
Restituisce gli ID normali del viso per i vertici sul viso.
Restituisce gli ID UV del viso per i vertici sul viso.
Restituisce gli ID del vertice del viso.
Restituisce tutti i volti della mesh.
Restituisce il normale vector per l'ID normale fornito.
Restituisce tutti i normali della mesh.
Ottiene la posizione di un vertice.
Restituisce le coordinate UV all'ID UV specificato.
Restituisce tutti gli UV della mesh.
Restituisce tutti i vertici come una lista di ID di vertici stabili.
Restituisce una stringa che descrive un ID stabile, utile per scopi di debug.
Unisce i vertici che si toccano insieme.
Rimuove un volto utilizzando il suo ID volto stabile.
Rimuove tutti i vertici non utilizzati, le normali, gli UV e i colori e restituisce gli ID rimossi.
Ripristina questo ID normale per essere calcolato automaticamente.
Imposta il colore per un ID colore.
Imposta il colore alpha (trasparenza) per un ID colore.
Imposta i colori del vertice del viso su nuovi ID di colore.
Imposta i normali del vertice del viso a nuovi ID normali.
Imposta gli UV del vertice del viso a nuovi ID UV.
Imposta i vertici del viso su nuovi ID vertici.
Imposta il normale per un ID normale.
Imposta una posizione del vertice nello spazio oggetti locale della mesh.
Imposta le coordinate UV per un ID UV.
Dividi tutti i volti sulla mesh ad essere triangoli.
Proprietà
FixedSize
Metodi
AddColor
Parametri
Restituzioni
AddTriangle
Parametri
Restituzioni
Destroy
Restituzioni
FindVerticesWithinSphere
Parametri
Restituzioni
RaycastLocal
Parametri
Restituzioni
Campioni di codice
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