EditableMesh

Mostrar obsoleto

*Este contenido se traduce usando la IA (Beta) y puede contener errores. Para ver esta página en inglés, haz clic en aquí.

No creable

EditableMesh cambia la malla visual aplicada cuando se enlaza a una MeshPart, permitiendo la búsqueda y la modificación de la malla tanto en Studio como en la experiencia.

Activación para experiencias publicadas

Para fines de seguridad, el uso de EditableMesh falla por defecto para las experiencias publicadas.Para habilitar el uso, debe tener 13 años o más verificados y verificado el ID.Después de verificarse, abra las Configuraciones de juego de Studio, seleccione Seguridad y habilite el botón Permitir API de malla / imagen .

Permisos

Para evitar el mal uso, AssetService:CreateEditableMeshAsync() solo te permitirá cargar y editar recursos de malla:

  • Que son propiedad del creador de la experiencia (si la experiencia es propiedad de un individuo).
  • Que son propiedad de un grupo (si la experiencia es propiedad del grupo).
  • Que son propiedad del usuario de Studio iniciado de sesión (si el archivo del lugar aún no se ha guardado o publicado en Roblox).

Límites de memoria

Los recursos editables son actualmente costosos para el uso de memoria.Para minimizar su impacto en el rendimiento del cliente, EditableMesh tiene presupuestos estrictos de memoria del lado del cliente, aunque el servidor, Studio y los plugins operan con memoria ilimitada.El uso de FixedSize puede ayudarle a mantenerse dentro del presupuesto de memoria y, en algunos escenarios, vincular uno EditableMesh a múltiples MeshParts (multirespaldo) puede ayudar con la optimización de la memoria.

Creación y visualización

Un EditableMesh se puede crear a partir de un existente Content de un MeshPart o una ID de malla usando AssetService:CreateEditableMeshAsync() , o un vacío EditableMesh se puede crear con AssetService:CreateEditableMesh() .Luego se puede mostrar, modificar y actualizar su modelo de colisión.No todos los pasos son necesarios; por ejemplo, quizás quieras crear un EditableMesh sólo para raycast sin mostrarlo nunca.


local AssetService = game:GetService("AssetService")
-- Crear malla editable vacía
local editableMesh = AssetService:CreateEditableMesh()
-- Crear EditableMesh a partir de la ID del activo
local editableMeshFromAsset = nil
local success, errorMessage = pcall(function()
editableMeshFromAsset = AssetService:CreateEditableMeshAsync(Content.fromAssetId(ASSET_ID))
end)
-- Crear EditableMesh a partir de otro EditableMesh
local editableMeshFromAnother = nil
local success, errorMessage = pcall(function()
editableMeshFromAnother = AssetService:CreateEditableMeshAsync(Content.fromObject(OTHER_EDITABLE_MESH))
end)
-- Crear EditableMesh a partir de MeshPart
local editableMeshFromMeshPart = nil
local success, errorMessage = pcall(function()
editableMeshFromMeshPart = AssetService:CreateEditableMeshAsync(MESH_PART.MeshContent)
end)

Un EditableMesh se muestra cuando está vinculado a un nuevo MeshPart , a través de AssetService:CreateMeshPartAsync() .Puedes crear más instancias que hagan referencia al mismo , o enlazar a una existente a través de .


local AssetService = game:GetService("AssetService")
local Workspace = game:GetService("Workspace")
-- Crear EditableMesh a partir de la ID del activo
local editableMeshFromAsset = nil
local success, errorMessage = pcall(function()
editableMeshFromAsset = AssetService:CreateEditableMeshAsync(Content.fromAssetId(ASSET_ID))
end)
-- Crear una nueva pieza de malla vinculada a la EditableMesh
local newMeshPart = nil
local success, errorMessage = pcall(function()
newMeshPart = AssetService:CreateMeshPartAsync(Content.fromObject(editableMeshFromAsset))
end)
-- Alternativamente, enlaza la nueva pieza de malla creada anteriormente a una pieza de malla existente
local existingMeshPart = Workspace:FindFirstChild("EXISTING_MESH_PART")
existingMeshPart:ApplyMesh(newMeshPart)

Para recalcular la geometría de colisión y fluidos después de editar, puedes volver a llamar AssetService:CreateMeshPartAsync() y MeshPart:ApplyMesh() para actualizar un MeshPart existente.Generalmente se recomienda hacer esto al final de una edición conceptual, no después de llamadas individuales a métodos que manipulan la geometría.Los cambios visuales en la malla siempre se reflejarán inmediatamente por el motor, sin la necesidad de llamar AssetService:CreateMeshPartAsync() .

Mallas de tamaño fijo

Al crear un EditableMesh desde un recurso de malla existente (a través de AssetService:CreateEditableMeshAsync() ), el resultante malla editable se fija de tamaño predeterminado por defecto.Las mallas de tamaño fijo son más eficientes en términos de memoria, pero no puedes cambiar el número de vértices, caras o atributos.Solo se pueden editar los valores de los atributos y posiciones de vértice.


local AssetService = game:GetService("AssetService")
-- Crear EditableMesh sin predeterminado de tamaño fijo
local editableMeshFromAsset = nil
local success, errorMessage = pcall(function()
editableMeshFromAsset = AssetService:CreateEditableMeshAsync(Content.fromAssetId(ASSET_ID), {FixedSize = false})
end)

ID de vértice/cara estable

Muchos métodos EditableMesh toman vértice , normal , UV , color y cara IDs.Estos se representan como enteros en Luau, pero requieren un manejo especial.La diferencia principal es que las identidades son estables y se mantienen iguales incluso si cambian otras partes de la malla.Por ejemplo, si un EditableMesh tiene cinco vértices {1, 2, 3, 4, 5} y eliminas el vértice 4 , los nuevos vértices serán {1, 2, 3, 5} .

Tenga en cuenta que los ID no se garantizan que estén en orden y puede haber agujeros en la numeración, por lo que al iterar a través de vértices o caras, debe iterar a través de la tabla devuelta por GetVertices() o GetFaces() .

Atributos de vértice dividido

Un vértice es una esquina de una cara y se conecta topológicamente caras juntas.Los vértices pueden tener varios atributos: posición, normal, coordenada UV, color y transparencia.

A veces es útil para todas las caras que tocan un vértice usar los mismos valores de atributo, pero a veces querrás que diferentes caras usen diferentes valores de atributo en el mismo vértice.Por ejemplo, en una esfera lisa, cada vértice solo tendrá un normal.En contraste, en la esquina de un cubo, el vértice tendrá 3 normales diferentes (uno por cada cara adyacente).También puedes tener costuras en las coordenadas UV o cambios bruscos en los colores del vértice.

Al crear caras, cada vértice tendrá por defecto uno de cada atributo: uno normal, una coordenada UV y un color/transparencia.Si quieres crear una costura, deberás crear nuevos atributos y ponerlos en la cara.Por ejemplo, este código creará un cubo afilado:


local AssetService = game:GetService("AssetService")
-- Dados 4 ID de vértice, añade un nuevo normal y 2 triángulos, haciendo un cuadrado afilado
local function addSharpQuad(editableMesh, vid0, vid1, vid2, vid3)
local nid = editableMesh:AddNormal() -- Esto crea una identificación normal que se calcula automáticamente
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
-- Hace un cubo con bordes rebajados entre los 6 lados
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) -- Delante
addSharpQuad(editableMesh, v1, v3, v4, v2) -- Volver
addSharpQuad(editableMesh, v1, v5, v7, v3) -- Izquierda
addSharpQuad(editableMesh, v2, v4, v8, v6) -- Derecha
addSharpQuad(editableMesh, v1, v2, v6, v5) -- Inferior
addSharpQuad(editableMesh, v3, v7, v8, v4) -- Superior
editableMesh:RemoveUnused()
return editableMesh
end

Enrollado

Las caras de malla tienen un lado frontal y un lado trasero.Cuando se dibujan mallas, solo se dibuja el frente de las caras por defecto, aunque puedes cambiar esto al establecer la propiedad de malla DoubleSided en true.

El orden de los vértices alrededor de la cara determina si estás mirando al frente o a la espalda.La frente del rostro es visible cuando los vértices van en sentido contrario alrededor de ella.

Order of the vertices around the face

Posiciones de FACS

Las cabezas animables usan el Sistema de codificación de acciones faciales (FACS).Vea la referencia de poses de FACS para información útil al usar GetFacsPoses() y métodos similares.

Cada posición de FACS se especifica por un valor Enum.FacsActionUnit .Para la postura FACS, las huesos virtuales pueden tener cada una un CFrame que transforma el inicial CFrame de los huesos en la postura de enlazamiento de la malla en la postura de CFrame para la unidad de acción de FACS para esa postura.Todo el hueso CFrames está en el espacio local de la malla.

Estas poses de FACS se mezclan durante la animación.A veces, la mezcla de las poses base produce malos resultados.En esos casos, puedes anular la mezcla de combinaciones específicas de poses de base con una postura correctora que sea más agradable.Una postura correctiva se especifica por 2 o 3 valores Enum.FacsActionUnit correctivos.Al igual que una posa de FACS de base, para una posa correctiva, los huesos virtuales pueden tener cada uno un CFrame que transforme el CFrame inicial de los huesos en la posa de enlazamiento del modelo en el CFrame para ese corrector de FACS.

Limitaciones

EditableMesh actualmente tiene un límite de 60,000 vértices y 20,000 triángulos. Intentar agregar demasiados vértices o triángulos causará un error.

Resumen

Propiedades

  • Solo lectura
    No replicado
    Seguridad de Roblox
    Leer paralelo

    Devuelve true si una malla es de tamaño fijo.

Métodos

Propiedades

FixedSize

Solo lectura
No replicado
Seguridad de Roblox
Leer paralelo

Las mallas de tamaño fijo permiten cambiar los valores de los atributos de vértice, pero no permiten agregar o eliminar vértices y triángulos.

Métodos

AddColor

Agrega un nuevo color a la geometría y devuelve una identificación de color estable.

Parámetros

color: Color3

El nuevo color.

Valor predeterminado: ""
alpha: number

El color alfa (transparencia).

Valor predeterminado: ""

Devuelve

ID de color estable del nuevo color.

AddNormal

Añade un nuevo normal a la geometría y devuelve un ID normal estable. Si el valor normal no se especifica, el normal se calculará automáticamente.

Parámetros

normal: Vector3

El vector normal. Si no se especifica el valor normal, se calculará automáticamente.

Valor predeterminado: ""

Devuelve

ID normal estable del nuevo normal.

AddTriangle

Añade un nuevo triángulo a la malla y devuelve una identificación de cara estable.

Parámetros

vertexId0: number

ID del primer vértice del triángulo.

Valor predeterminado: ""
vertexId1: number

ID del segundo vértice del triángulo.

Valor predeterminado: ""
vertexId2: number

ID del tercer vértice del triángulo.

Valor predeterminado: ""

Devuelve

ID de cara estable del nuevo rostro.

AddUV

Añade un nuevo UV a la geometría y devuelve una identificación UV estable.

Parámetros

La nueva coordenada UV.

Valor predeterminado: ""

Devuelve

ID UV estable del nuevo UV.

AddVertex

Añade un nuevo vértice a la geometría y devuelve un ID de vértice estable.

Parámetros

Posición en el espacio de objeto local de la malla.

Valor predeterminado: ""

Devuelve

ID de vértice estable del nuevo vértice.

Destroy

()

Destruye el contenido de la malla, recuperando inmediatamente la memoria utilizada.


Devuelve

()

FindClosestPointOnSurface

Encuentra el punto más cercano en la superficie del malla.Devuelve la identificación del rostro, apunta en la malla en el espacio de objeto local y la coordenada barycentrica de la posición dentro del rostro.Vea RaycastLocal() para más información sobre las coordenadas barycéntricas.

Parámetros

point: Vector3

Posición de punto en el espacio de objeto local de la malla.

Valor predeterminado: ""

Devuelve

Triple de la identificación del rostro, punto en la malla en el espacio de objeto local y la coordenada barycentrica de la posición dentro del rostro.

FindClosestVertex

Encuentra el vértice más cercano a un punto específico en el espacio y devuelve una identificación de vértice estable.

Parámetros

toThisPoint: Vector3

Posición de punto en el espacio de objeto local de la malla.

Valor predeterminado: ""

Devuelve

ID de vértice estable más cercano al punto especificado en el espacio.

FindVerticesWithinSphere

Encuentra todos los vértices dentro de una esfera específica y devuelve una lista de ID de vértice estable.

Parámetros

center: Vector3

Centro de la esfera en el espacio de objeto local de la malla.

Valor predeterminado: ""
radius: number

Radio de la esfera.

Valor predeterminado: ""

Devuelve

Lista de ID de vértice estable dentro de la esfera solicitada.

GetAdjacentFaces

Dada una identificación de cara estable, devuelve una lista de caras adyacentes.

Adjacent faces indicated around requested face

Parámetros

faceId: number
Valor predeterminado: ""

Devuelve

Lista de ID de cara adyacente al rostro dado.

GetAdjacentVertices

Dada una ID de vértice estable, devuelve una lista de vértices adyacentes.

Adjacent vertices indicated around requested vertex

Parámetros

vertexId: number

ID de vértice alrededor del cual obtener vértices adyacentes.

Valor predeterminado: ""

Devuelve

Lista de ID de vértices adyacentes alrededor del vértice dado.

GetCenter


Devuelve

Centro de la caja de contención de la EditableMesh .

GetColor

Devuelve el color para el ID de color dado.

Parámetros

colorId: number

ID de color para obtener el color.

Valor predeterminado: ""

Devuelve

Color para el ID de color estable solicitado.

GetColorAlpha

Devuelve el color alpha (transparencia) en el ID de color estable dado.

Parámetros

colorId: number

ID de color para obtener la alfa.

Valor predeterminado: ""

Devuelve

Color alpha en el ID de color estable de la solicitud.

GetColors

Devuelve todos los colores de la malla como una lista de ID de color estable.


Devuelve

Lista de ID de color estable.

GetFaceColors

Devuelve las ID de color del rostro para los vértices en el rostro.

Parámetros

faceId: number

ID de cara para obtener los ID de color.

Valor predeterminado: ""

Devuelve

Lista de ID de color utilizados para los vértices en la cara dada.

GetFaceNormals

Devuelve las ID normales del rostro para los vértices en el rostro.

Parámetros

faceId: number

ID de cara para obtener las ID normales.

Valor predeterminado: ""

Devuelve

Lista de ID normales utilizados para los vértices en la cara dada.

GetFaceUVs

Devuelve las ID UV del rostro para los vértices en el rostro.

Parámetros

faceId: number

ID de cara para obtener los ID de UV.

Valor predeterminado: ""

Devuelve

Lista de ID de UV utilizados para los vértices en la cara dada.

GetFaceVertices

Devuelve las ID de vértice del rostro.

Parámetros

faceId: number
Valor predeterminado: ""

Devuelve

Lista de ID de vértice alrededor del rostro dado.

GetFaces

Devuelve todos los rostros de la malla como una lista de ID de rostros estables.


Devuelve

Lista de ID de cara estables.

GetNormal

Devuelve el vector normal para el ID normal dado.

Parámetros

normalId: number

ID normal para obtener el vector normal.

Valor predeterminado: ""

Devuelve

Vectores normales en la ID normal solicitada.

GetNormals

Devuelve todos los normales de la malla como una lista de ID normales estables.


Devuelve

Lista de ID normales estables.

GetPosition

Obtiene la posición de un vértice en el espacio de objeto local de la malla.

Parámetros

vertexId: number

ID de vértice estable para el cual obtener la posición.

Valor predeterminado: ""

Devuelve

Posición de un vértice en el espacio de objeto local de la malla.

GetSize


Devuelve

Tamaño del EditableMesh .

GetUV

Devuelve las coordenadas UV en el ID UV dado.

Parámetros

uvId: number

ID UV para el cual obtener la coordenada UV.

Valor predeterminado: ""

Devuelve

Coordenadas UV en la ID UV solicitada.

GetUVs

Devuelve todos los UV de la malla como una lista de ID UV estables.


Devuelve

Lista de ID de UV estables.

GetVertices

Devuelve todos los vértices como una lista de ID de vértice estables.


Devuelve

Lista de ID de vértice estable.

IdDebugString

Devuelve una cadena que describe un ID estable, útil para fines de depuración, como f17 o v12 , que contiene el tipo, el número de ID y la versión.

Parámetros

id: number

ID para el cual devolver una cadena de información de depuración.

Valor predeterminado: ""

Devuelve

Texto que describe el ID en formato legible por el hombre.

MergeVertices

Map

Fusiona vértices que se tocan entre sí, para usar un solo ID de vértice pero mantener los otros ID de atributos originales.

Parámetros

mergeTolerance: number

La distancia en la que se considera que los vértices se tocan entre sí.

Valor predeterminado: ""

Devuelve

Map

Un mapeo de la antigua identificación de vértice a la nueva identificación de vértice para los vértices que se han fusionado.

RaycastLocal

Lanza un rayo y devuelve un punto de intersección, una identificación de cara y coordenadas barycéntricas.Los inputs y outputs de este método están en el espacio de objeto local de la malla.

Un coordinada barycentrica es una manera de especificar un punto dentro de una cara como una combinación ponderada de los 3 vértices de la cara.Esto es útil como una forma general de mezclar atributos de vértice.Vea el ejemplo de código de este método como una ilustración.

Parámetros

origin: Vector3

Origen del rayo en el espacio de objeto local de la malla.

Valor predeterminado: ""
direction: Vector3

Dirección del rayo.

Valor predeterminado: ""

Devuelve

Triple del punto de intersección, ID de cara y coordenadas barycéntricas.

Muestras de código

This code finds the position and UV coordinates of the closest point on an EditableMesh to the input point.

EditableMesh:RaycastLocal()

local AssetService = game:GetService("AssetService")
-- 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
print(errorMsg)
end
local function castRayFromCamera(position)
if not meshPart then
return
end
-- Create ray from camera along the direction of a clicked point
local camera = workspace.CurrentCamera
local ray = camera:ScreenPointToRay(position.X, position.Y)
-- Convert to object space to use with RaycastLocal()
local relativeOrigin = meshPart.CFrame:PointToObjectSpace(ray.Origin)
local relativeDirection = meshPart.CFrame:VectorToObjectSpace(ray.Direction)
local triangleId, point, barycentricCoordinate
triangleId, point, barycentricCoordinate = editableMesh:RaycastLocal(relativeOrigin, relativeDirection * 100)
if not triangleId then
-- Didn't hit any triangles
return
end
-- Interpolate UVs within the triangle
local vert1, vert2, vert3 = editableMesh:GetTriangleVertices(triangleId)
local uv0 = editableMesh:GetUV(vert1)
local uv1 = editableMesh:GetUV(vert2)
local uv2 = editableMesh:GetUV(vert3)
local u = (barycentricCoordinate.x * uv0.x) + (barycentricCoordinate.y * uv1.x) + (barycentricCoordinate.z * uv2.x)
local v = (barycentricCoordinate.x * uv0.y) + (barycentricCoordinate.y * uv1.y) + (barycentricCoordinate.z * uv2.y)
return Vector2.new(u, v)
end

RemoveFace

()

Elimina una cara usando su ID de cara estable.

Parámetros

faceId: number
Valor predeterminado: ""

Devuelve

()

RemoveUnused

Elimina todos los vértices, normales, UVs y colores que no se usan en ninguna cara, y devuelve las ID eliminadas.


Devuelve

Todas las ID estables eliminadas.

ResetNormal

()

Restablece esta identificación normal para que se cálcula automáticamente en función de la forma de la malla, en lugar de establecerse manualmente.

Parámetros

normalId: number

ID normal estable para restablecer.

Valor predeterminado: ""

Devuelve

()

SetColor

()

Establece el color para un ID de color.

Parámetros

colorId: number

ID de color estable para el cual establecer el color.

Valor predeterminado: ""
color: Color3

Color para establecer.

Valor predeterminado: ""

Devuelve

()

SetColorAlpha

()

Establece el color alpha (transparencia) para un ID de color.

Parámetros

colorId: number

ID de color estable para el cual establecer el alfa de color.

Valor predeterminado: ""
alpha: number

Alpha para establecer.

Valor predeterminado: ""

Devuelve

()

SetFaceColors

()

Establece los colores de vértice del rostro a nuevos ID de color.

Parámetros

faceId: number

ID de cara para actualizar los colores de vértice.

Valor predeterminado: ""
ids: Array

Lista de nuevos ID de color estable para usar para los vértices del rostro dado.

Valor predeterminado: ""

Devuelve

()

SetFaceNormals

()

Establece las normales del vértice de la cara a nuevas identidades normales.

Parámetros

faceId: number

ID de cara para actualizar los normales de vértice.

Valor predeterminado: ""
ids: Array

Lista de nuevas identidades estables normales para usar para los vértices del rostro dado.

Valor predeterminado: ""

Devuelve

()

SetFaceUVs

()

Establece los UV del vértice de la cara a nuevas identidades de UV.

Parámetros

faceId: number

ID de cara para actualizar los UV de vértice.

Valor predeterminado: ""
ids: Array

Lista de nuevas identidades UV estables para usar para los vértices del rostro dado.

Valor predeterminado: ""

Devuelve

()

SetFaceVertices

()

Establece los vértices del rostro a nuevas identidades de vértice.

Parámetros

faceId: number

ID de cara para actualizar los vértices.

Valor predeterminado: ""
ids: Array

Lista de nuevos ID de vértice estable para usar para el rostro dado.

Valor predeterminado: ""

Devuelve

()

SetNormal

()

Establece el normal para una identificación normal. Esto cambiará el valor normal para cada vértice de cara que use la identificación normal.

Parámetros

normalId: number

ID normal estable para el cual establecer el vector normal.

Valor predeterminado: ""
normal: Vector3

Vectores normales para establecer.

Valor predeterminado: ""

Devuelve

()

SetPosition

()

Establece una posición de vértice en el espacio de objeto local de la malla.

Parámetros

vertexId: number

ID de vértice estable del vértice a posicionar.

Valor predeterminado: ""

Posición en el espacio de objeto local de la malla.

Valor predeterminado: ""

Devuelve

()

SetUV

()

Establece las coordenadas UV para un ID UV.

Parámetros

uvId: number

ID UV para el cual establecer las coordenadas UV.

Valor predeterminado: ""

Coordenadas UV.

Valor predeterminado: ""

Devuelve

()

Triangulate

()

Separa todas las caras en la malla para que sean triángulos.Actualmente esto no hace nada ya que solo se pueden crear triángulos, pero si tu código depende de triángulos, se recomienda que llames a este método después de llamar AssetService:CreateEditableMeshAsync() .


Devuelve

()

Eventos