EditableMesh
*Ce contenu est traduit en utilisant l'IA (Beta) et peut contenir des erreurs. Pour consulter cette page en anglais, clique ici.
EditableMesh modifie le maillage visuel appliqué lorsqu'il est lié à un MeshPart, ce qui permet de rechercher et de modifier le maillage à la fois dans Studio et dans l'expérience.
Activer les expériences publiées
Pour des raisons de sécurité, l'utilisation de EditableMesh échoue par défaut pour les expériences publiées.Pour activer l'utilisation, vous devez être âgé de 13 ans ou plus et vérifier votre identité.Après avoir été vérifié, ouvrez les paramètres de jeu de Studio , sélectionnez sécurité et activez le bouton autoriser les API de maillage/image .
Permissions
Pour empêcher une utilisation malveillante, AssetService:CreateEditableMeshAsync() ne vous permettra de charger et d'éditer que des ressources de maillage :
- Ceux qui sont possédés par le créateur de l'expérience (si l'expérience est possédée par une personne).
- Ceux qui sont possédés par un groupe (si l'expérience appartient au groupe).
- Ceux qui sont possédés par l'utilisateur de Studio connecté (si le fichier de lieu n'a pas encore été sauvegardé ou publié sur Roblox).
Limites de mémoire
Les ressources modifiables sont actuellement coûteuses pour l'utilisation de la mémoire.Pour minimiser son impact sur les performances du client, EditableMesh a des budgets de mémoire stricts du côté du client, bien que le serveur, Studio et les plugins fonctionnent avec une mémoire illimitée.L'utilisation de FixedSize peut vous aider à rester dans le budget de mémoire et, dans certains scénarios, le lien d'un EditableMesh à plusieurs MeshParts (multiréférencement) peut aider à l'optimisation de la mémoire.
Création et affichage
Un EditableMesh peut être créé à partir d'un existant Content d'un MeshPart ou d'un ID de maillage en utilisant AssetService:CreateEditableMeshAsync(), ou un EditableMesh vide peut être créé avec AssetService:CreateEditableMesh().Il peut ensuite être affiché, modifié et son modèle de collision mis à jour.Pas toutes les étapes sont nécessaires ; par exemple, vous pourriez vouloir créer un EditableMesh simplement pour le raycast sans jamais l'afficher.
local AssetService = game:GetService("AssetService")
-- Créer un EditableMesh vide
local editableMesh = AssetService:CreateEditableMesh()
-- Créer un EditableMesh à partir de l'ID de la ressource
local editableMeshFromAsset = nil
local success, errorMessage = pcall(function()
editableMeshFromAsset = AssetService:CreateEditableMeshAsync(Content.fromAssetId(ASSET_ID))
end)
-- Créer un EditableMesh à partir d'un autre EditableMesh
local editableMeshFromAnother = nil
local success, errorMessage = pcall(function()
editableMeshFromAnother = AssetService:CreateEditableMeshAsync(Content.fromObject(OTHER_EDITABLE_MESH))
end)
-- Créer un maillage modifiable à partir de MeshPart
local editableMeshFromMeshPart = nil
local success, errorMessage = pcall(function()
editableMeshFromMeshPart = AssetService:CreateEditableMeshAsync(MESH_PART.MeshContent)
end)
Un EditableMesh est affiché lorsqu'il est lié à un nouveau MeshPart , via AssetService:CreateMeshPartAsync() .Vous pouvez créer plus d'instances MeshPart qui font référence à la même EditableMesh``Datatype.Content ou qui se lient à une instance existante MeshPart via MeshPart:ApplyMesh().
local AssetService = game:GetService("AssetService")
local Workspace = game:GetService("Workspace")
-- Créer un EditableMesh à partir de l'ID de la ressource
local editableMeshFromAsset = nil
local success, errorMessage = pcall(function()
editableMeshFromAsset = AssetService:CreateEditableMeshAsync(Content.fromAssetId(ASSET_ID))
end)
-- Créer une nouvelle partie maillée liée à l'éditableMesh
local newMeshPart = nil
local success, errorMessage = pcall(function()
newMeshPart = AssetService:CreateMeshPartAsync(Content.fromObject(editableMeshFromAsset))
end)
-- Alternativement, liez la nouvelle partie maillée créée ci-dessus à une partie maillée existante
local existingMeshPart = Workspace:FindFirstChild("EXISTING_MESH_PART")
existingMeshPart:ApplyMesh(newMeshPart)
Pour recalculer la géométrie de collision et de fluide après avoir édité, vous pouvez à nouveau appeler AssetService:CreateMeshPartAsync() et MeshPart:ApplyMesh() pour mettre à jour un MeshPart existant.Il est généralement recommandé de le faire à la fin d'une édition conceptuelle, et non après des appels individuels à des méthodes qui manipulent la géométrie.Les modifications visuelles du maillage seront toujours immédiatement reflétées par le moteur, sans avoir besoin d'appeler AssetService:CreateMeshPartAsync() .
Mailles de taille fixe
Lors de la création d'un EditableMesh à partir d'une ressource de maillage existante (via AssetService:CreateEditableMeshAsync() ), le maillage résultant est de taille fixe par défaut.Les mailles de taille fixe sont plus efficaces en termes de mémoire, mais vous ne pouvez pas modifier le nombre de verticaux, de faces ou d'attributs.Seules les valeurs des attributs de vertex et des positions peuvent être modifiées.
local AssetService = game:GetService("AssetService")
-- Créer un EditableMesh sans défaut de taille fixe
local editableMeshFromAsset = nil
local success, errorMessage = pcall(function()
editableMeshFromAsset = AssetService:CreateEditableMeshAsync(Content.fromAssetId(ASSET_ID), {FixedSize = false})
end)
ID de vertex/face stables
De nombreuses méthodes EditableMesh prennent vertex , normal , UV , couleur et visage ID.Ils sont représentés comme des entiers dans Luau, mais ils nécessitent une manipulation spéciale.La principale différence est que les ID sont stables et qu'ils restent les mêmes même si d'autres parties du maillage changent.Par exemple, si un EditableMesh a cinq sommets {1, 2, 3, 4, 5} et que vous supprimez le sommet 4, les nouveaux sommets seront {1, 2, 3, 5}.
Notez que les ID ne sont pas garantis d'être en ordre et qu'il peut y avoir des trous dans la numérotation, donc lorsque vous itérez à travers les sommets ou les faces, vous devez itérer à travers la table retournée par GetVertices() ou GetFaces() .
Attributs de vertex divisés
Un sommet vert est un coin d'un visage, et se connecte topologiquement les visages ensemble.Les sommets peuvent avoir plusieurs attributs : position, normale, coordonnées UV, couleur et transparence.
Parfois, il est utile pour tous les visages qui touchent un vertex d'utiliser les mêmes valeurs d'attribut, mais parfois vous voudrez que des visages différents utilisent des valeurs d'attribut différentes sur le même vertex.Par exemple, sur une sphère lisse, chaque vertex n'aura qu'un seul normal.En revanche, au coin d'un cube, le vertex aura 3 normales différentes (une pour chaque visage adjacent).Vous pouvez également avoir des coutures dans les coordonnées UV ou des changements soudains dans les couleurs du vertex.
Lors de la création de visages, chaque vertex aura par défaut un de chaque attribut : un normal, une coordonnée UV et une couleur/transparence.Si vous voulez créer une couture, vous devez créer de nouveaux attributs et les définir sur le visage.Par exemple, ce code créera un cube aiguisé :
local AssetService = game:GetService("AssetService")
-- En l'absence de 4 ID de sommet, ajoute un nouveau normal et 2 triangles, ce qui fait un quadruple aiguisé
local function addSharpQuad(editableMesh, vid0, vid1, vid2, vid3)
local nid = editableMesh:AddNormal() -- Cela crée un ID normal qui est automatiquement calculé
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
-- Fait un cube avec des bords crevés entre les 6 côtés
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) -- Avant
addSharpQuad(editableMesh, v1, v3, v4, v2) -- Retour
addSharpQuad(editableMesh, v1, v5, v7, v3) -- Gauche
addSharpQuad(editableMesh, v2, v4, v8, v6) -- Droite
addSharpQuad(editableMesh, v1, v2, v6, v5) -- En bas
addSharpQuad(editableMesh, v3, v7, v8, v4) -- Haut
editableMesh:RemoveUnused()
return editableMesh
end
Enroulement
Les faces maillées ont une face avant et une face arrière.Lors du dessin des mailles, seule la face avant des visages est dessinée par défaut, bien que vous puissiez le modifier en définissant la propriété maillage DoubleSided à true.
L'ordre des sommets autour du visage détermine si vous regardez devant ou derrière.Le front du visage est visible lorsque les sommets vont dans le sens contraire autour de lui.

Poses de FACS
Les têtes animables utilisent le système de codage d'action faciale (FACS).Voir la référence poses FACS pour des informations utiles lors de l'utilisation de GetFacsPoses() et de méthodes similaires.
Chaque pose FACS est spécifiée par une valeur Enum.FacsActionUnit .Pour la pose FACS, les os virtuels peuvent chacun avoir un CFrame qui transforme l'os initial CFrame dans la position de lien du maillage en la position CFrame de l'unité d'action FACS.Tous les os CFrames sont dans l'espace local du maillage.
Ces poses FACS sont mélangées ensemble pendant l'animation.Parfois, le mélange des poses de base produit de mauvais résultats.Dans ces cas, vous pouvez annuler le mélange de combinaisons spécifiques de poses de base avec une pose corrective qui est plus agréable.Une pose corrective est spécifiée par 2 ou 3 valeurs Enum.FacsActionUnit correctives.Comme une position FACS de base, pour une position corrective, les os virtuels peuvent chacun avoir un CFrame qui transforme le CFrame initial des os dans la position de lien du maillage en CFrame pour cette position corrective FACS.
Limites
EditableMesh a actuellement une limite de 60 000 vertices et de 20 000 triangles. Tenter d'ajouter trop de vertices ou de triangles provoquera une erreur.
Résumé
Propriétés
Retourne true si un maillage est de taille fixe.
Méthodes
Ajoute une nouvelle couleur à la géométrie et renvoie un ID de couleur stable.
Ajoute un nouveau normal à la géométrie et renvoie un ID normal stable.
Ajoute un nouveau triangle au maillage et renvoie une ID de visage stable.
Ajoute un nouvel UV à la géométrie et renvoie un ID UV stable.
Ajoute un nouveau vertex à la géométrie et renvoie un ID vertex stable.
Détruit le maillage.
Trouve le point le plus proche sur la surface du maillage.
Trouve le vertex le plus proche d'un point spécifique dans l'espace.
Trouve tous les sommets dans une sphère spécifique.
Renvoie une liste de visages adjacents à un visage donné.
Renvoie une liste de sommets adjacents à un sommet donné.
Renvoie la couleur pour l'ID de couleur donné.
Renvoie la couleur alpha (transparence) à l'ID de couleur donné.
Renvoie toutes les couleurs du maillage.
Renvoie les ID de couleur du visage pour les sommets sur le visage.
Renvoie les ID normaux du visage pour les sommets sur le visage.
Renvoie les ID UV du visage pour les sommets sur le visage.
Renvoie les ID de vertex du visage.
Renvoie toutes les faces du maillage.
Renvoie le vecteur normal pour l'ID normal donné.
Renvoie tous les normaux du maillage.
Obtient la position d'un vertex.
Renvoie les coordonnées UV à l'ID UV donné.
Renvoie tous les UV du maillage.
Retourne tous les sommets en tant que liste d'ID de vertex stables.
Renvoie une chaîne décrivant un ID stable, utile aux fins de débogage.
Fusionne les vertex qui se touchent.
Supprime un visage en utilisant son identifiant de visage stable.
Supprime tous les vertices inutilisés, les normales, les UV et les couleurs, et renvoie les ID supprimés.
Réinitialisez cet ID normal pour qu'il soit calculé automatiquement.
Définit la couleur pour un ID de couleur.
Définir la couleur alpha (transparence) pour un ID de couleur.
Définit les couleurs du vertex du visage à de nouveaux ID de couleur.
Définit les normales du vertex du visage à de nouvelles normales d'identification.
Définit les UV du vertex du visage à de nouvelles identités UV.
Définit les véritables du visage à de nouvelles ID de vertex.
Définissez la norme pour un ID normal.
Définit une position de vertex dans l'espace local de l'objet du maillage.
Définit les coordonnées UV pour un ID UV.
Divise tous les visages sur le maillage pour être des triangles.
Événements
Propriétés
FixedSize
Méthodes
AddColor
Paramètres
Retours
AddTriangle
Paramètres
Retours
Destroy
Retours
FindVerticesWithinSphere
Paramètres
Retours
RaycastLocal
Paramètres
Retours
Échantillons de code
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