2
0

Animation-system.html 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. <!DOCTYPE html>
  2. <html lang="it">
  3. <head>
  4. <meta charset="utf-8" />
  5. <base href="../../../" />
  6. <script src="page.js"></script>
  7. <link type="text/css" rel="stylesheet" href="page.css" />
  8. </head>
  9. <body>
  10. <h1>Sistema di animazione ([name])</h1>
  11. <h2>Panoramica</h2>
  12. <p class="desc">
  13. Con il sistema di animazione di three.js si possono animare varie proprietà dei modelli:
  14. le ossa di un [page:SkinnedMesh modello skinned], i target morph, le diverse proprietà dei materiali
  15. (colori, opacità, booleani), la visibilità e le trasformazioni. Le proprietà di animazione possono essere
  16. sfumate, incrociate e deformate. Il peso e la scala temporale di diverse animazioni simultanee sullo stesso
  17. oggetto o su oggetti diversi possono essere modificate in modo indipendente. È possibile sincronizzare
  18. diverse animazioni sullo stesso oggetto e su oggetti diversi.<br /><br />
  19. Per ottenere tutto questo in un sistema omogeneo, il [link:https://github.com/mrdoob/three.js/issues/6881 sistema di animazione di three.js]
  20. è stato cambiato completamente nel 2015 (attenzione alle informazioni non aggiornate!), ed ora ha un'architettura simile a quella di Unity/Unreal Engine 4.
  21. Questa pagina fornisce una breve panoramica dei componenti principali del sistema e di come lavorano insieme.
  22. </p>
  23. <h3>Clip di animazione (AnimationClips)</h3>
  24. <p class="desc">
  25. Se si è importato con successo un oggetto 3D animato (non importa se ha ossa o target morph o entrambi)
  26. - per esempio esportandolo da Blender con [link:https://github.com/KhronosGroup/glTF-Blender-IO l'exporter glTF Blender] e caricandolo
  27. nella scena three.js usando [page:GLTFLoader] - uno dei campi di risposta dovrà essere un array chiamato "animations", contenente
  28. gli [page:AnimationClip AnimationClips] per questo modello (vedi l'elenco dei possibili loader qui sotto).<br /><br />
  29. Ogni `AnimationClip` contiene solitamente i dati per una certa attività dell'oggetto. Se la mesh è un personaggio,
  30. per esempio, ci può essere un AnimationClip per la camminata, un altro per il salto e un terzo per il salto laterale e così via.
  31. </p>
  32. <h3>Keyframe Tracks</h3>
  33. <p class="desc">
  34. All'interno di un `AnimationClip` i dati, per ogni propietà di animazione, sono memorizzati in un [page:KeyframeTrack] separato.
  35. Supponendo che un oggetto personaggio abbia uno [page:Skeleton scheletro], un keyframe track potrebbe memorizzare i dati relativi alle variazioni di
  36. posizione dell'osso inferiore del braccio nel tempo, un'altra traccia potrebbe memorizzare i dati relativi alle variazioni di rotazione dello stesso osso,
  37. una terza traccia la posizione, la rotazione e la scala di un altro osso e così via. Dovrebbe essere chiaro, che un AnimationClip può essere composto
  38. da molte tracce di questo tipo.<br /><br />
  39. Supponendo che il modello abbia dei target morph (per esempio un target morph che mostra una faccia amichevole e un altro che mostra una faccia arrabbiata),
  40. ogni traccia contiene le informazioni su come l'influenza di un certo target morph cambia durante l'esecuzione del clip.
  41. </p>
  42. <h3>Mixer di Animazioni</h3>
  43. <p class="desc">
  44. I dati memorizzati costituiscono solo la base per le animazioni - la riproduzione vera e propria è controllata dall'[page:AnimationMixer].
  45. È possibile immaginarlo non solo come un lettore di animazioni, ma come un simulatore di un hardware come una vera e propria console di mixaggio,
  46. che può controllare diverse animazioni simultaneamente, mescolandole e fondendole.
  47. </p>
  48. <h3>Azioni di Animazioni</h3>
  49. <p class="desc">
  50. Lo stesso `AnimationMixer` ha pochissime proprietà e metodi (generali), perché può essere controllato dall'[page:AnimationAction AnimationActions].
  51. Per configurare un `AnimationAction` è necessario specificare quando un `AnimationClip` deve essere eseguito, messo in pausa o stoppato su uno dei mixer,
  52. se e con quale frequenza la clip deve essere ripetuta, se deve essere eseguita con una dissolvenza o una scala temporale e altre cose aggiuntive come
  53. dissolvenza incrociata o sincronizzazione.
  54. </p>
  55. <h3>Gruppi di oggetti Animati</h3>
  56. <p class="desc">
  57. Se si desidera che un gruppo di oggetti riceva uno stato di animazione condiviso, è possibile utilizzare un [page:AnimationObjectGroup].
  58. </p>
  59. <h3>Formati supportati e Loader</h3>
  60. <p class="desc">
  61. Si noti che non tutti i formati includono le animazioni (in particolare OBJ non lo fa) e che solo alcuni loader di three.js
  62. supportano le sequenze [page:AnimationClip AnimationClip]. Di seguito alcuni che supportano questo tipo di animazioni:
  63. </p>
  64. <ul>
  65. <li>[page:ObjectLoader THREE.ObjectLoader]</li>
  66. <li>THREE.BVHLoader</li>
  67. <li>THREE.ColladaLoader</li>
  68. <li>THREE.FBXLoader</li>
  69. <li>[page:GLTFLoader THREE.GLTFLoader]</li>
  70. <li>THREE.MMDLoader</li>
  71. </ul>
  72. <p class="desc">
  73. Si noti che 3ds max e Maya attualmente non possono esportare più animazioni (ovvero animazioni che non si trovano nella stessa timeline)
  74. direttamente in un singolo file.
  75. </p>
  76. <h2>Esempio</h2>
  77. <code>
  78. let mesh;
  79. // Create an AnimationMixer, and get the list of AnimationClip instances
  80. const mixer = new THREE.AnimationMixer( mesh );
  81. const clips = mesh.animations;
  82. // Update the mixer on each frame
  83. function update () {
  84. mixer.update( deltaSeconds );
  85. }
  86. // Play a specific animation
  87. const clip = THREE.AnimationClip.findByName( clips, 'dance' );
  88. const action = mixer.clipAction( clip );
  89. action.play();
  90. // Play all animations
  91. clips.forEach( function ( clip ) {
  92. mixer.clipAction( clip ).play();
  93. } );
  94. </code>
  95. </body>
  96. </html>