You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
150 lines
5.6 KiB
150 lines
5.6 KiB
2 years ago
|
<!DOCTYPE html>
|
||
|
<html lang="pt-br">
|
||
|
<head>
|
||
|
<meta charset="utf-8" />
|
||
|
<base href="../../../" />
|
||
|
<script src="page.js"></script>
|
||
|
<link type="text/css" rel="stylesheet" href="page.css" />
|
||
|
</head>
|
||
|
<body>
|
||
|
<h1>Sistema de animação</h1>
|
||
|
|
||
|
<h2>Visão geral</h2>
|
||
|
|
||
|
<p class="desc">
|
||
|
|
||
|
No sistema de animação three.js, você pode animar várias propriedades de seus modelos:
|
||
|
os ossos (bones) de um [page:SkinnedMesh skinned e rigged model], morph targets,
|
||
|
diferentes propriedades de material
|
||
|
(cores, opacidade, booleanos), visibilidade e transformações. As propriedades animadas podem ser utilizadas com fade in,
|
||
|
fade out, crossfaded e warped. As escalas de peso e tempo de diferentes
|
||
|
animações no mesmo objeto, bem como em objetos diferentes, podem ser alteradas
|
||
|
independentemente. Várias animações no mesmo objeto e em objetos diferentes podem ser
|
||
|
sincronizadas.<br /><br />
|
||
|
|
||
|
Para conseguir tudo isso em um sistema homogêneo, o sistema de animação three.js
|
||
|
[link:https://github.com/mrdoob/three.js/issues/6881 mudou completamente em 2015]
|
||
|
(cuidado com informações desatualizadas!), e agora tem uma arquitetura semelhante à
|
||
|
Unity/Unreal Engine 4. Esta página fornece uma breve visão geral dos principais componentes do
|
||
|
sistema e como eles trabalham juntos.
|
||
|
|
||
|
</p>
|
||
|
|
||
|
<h3>Clipes de animação (Animation Clips)</h3>
|
||
|
|
||
|
<p class="desc">
|
||
|
|
||
|
Se você importou com sucesso um objeto 3D animado (não importa se
|
||
|
bones ou morph targets ou ambos) — por exemplo, exportando-o do Blender com o
|
||
|
[link:https://github.com/KhronosGroup/glTF-Blender-IO glTF Blender] e
|
||
|
carregando-o em uma cena three.js usando [page:GLTFLoader] — um dos campos da resposta
|
||
|
deve ser um array chamado "animations", contendo o [page:AnimationClip AnimationClips]
|
||
|
para este modelo (veja uma lista de carregadores possíveis abaixo).<br /><br />
|
||
|
|
||
|
Cada `AnimationClip` geralmente contém os dados de uma determinada atividade do objeto. Se o
|
||
|
mesh é um personagem, por exemplo, pode haver um AnimationClip para caminhar, um segundo
|
||
|
para salto, um terceiro para contornar e assim por diante.
|
||
|
|
||
|
</p>
|
||
|
|
||
|
<h3>Keyframe Tracks</h3>
|
||
|
|
||
|
<p class="desc">
|
||
|
|
||
|
Dentro de tal 'AnimationClip' os dados para cada propriedade animada são armazenados em um
|
||
|
[page:KeyframeTrack] separado. Supondo que um objeto de personagem tenha um [page:Skeleton esqueleto] (skeleton),
|
||
|
uma keyframe track pode armazenar os dados para as mudanças de posição do osso do antebraço
|
||
|
ao longo do tempo, uma faixa diferente dos dados para as mudanças de rotação do mesmo osso, uma terceira
|
||
|
a posição da pista, rotação ou dimensionamento de outro osso, e assim por diante. Deve ficar claro,
|
||
|
que um AnimationClip pode ser composto de muitas dessas tracks.<br /><br />
|
||
|
|
||
|
Supondo que o modelo tenha morph targets (por exemplo, um
|
||
|
morph target mostrando um rosto amigável e outro mostrando um rosto irritado), cada track contém as
|
||
|
informações sobre como a [page:Mesh.morphTargetInfluences influence] de um certo morph target
|
||
|
muda durante a execução do clipe.
|
||
|
|
||
|
</p>
|
||
|
|
||
|
<h3>Animation Mixer</h3>
|
||
|
|
||
|
<p class="desc">
|
||
|
|
||
|
Os dados armazenados formam apenas a base para as animações - a reprodução real é controlada pelo
|
||
|
[page:AnimationMixer]. Você pode imaginar isso não apenas como um player de animações, mas
|
||
|
como uma simulação de um hardware como um mixer real, que pode controlar várias animações
|
||
|
simultaneamente, misturando-os e fundindo-os.
|
||
|
|
||
|
</p>
|
||
|
|
||
|
<h3>Ações de animação (Animation Actions)</h3>
|
||
|
|
||
|
<p class="desc">
|
||
|
|
||
|
O próprio `AnimationMixer` tem muito poucas propriedades e métodos (gerais), porque
|
||
|
pode ser controlado por [page:AnimationAction AnimationActions]. Ao configurar um
|
||
|
`AnimationAction` você pode determinar quando um certo `AnimationClip` deve ser reproduzido, pausado
|
||
|
ou parado em um dos mixers, se e com que frequência o clipe deve ser repetido, seja
|
||
|
executado com um fade ou uma escala de tempo, e algumas coisas adicionais, como crossfading
|
||
|
ou sincronização.
|
||
|
|
||
|
</p>
|
||
|
|
||
|
<h3>Animação de Grupos de Objetos</h3>
|
||
|
|
||
|
<p class="desc">
|
||
|
|
||
|
Se você quiser que um grupo de objetos receba um estado de animação compartilhado, você pode usar um
|
||
|
[page:AnimationObjectGroup].
|
||
|
|
||
|
</p>
|
||
|
|
||
|
<h3>Formatos e Loaders suportados</h3>
|
||
|
|
||
|
<p class="desc">
|
||
|
Observe que nem todos os formatos de modelo incluem animação (notadamente o OBJ não inclui), e que apenas alguns
|
||
|
loaders do three.js suportam sequências [page:AnimationClip AnimationClip]. Vários que <i>tem</i>
|
||
|
suporte para este tipo de animação:
|
||
|
</p>
|
||
|
|
||
|
<ul>
|
||
|
<li>[page:ObjectLoader THREE.ObjectLoader]</li>
|
||
|
<li>THREE.BVHLoader</li>
|
||
|
<li>THREE.ColladaLoader</li>
|
||
|
<li>THREE.FBXLoader</li>
|
||
|
<li>[page:GLTFLoader THREE.GLTFLoader]</li>
|
||
|
<li>THREE.MMDLoader</li>
|
||
|
</ul>
|
||
|
|
||
|
<p class="desc">
|
||
|
Observe que o 3ds max e o Maya atualmente não podem exportar várias animações (ou seja, animações que não estão
|
||
|
na mesma linha do tempo) diretamente para um único arquivo.
|
||
|
</p>
|
||
|
|
||
|
<h2>Exemplo</h2>
|
||
|
|
||
|
<code>
|
||
|
let mesh;
|
||
|
|
||
|
// Create an AnimationMixer, and get the list of AnimationClip instances
|
||
|
const mixer = new THREE.AnimationMixer( mesh );
|
||
|
const clips = mesh.animations;
|
||
|
|
||
|
// Update the mixer on each frame
|
||
|
function update () {
|
||
|
mixer.update( deltaSeconds );
|
||
|
}
|
||
|
|
||
|
// Play a specific animation
|
||
|
const clip = THREE.AnimationClip.findByName( clips, 'dance' );
|
||
|
const action = mixer.clipAction( clip );
|
||
|
action.play();
|
||
|
|
||
|
// Play all animations
|
||
|
clips.forEach( function ( clip ) {
|
||
|
mixer.clipAction( clip ).play();
|
||
|
} );
|
||
|
</code>
|
||
|
|
||
|
</body>
|
||
|
</html>
|