EditableMesh

Mostrar obsoleto

*Este conteúdo é traduzido por IA (Beta) e pode conter erros. Para ver a página em inglês, clique aqui.

Não criável

EditableMesh altera a malha visual aplicada quando vinculada a um MeshPart, permitindo a busca e modificação da malha tanto no Studio quanto na experiência.

Habilitando Experiências Publicadas

Para fins de segurança, usar EditableMesh falha por padrão para experiências publicadas.Para habilitar o uso, você deve ter idade 13+ verificada e ID verificada.Depois de verificado, abra as Configurações de Jogo do Studio, selecione Segurança e ative o botão Permitir APIs de Malha/Imagem .

Permissões

Para evitar o uso indevido, AssetService:CreateEditableMeshAsync() só permitirá que você carregue e edite recursos de malha:

  • Que são de propriedade do criador da experiência (se a experiência for de propriedade de um indivíduo).
  • Que pertencem a um grupo (se a experiência for de propriedade do grupo).
  • Que são de propriedade do usuário do Studio logado (se o arquivo do lugar ainda não foi salvo ou publicado no Roblox).

Limites de Memória

Recursos editáveis são atualmente caros para uso de memória.Para minimizar seu impacto no desempenho do cliente, EditableMesh tem orçamentos de memória rigorosos do lado do cliente, embora o servidor, o Studio e os plugins operem com memória ilimitada.Usar FixedSize pode ajudá-lo a permanecer dentro do orçamento de memória e, em alguns cenários, ligar um EditableMesh a vários MeshParts (multiresposta) pode ajudar com a otimização de memória.

Criação e Exibição

Um EditableMesh pode ser criado a partir de um existente Content de um MeshPart ou um ID de malha usando AssetService:CreateEditableMeshAsync() , ou um vazio EditableMesh pode ser criado com AssetService:CreateEditableMesh() .Então, pode ser exibido, modificado e seu modelo de colisão atualizado.Nem todos os passos são necessários; por exemplo, você pode querer criar um EditableMesh apenas para raycast sem nunca exibi-lo.


local AssetService = game:GetService("AssetService")
-- Criar malha editável vazia
local editableMesh = AssetService:CreateEditableMesh()
-- Criar EditableMesh a partir do ID do recurso
local editableMeshFromAsset = nil
local success, errorMessage = pcall(function()
editableMeshFromAsset = AssetService:CreateEditableMeshAsync(Content.fromAssetId(ASSET_ID))
end)
-- Criar EditableMesh a partir de outro EditableMesh
local editableMeshFromAnother = nil
local success, errorMessage = pcall(function()
editableMeshFromAnother = AssetService:CreateEditableMeshAsync(Content.fromObject(OTHER_EDITABLE_MESH))
end)
-- Criar Modelo Editável a partir de MeshPart
local editableMeshFromMeshPart = nil
local success, errorMessage = pcall(function()
editableMeshFromMeshPart = AssetService:CreateEditableMeshAsync(MESH_PART.MeshContent)
end)

Um EditableMesh é exibido quando está ligado a um novo MeshPart , através de AssetService:CreateMeshPartAsync() .Você pode criar mais instâncias que referenciam o mesmo , ou vincular a uma existente através de .


local AssetService = game:GetService("AssetService")
local Workspace = game:GetService("Workspace")
-- Criar EditableMesh a partir do ID do recurso
local editableMeshFromAsset = nil
local success, errorMessage = pcall(function()
editableMeshFromAsset = AssetService:CreateEditableMeshAsync(Content.fromAssetId(ASSET_ID))
end)
-- Crie uma nova MeshPart ligada ao EditableMesh
local newMeshPart = nil
local success, errorMessage = pcall(function()
newMeshPart = AssetService:CreateMeshPartAsync(Content.fromObject(editableMeshFromAsset))
end)
-- Alternativamente, vincule a nova MeshPart criada acima a uma MeshPart existente
local existingMeshPart = Workspace:FindFirstChild("EXISTING_MESH_PART")
existingMeshPart:ApplyMesh(newMeshPart)

Para recalcular a colisão e a geometria do fluido após a edição, você pode novamente chamar AssetService:CreateMeshPartAsync() e MeshPart:ApplyMesh() para atualizar um MeshPart existente.Geralmente é recomendado fazer isso no final de uma edição conceitual, não após chamadas individuais a métodos que manipulam geometria.As alterações visuais na malha sempre serão refletidas imediatamente pelo motor, sem a necessidade de chamar AssetService:CreateMeshPartAsync().

Malhas de Tamanho Fixo

Ao criar um EditableMesh a partir de um recurso de malha existente (via AssetService:CreateEditableMeshAsync() ), o resultante mesh editável é de tamanho fixo por padrão.Malhas de tamanho fixo são mais eficientes em termos de memória, mas você não pode alterar o número de vértices, faces ou atributos.Apenas os valores de atributos de vértice e posições podem ser editados.


local AssetService = game:GetService("AssetService")
-- Criar EditableMesh sem padrão de tamanho fixo
local editableMeshFromAsset = nil
local success, errorMessage = pcall(function()
editableMeshFromAsset = AssetService:CreateEditableMeshAsync(Content.fromAssetId(ASSET_ID), {FixedSize = false})
end)

ID de Vetor/Rosto Estável

Muitos métodos EditableMesh de muitos vértice , normal , UV , cor e rosto IDs.Estes são representados como inteiros em Luau, mas requerem algum manuseio especial.A principal diferença é que os IDs são estáveis e permanecem os mesmos mesmo se outras partes da malha mudarem.Por exemplo, se um EditableMesh tiver cinco vértices {1, 2, 3, 4, 5} e você remover o vértice 4 , os novos vértices serão {1, 2, 3, 5} .

Observe que os IDs não são garantidos de estar em ordem e pode haver buracos na numeração, então, ao iterar por vértices ou faces, você deve iterar pela tabela retornada por GetVertices() ou GetFaces().

Atributos do vértice dividido

Um vértice é um canto de um rosto e conecta topologicamente rostos juntos.Vérteces podem ter vários atributos: posição, normal, coordenada UV, cor e transparência.

Às vezes, é útil para todos os rostos que tocarem um vértice usar os mesmos valores de atributo, mas às vezes você vai querer que rostos diferentes usem valores de atributo diferentes no mesmo vértice.Por exemplo, em uma esfera lisa, cada vértice terá apenas um normal.Em contraste, no canto de um cubo, o vértice terá 3 normais diferentes (um para cada face adjacente).Você também pode ter costuras nas coordenadas UV ou mudanças súbitas nas cores do vértice.

Ao criar rostos, cada vértice terá por padrão um de cada atributo: um normal, uma coordenada UV e uma cor/transparência.Se você quiser criar uma junta, deve criar novos atributos e defini-los no rosto.Por exemplo, este código criará um cubo afiado:


local AssetService = game:GetService("AssetService")
-- Dada 4 identidades de vértice, adiciona um novo normal e 2 triângulos, fazendo um quadrado afiado
local function addSharpQuad(editableMesh, vid0, vid1, vid2, vid3)
local nid = editableMesh:AddNormal() -- Isso cria um ID normal que é automaticamente calculado
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
-- Cria um cubo com bordas irregulares entre os 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) -- Frente
addSharpQuad(editableMesh, v1, v3, v4, v2) -- Voltar
addSharpQuad(editableMesh, v1, v5, v7, v3) -- Esquerda
addSharpQuad(editableMesh, v2, v4, v8, v6) -- Direita
addSharpQuad(editableMesh, v1, v2, v6, v5) -- Inferior
addSharpQuad(editableMesh, v3, v7, v8, v4) -- Primeiro
editableMesh:RemoveUnused()
return editableMesh
end

Enrolamento

Rostos de malha têm um lado frontal e um lado traseiro.Ao desenhar malhas, apenas a frente das faces é desenizada por padrão, embora você possa alterar isso definindo a propriedade da malha para .

A ordem dos vértices ao redor do rosto determina se você está olhando para a frente ou para trás.A frente do rosto é visível quando os vértices vão em sentido contrário ao redor dela.

Order of the vertices around the face

Poses de FACS

Cabeças animáveis usam o Sistema de Codificação de Ação Facial (FACS).Veja a referência de poses FACS para informações úteis ao usar GetFacsPoses() e métodos semelhantes.

Cada posição FACS é especificada por um valor Enum.FacsActionUnit .Para a posa FACS, os ossos virtuais podem cada um ter um CFrame que transforma os ossos iniciais CFrame na posa de ligação do mesh para a posa CFrame daquela unidade de ação do FACS.Todo os ossos CFrames estão no espaço local da malha.

Essas poses FACS são misturadas durante a animação.Às vezes, a mistura das poses de base produz resultados ruins.Nesses casos, você pode anular a mistura de combinações específicas de poses de base com uma postura corretiva que seja mais agradável.Uma posição corretiva é especificada por 2 ou 3 valores Enum.FacsActionUnit corretos.Como uma posição FACS de base, para uma posição corretiva, os ossos virtuais podem cada um ter um CFrame que transforma o CFrame inicial dos ossos na posição de ligação do mesh para o CFrame para aquele FACS corretivo.

Limitações

EditableMesh atualmente tem um limite de 60.000 vértices e 20.000 triângulos. Tentar adicionar muitos vértices ou triângulos causará um erro.

Resumo

Propriedades

  • Somente leitura
    Não replicado
    Segurança Roblox
    Ler Parallel

    Retorna true se uma malha for de tamanho fixo.

Métodos

Propriedades

FixedSize

Somente leitura
Não replicado
Segurança Roblox
Ler Parallel

Malhas de tamanho fixo permitem alterar os valores de atributos de vértice, mas não permitem que vértices e triângulos sejam adicionados ou excluídos.

Métodos

AddColor

Adiciona uma nova cor à geometria e retorna um ID de cor estável.

Parâmetros

color: Color3

The new color. Nova cor

Valor Padrão: ""
alpha: number

A cor alfa (transparência).

Valor Padrão: ""

Devolução

ID de cor estável da nova cor.

AddNormal

Adiciona um novo normal à geometria e retorna um ID normal estável. Se o valor normal não for especificado, o normal será calculado automaticamente.

Parâmetros

normal: Vector3

O vetor normal. Se o valor normal não for especificado, o normal será calculado automaticamente.

Valor Padrão: ""

Devolução

ID normal estável do novo normal.

AddTriangle

Adiciona um novo triângulo ao mesh e retorna uma ID de rosto estável.

Parâmetros

vertexId0: number

ID do primeiro vértice do triângulo.

Valor Padrão: ""
vertexId1: number

ID do segundo vértice do triângulo.

Valor Padrão: ""
vertexId2: number

ID do terceiro vértice do triângulo.

Valor Padrão: ""

Devolução

ID de rosto estável da nova face.

AddUV

Adiciona um novo UV à geometria e retorna um ID UV estável.

Parâmetros

A nova coordenada UV.

Valor Padrão: ""

Devolução

ID UV estável do novo UV.

AddVertex

Adiciona um novo vértice à geometria e retorna um ID de vértice estável.

Parâmetros

Posição no espaço de objeto local da malha.

Valor Padrão: ""

Devolução

ID de vértice estável do novo vértice.

Destroy

()

Destrói o conteúdo do mesh, imediatamente recuperando memória usada.


Devolução

()

FindClosestPointOnSurface

Encontra o ponto mais próximo na superfície do mesh.Retorna o ID do rosto, aponta para o mesh no espaço de objeto local e a coordenada barycentrica da posição dentro do rosto.Veja RaycastLocal() para mais informações sobre coordenadas barycêtricas.

Parâmetros

point: Vector3

Posição de ponto no espaço de objeto local da malha.

Valor Padrão: ""

Devolução

Tuple da identificação do rosto, ponto no espaço de objeto local e a coordenada barycentrica da posição dentro do rosto.

FindClosestVertex

Encontra o vértice mais próximo de um ponto específico no espaço e retorna um ID de vértice estável.

Parâmetros

toThisPoint: Vector3

Posição de ponto no espaço de objeto local da malha.

Valor Padrão: ""

Devolução

ID de vértice estável mais próximo ao ponto especificado no espaço.

FindVerticesWithinSphere

Encontra todos os vértices dentro de uma esfera específica e retorna uma lista de IDs estáveis de vértice.

Parâmetros

center: Vector3

Centro da esfera no espaço de objeto local do mesh.

Valor Padrão: ""
radius: number

Raio da esfera.

Valor Padrão: ""

Devolução

Lista de IDs de vértice estáveis dentro da esfera solicitada.

GetAdjacentFaces

Dada uma ID de rosto estável, retorna uma lista de rostos adjacentes.

Adjacent faces indicated around requested face

Parâmetros

faceId: number
Valor Padrão: ""

Devolução

Lista de IDs de rosto adjacente ao rosto dado.

GetAdjacentVertices

Dada uma ID de vértice estável, retorna uma lista de vértices adjacentes.

Adjacent vertices indicated around requested vertex

Parâmetros

vertexId: number

ID de vértice ao redor do qual obter vértices adjacentes.

Valor Padrão: ""

Devolução

Lista de IDs de vértices adjacentes ao redor do ID de vértice dado.

GetCenter


Devolução

Centro da caixa de delimitação do EditableMesh .

GetColor

Retorna a cor para o ID de cor dado.

Parâmetros

colorId: number

ID de cor para obter a cor.

Valor Padrão: ""

Devolução

Cor para o ID de cor estável solicitado.

GetColorAlpha

Retorna a cor alfa (transparência) no ID de cor estável dado.

Parâmetros

colorId: number

ID de cor para obter o alfa.

Valor Padrão: ""

Devolução

Alfa de cor na ID estável de cor do pedido.

GetColors

Retorna todas as cores do mesh como uma lista de IDs de cores estáveis.


Devolução

Lista de IDs de cores estáveis.

GetFaceColors

Retorna os IDs de cores do rosto para os vértices no rosto.

Parâmetros

faceId: number

ID de rosto para obter os IDs de cores.

Valor Padrão: ""

Devolução

Lista de IDs de cores usados para os vértices no rosto dado.

GetFaceNormals

Retorna os IDs normais do rosto para os vértices na face.

Parâmetros

faceId: number

ID de rosto para obter os IDs normais.

Valor Padrão: ""

Devolução

Lista de IDs normais usados para os vértices no rosto dado.

GetFaceUVs

Retorna os IDs UV do rosto para os vértices no rosto.

Parâmetros

faceId: number

ID de rosto para obter os IDs de UV.

Valor Padrão: ""

Devolução

Lista de IDs de UV usados para os vértices no rosto dado.

GetFaceVertices

Retorna os IDs de vértice do rosto.

Parâmetros

faceId: number
Valor Padrão: ""

Devolução

Lista de IDs de vértice ao redor do rosto dado.

GetFaces

Retorna todos os rostos da malha como uma lista de IDs estáveis de rosto.


Devolução

Lista de IDs de rosto estáveis.

GetNormal

Retorna o vetor normal para o ID normal dado.

Parâmetros

normalId: number

ID normal para obter o vetor normal.

Valor Padrão: ""

Devolução

Vetor normal no ID normal solicitado.

GetNormals

Retorna todos os normais da malha como uma lista de IDs normais estáveis.


Devolução

Lista de IDs normais estáveis.

GetPosition

Obtém a posição de um vértice no espaço de objeto local da malha.

Parâmetros

vertexId: number

ID de vértice estável para obter a posição.

Valor Padrão: ""

Devolução

Posição de um vértice no espaço de objeto local da malha.

GetSize


Devolução

Tamanho do EditableMesh .

GetUV

Retorna coordenadas UV na ID UV dada.

Parâmetros

uvId: number

ID UV para o qual obter a coordenada UV.

Valor Padrão: ""

Devolução

Coordenadas UV na ID UV solicitada.

GetUVs

Retorna todos os UVs da malha como uma lista de IDs UV estáveis.


Devolução

Lista de IDs UV estáveis.

GetVertices

Retorna todos os vértices como uma lista de IDs estáveis de vértice.


Devolução

Lista de IDs de vértice estáveis.

IdDebugString

Retorna uma string que descreve um ID estável, útil para fins de depuração, como f17 ou v12, que contém o tipo, o número de ID e a versão.

Parâmetros

id: number

ID para o qual retornar uma string de informação de depuração.

Valor Padrão: ""

Devolução

Texto que descreve o ID em formato legível por humanos.

MergeVertices

Map

Funde vértices que se tocam, para usar um único ID de vértice, mas manter os outros IDs de atributo originais.

Parâmetros

mergeTolerance: number

A distância em que os vértices são considerados para tocar uns aos outros.

Valor Padrão: ""

Devolução

Map

Uma mapeamento de antigo ID de vértice para novo ID de vértice para vértices que foram mesclados.

RaycastLocal

Lança um raio e retorna um ponto de interseção, ID de rosto e coordenadas barycêtricas.Os inputs e outputs deste método estão no espaço de objeto local da malha.

Uma coordenada barycentrica é uma maneira de especificar um ponto dentro de um rosto como uma combinação pesada dos 3 vértices do rosto.Isso é útil como uma maneira geral de misturar os atributos de vértice.Veja o exemplo de código deste método como uma ilustração.

Parâmetros

origin: Vector3

Origem do raio no espaço de objeto local da malha.

Valor Padrão: ""
direction: Vector3

Direção do raio.

Valor Padrão: ""

Devolução

Tuple do ponto de interseção, ID do rosto e coordenadas barycêtricas.

Amostras 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

()

Remove um rosto usando seu ID de rosto estável.

Parâmetros

faceId: number
Valor Padrão: ""

Devolução

()

RemoveUnused

Remove todos os vértices, normais, UVs e cores que não são usados em qualquer rosto e retorna os IDs removidos.


Devolução

Todos os IDs estáveis removidos.

ResetNormal

()

Redefina esse ID normal para ser automaticamente calculado com base na forma da malha, em vez de ser definido manualmente.

Parâmetros

normalId: number

ID normal estável para redefinir.

Valor Padrão: ""

Devolução

()

SetColor

()

Define a cor para um ID de cor.

Parâmetros

colorId: number

ID de cor estável para definir a cor.

Valor Padrão: ""
color: Color3

Cor para definir.

Valor Padrão: ""

Devolução

()

SetColorAlpha

()

Define a cor alfa (transparência) para um ID de cor.

Parâmetros

colorId: number

ID de cor estável para definir a alfa de cor.

Valor Padrão: ""
alpha: number

Alpha para definir.

Valor Padrão: ""

Devolução

()

SetFaceColors

()

Define as cores do vértice do rosto para novos IDs de cores.

Parâmetros

faceId: number

ID de rosto para atualizar as cores do vértice.

Valor Padrão: ""
ids: Array

Lista de novos IDs estáveis de cores para usar para os vértices do rosto dado.

Valor Padrão: ""

Devolução

()

SetFaceNormals

()

Define os vértices normais do rosto para novas identidades normais.

Parâmetros

faceId: number

ID de rosto para atualizar os normais de vértice.

Valor Padrão: ""
ids: Array

Lista de novos IDs estáveis normais para usar para os vértices do rosto dado.

Valor Padrão: ""

Devolução

()

SetFaceUVs

()

Define os UVs de vértice do rosto para novos IDs de UV.

Parâmetros

faceId: number

ID de rosto para atualizar os UVs de vértice.

Valor Padrão: ""
ids: Array

Lista de novos IDs estáveis de UV para usar para os vértices do dado rosto.

Valor Padrão: ""

Devolução

()

SetFaceVertices

()

Define os vértices do rosto para novos IDs de vértice.

Parâmetros

faceId: number

ID de rosto para atualizar os vértices.

Valor Padrão: ""
ids: Array

Lista de novos IDs estáveis de vértice para usar para o rosto dado.

Valor Padrão: ""

Devolução

()

SetNormal

()

Defina o normal para um ID normal. Isso mudará o valor normal para cada vértice de rosto que estiver usando o ID normal.

Parâmetros

normalId: number

ID normal estável para o qual definir o vetor normal.

Valor Padrão: ""
normal: Vector3

Vetor normal para definir.

Valor Padrão: ""

Devolução

()

SetPosition

()

Define uma posição de vértice no espaço de objeto local da malha.

Parâmetros

vertexId: number

ID de vértice estável do vértice para posicionar.

Valor Padrão: ""

Posição no espaço de objeto local da malha.

Valor Padrão: ""

Devolução

()

SetUV

()

Define as coordenadas UV para um ID UV.

Parâmetros

uvId: number

ID UV para o qual definir as coordenadas UV.

Valor Padrão: ""

Coordenadas do UV.

Valor Padrão: ""

Devolução

()

Triangulate

()

Dividi todas as faces na malha para serem triângulos.Atualmente, isso não faz nada desde que apenas triângulos podem ser criados, mas se o seu código depender de triângulos, é recomendado que você chame esse método após chamar AssetService:CreateEditableMeshAsync() .


Devolução

()

Eventos