Você pode importar malhas personalizadas para criar tudo, desde NPCs até uma roupa animada de um barco a vela. Nós usamos a configuração personalizada do Avatar Importer (agora o 3D Importer ) para trazer mais personagens personalizados exóticos, como as criaturas misteriosas do buraco negro e os androides amigáveis, se você não estiver consciente deles.
As seções a seguir mostram como usamos modelagem e skinning, PBR (aparência da superfície) e VFX para construir um dos nossos personagens mais complicados que nomeamos o "Creature". Queríamos que fosse brilhante, emitisse alguma luz, tivesse rastros de fumaça de partículas e um movimento de fluido que envolveu modelagem de um rig com juntas suficientes para criar as ondas convencionais de seus tentá
Fixando
Quando estávamos modelando a Criatura, encontramos que era melhor modelar o personagem em uma postura neutral, porque essa postura é melhor para dobrar em várias direções. Se modelássemos a Criatura com seus tentáculos já enrolados, isso levaria à esticagem se animássemos os tentáculos para dobrar na direção oposta. As seguintes capturas de tela mostram a Criatura em seu estado natural:
De uma postura neutra, adicionamos articulados economicamente, focando nas áreas que precisavam de mais movimento. Menos articulados é melhor, porque você terá que gerenciá-los ao manter seu personagem, e você terá menos para controlar quando anima-los. Nas capturas de tela anteriores, a Criatura parece ter muitos articulados no centro, mas o corpo principal só tem um articulação.
A maioria das outras articulações está em direção aos tentáculos e mandíbulas. Com os tentáculos, queríamos muito movimento secundário, ou movimento que é camadas, para criar um efeito convencente de que todos estão se movendo por conta possuir. No entanto, a massa central dos tentáculos estava tão perto umas das outras que sentia-se desperdiçado fazer articulações para todos
Encontramos as seguintes diretrizes úteis, para que o mesmo malha de personagem importe corretamente no Studio:
- Juntas e ossos individuais devem ter nomes únicos.
- Meshes não devem ter o mesmo nome que articulações e ossos.
- Meshes não devem ter transformações antes de skinning / binding; em outras palavras, transformações devem ser 0 e escalas devem ser 1.
- Normal de malha deve ficar para fora (o modelo não deve olhar para dentro).
- Esqueletos não devem ter nenhum fator de escala; todos os conjuntos devem ser [1, 1, 1].
Envelhecimento
Quando terminamos o esqueleto da criatura, o próximo passo foi pintar o malha. Pintar pode ser uma tarefa árdua, então para facilitar as coisas, é melhor estar familiarizado com as diferentes configurações de pele inicial do seu aplicativo DCC para encontrar a que você gosta. Como este é um personagem orgânico, nós pintamos com muito pouco espaço de queda em cada articulação e sobre
Encontramos as seguintes diretrizes que produziram os melhores resultados para skinning:
- Efeitos de skinning (que afetam uma parte do modelo quando movida) devem ser um máximo de 4 efeitos por vértice.
- Nomes de joint e meshes precisam ser únicos, tanto dentro de cada um quanto entre cada um.
- Qualquer peito que você queira importar no Studio deve ter alguma influência na skinning do modelo, caso contrário, o motor não importará. Sempre que possível, skin seu modelo em sua posição original ou "Conectar / Vincular".
Importando o Mesh para o Studio
Importar seus personagens personalizados no Studio é uma das partes mais emocionantes do processo, porque você pode ver suas criações na experiência que você está construção / simulação!
Para importar o mesmo para o Studio:
Exporte o personagem da aplicação DCC e certifique-se de seguindo:
- Todos os normais, escalas e nomes estão corretos.
- O personagem tem todas as camadas de ossos e articulações e todos os meshes.
- Meshes estão todos abaixo de 10.000 triângulos para cada parte da malha.
- O tamanho total da malha não é maior que 2000 unidades em qualquer eixo.
- Veja Requisitos de Malha para uma lista completa de especificações do modelo.
No Importador 3D, importe o arquivo personalizado .fbx ou .obj.
Fazendo a Criatura Brilhar
Quando o modelo da criatura foi estável e não exigiu mais importações imediatas no Studio, começamos a montar os objetos de Superfície, luzes e efeitos visuais. Fiz isso para garantir que a qualidade do modelo fosse boa antes de proceder à colocação e edição de qualquer aspecto dele.
Sabíamos que queríamos que a Criatura fosse escura, e os pontos focais para serem os olhos e seus "grabby" tentáculos. Pontos altos de contraste tendem a atrair a atenção, então ter alguns fortes garante que o visualizador saiba o que focar. O Studio suporta materiais neon que se iluminam, então no início separamos os olhos para que pudessem ser seus próprios materiais do
O material neon não emite luz real, então depois de alguns testes, adicionamos peças separadas para controlar a direção e direção da emissão de luz. Isso garantiu que a iluminação fosse direcionada de uma maneira para melhorar o brilho dos olhos e também projetar sua própria fonte de luz.
Observe que os SpotLights adicionam brilho visual à criatura perto de outras superfícies ou de um jogador.
Além disso, queríamos que os tentáculos da criatura emitissem algumas partículas, para que ela deixasse um rastro de fumaça quando se movia. Como os tentáculos são muito longos, adicionar o ParticleEmitter ao longo de todo o tentáculo faria com que as partículas fossem emitidas de todo o tentáculo, em vez do dorso. Para combatê-lo, usamos uma pe
Fazendo o VFX Seguir o Personagem
As posições de malha do personagem de pele não são atualizadas quando as animações de criaturas são atualizadas, então precisávamos de um método para garantir que o VFX, SFX e luzes todas seguissem o criaturas corretamente. Para alcançar isso, criamos um script de controle de VFX e usamos o CollectionService para informar as peças que contêm o VFX onde os ossos da criatura estão e para seguir.
Colocamos o seguinte LocalScript em StarterPlayer → StarterPlayerScripts . Isso basicamente executa a função de atualização de VFX.
Script Local-- Adicione este script à um script local existente que faz PreSimulation-- conexõeslocal RunService = game:GetService("RunService")local vfx = require(workspace.VfxUpdateModule)RunService.PreSimulation:Connect(vfx.updateVfx)Script de Módulo-- Este módulo conectou peças às animações para que elas sejam atualizadas como-- animação de joga. É um workaround para as limitações atuais-- com articulações e ossos e não será sempre necessário.---- Prerequisitos:-- Para ser incluído, os modelos precisam da tag "AnimatedVfxModel" e um pasta-- de todas as peças que você deseja sincronizar com animações. Cada peça precisa-- um atributo chamado "AttachedBoneName" que se refere ao nome do-- osso que você quer anexar. Partes também devem estar em seus-- posições corretas em relação ao ossos desejados.---- Para usar:-- Um LocalScript deve exigir este módulo, então conecte-- VfxUpdateModule.updateVfx para o evento RunService.PreSimulation.local VfxUpdateModule = {}local CollectionService = game:GetService("CollectionService")-- CONFIGURAR - isso deve ser executado uma vez em cada cliente.-- Colete todos os modelos com a etiquetalocal vfxModels = CollectionService:GetTagged("AnimatedVfxModel")local vfxTable = {} -- onde armazenaremos todas as peças e deslocamentos-- Atribua uma tabela a cada modelo que contém todas as peças de efeitos e deslocamentofor _, model in vfxModels dovfxTable[model] = {}local vfxParts = model:FindFirstChild("VFX"):GetChildren() -- Encontre o diretório vfx-- Encontre o osso via atributo e cálculo o deslocamento para cada peça.for _,part in vfxParts dolocal name = part:GetAttribute("AttachedBoneName")local bone = model:FindFirstChild(name, true)if bone thenlocal offset = (bone.TransformedWorldCFrame:inverse() * part.CFrame)vfxTable[model][part] = {bone, offset}elsewarn("Vfx part refers to bone that could not be found.")endendendprint(vfxTable)-- UPDATE - Isso deve ser linkado para o RunService.PreSimulation de cada cliente.-- Vá através de todos os modelos e depois atualize todas as peças no modelo para corresponder ao bonecframe.function VfxUpdateModule.updateVfx()for model, vfxParts in vfxTable dofor part, bone in vfxParts dopart.CFrame = bone[1].TransformedWorldCFrame * bone[2]endendendreturn VfxUpdateModuleCriamos um VFXUpdateModule ModuleScript para dizer a qualquer objeto atribuído apropriadamente com AnimatedVfxModel para atualizar em um evento de jogo.
Nós marcamos os grupos de modelos necessários com o AnimatedVfxModel usando o Editor de Tag , acessível a partir da aba Vista. Usar tags permite que o 1> VFXUpdateModule1> saiba qual objeto procurar como primeiro filho VFX e aplique a atualização.
Finalmente, adicionamos um atributo AttachedBoneName personalizado à peça que queríamos animação e adicionamos o nome preciso da articulação que queríamos que fosse seguir.
Texturando a Criatura
Em seguida, configuramos os mapas de textura PBR (Physically Baseados Rendered). Esses mapas de textura poderosos dão à criatura as várias tonalidades de tom e variações de superfície para fazer com que ela pareça ter muitos pequenos picos e imperfeições. Este efeito visual ajuda a vender a aparência da criatura quando ela estiver mais perto do jogador.
Aqui estão como criamos os mapas de textura da aparência da superfície:
Os mapas de textura para este personagem estavam todos em um "sheet" por mapa. Isso fez com que a criatura fosse mais eficiente e significasse que tínhamos que lidar com menos mapas de textura ou SurfaceAppearance objetos.
Para áreas que precisavam brilhar ou serem auto-iluminadas, como os "tentáculos de arco-íris", também usamos transparência na SurfaceAppearance para misturar com essas peças.
Achemos útil seguir essas diretrizes ao criar mapas de textura de superfície:
- Certifique-se de que seus mapas não sejam maiores que 1024×1024.
- Seu canal verde pode precisar ser invertido dependendo da aplicação em que você trabalhou.
Animando a Criatura
Animar é muito subjetivo e tem um estilo pessoal. As opções incluem capturarde movimento, animação de "key frame" personalizada em seu aplicativo DCC ou usando o Editor de Animação poderoso do Studio.
Como mencionamos anteriormente, queríamos ter juntas suficientes para movimento de fluido, bem como limbes suficientes, para que a animação de criatura se sentisse natural e "camadas". A camada, também conhecida como movimento secundário, é algo que você vê na vida real - quando você estica seu braço para fora, cada articulação está reagindo ao impulso inicial do seu braço superior e cada articulação em seu corpo não se move ou descansa ao mesmo tempo.
Usamos essa técnica para animação da criatura para se sentir como se os membros estivessem reagindo ao movimento gerado por seu corpo, como mostrado aqui:
Se usando um aplicativo de DCC externo para animações, encontramos que as seguintes diretrizes funcionam melhor:
- Definir taxas de quadro para pelo menos 30 FPS.
- Crie suas animações com o mesmo personagem que você está aplicando.
- Exporte seus dados de animação como um arquivo separado .fbx.
Como animamos o personagem fora do Studio, precisávamos usar o Editor de Animação para importar o arquivo de animação .fbx. O editor permite que você selecione qualquer avatar com articulados ou motores e o dirija via pontos no tempo.
Para importar uma animações:
Na aba Plugins, selecione o Editor de animação.
Selecione o personagem modelado que você deseja anunciar no Roblox. O personagem deve ser o mesmo que você está modelando em sua aplicação DCC externa.
Clique no botão na seção superior esquerda da janela do editor, selecione Importar Animação FBX e localize o seu arquivo de animação exportado .fbx.
Quando você estiver feliz com sua animações, você pode exportá-la para descobrir o ID da animação, que você pode usar em scripts do Roblox para executá-los. Por exemplo, você pode adicionar um Script ao grupo de modelos do personagem importado e usar o seguinte código para executar a animações:
local animationId = "YOUR_ANIMATION_ID"local char = script.Parentlocal animController = char:FindFirstChildWhichIsA("Humanoid") or char:FindFirstChildOfClass("AnimationController")local animation = Instance.new("Animation")animation.AnimationId = "rbxassetid://" .. tostring(animationId)local animTrack = animController:LoadAnimation(animation)animTrack:Play(0, 1, 1)
Resultados finais
Depois de alguns ajustes finais para cores, brilhos de luz e alguns efeitos de partículas para dar a você um efeito de halo mais forte na frente das janelas, aqui está o resultado final na estação espacial!