EditableMesh

Afficher les obsolètes

*Ce contenu est traduit en utilisant l'IA (Beta) et peut contenir des erreurs. Pour consulter cette page en anglais, clique ici.

Création impossible

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.

Order of the vertices around the face

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

  • Lecture uniquement
    Non répliqué
    Sécurité Roblox
    Lecture parallèle

    Retourne true si un maillage est de taille fixe.

Méthodes

Propriétés

FixedSize

Lecture uniquement
Non répliqué
Sécurité Roblox
Lecture parallèle

Méthodes

AddColor

Paramètres

color: Color3
Valeur par défaut : ""
alpha: number
Valeur par défaut : ""

Retours

AddNormal

Paramètres

normal: Vector3
Valeur par défaut : ""

Retours

AddTriangle

Paramètres

vertexId0: number
Valeur par défaut : ""
vertexId1: number
Valeur par défaut : ""
vertexId2: number
Valeur par défaut : ""

Retours

AddUV

Paramètres

Valeur par défaut : ""

Retours

AddVertex

Paramètres

Valeur par défaut : ""

Retours

Destroy

()

Retours

()

FindClosestPointOnSurface

Paramètres

point: Vector3
Valeur par défaut : ""

Retours

FindClosestVertex

Paramètres

toThisPoint: Vector3
Valeur par défaut : ""

Retours

FindVerticesWithinSphere

Paramètres

center: Vector3
Valeur par défaut : ""
radius: number
Valeur par défaut : ""

Retours

GetAdjacentFaces

Paramètres

faceId: number
Valeur par défaut : ""

Retours

GetAdjacentVertices

Paramètres

vertexId: number
Valeur par défaut : ""

Retours

GetCenter


Retours

GetColor

Paramètres

colorId: number
Valeur par défaut : ""

Retours

GetColorAlpha

Paramètres

colorId: number
Valeur par défaut : ""

Retours

GetColors


Retours

GetFaceColors

Paramètres

faceId: number
Valeur par défaut : ""

Retours

GetFaceNormals

Paramètres

faceId: number
Valeur par défaut : ""

Retours

GetFaceUVs

Paramètres

faceId: number
Valeur par défaut : ""

Retours

GetFaceVertices

Paramètres

faceId: number
Valeur par défaut : ""

Retours

GetFaces


Retours

GetNormal

Paramètres

normalId: number
Valeur par défaut : ""

Retours

GetNormals


Retours

GetPosition

Paramètres

vertexId: number
Valeur par défaut : ""

Retours

GetSize


Retours

GetUV

Paramètres

uvId: number
Valeur par défaut : ""

Retours

GetUVs


Retours

GetVertices


Retours

IdDebugString

Paramètres

id: number
Valeur par défaut : ""

Retours

MergeVertices

Map

Paramètres

mergeTolerance: number
Valeur par défaut : ""

Retours

Map

RaycastLocal

Paramètres

origin: Vector3
Valeur par défaut : ""
direction: Vector3
Valeur par défaut : ""

Retours

Échantillons de code

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

()

Paramètres

faceId: number
Valeur par défaut : ""

Retours

()

RemoveUnused


Retours

ResetNormal

()

Paramètres

normalId: number
Valeur par défaut : ""

Retours

()

SetColor

()

Paramètres

colorId: number
Valeur par défaut : ""
color: Color3
Valeur par défaut : ""

Retours

()

SetColorAlpha

()

Paramètres

colorId: number
Valeur par défaut : ""
alpha: number
Valeur par défaut : ""

Retours

()

SetFaceColors

()

Paramètres

faceId: number
Valeur par défaut : ""
ids: Array
Valeur par défaut : ""

Retours

()

SetFaceNormals

()

Paramètres

faceId: number
Valeur par défaut : ""
ids: Array
Valeur par défaut : ""

Retours

()

SetFaceUVs

()

Paramètres

faceId: number
Valeur par défaut : ""
ids: Array
Valeur par défaut : ""

Retours

()

SetFaceVertices

()

Paramètres

faceId: number
Valeur par défaut : ""
ids: Array
Valeur par défaut : ""

Retours

()

SetNormal

()

Paramètres

normalId: number
Valeur par défaut : ""
normal: Vector3
Valeur par défaut : ""

Retours

()

SetPosition

()

Paramètres

vertexId: number
Valeur par défaut : ""
Valeur par défaut : ""

Retours

()

SetUV

()

Paramètres

uvId: number
Valeur par défaut : ""
Valeur par défaut : ""

Retours

()

Triangulate

()

Retours

()

Événements