animation-system.html 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. <!DOCTYPE html><html lang="zh"><head>
  2. <meta charset="utf-8">
  3. <title>动画系统</title>
  4. <meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
  5. <meta name="twitter:card" content="summary_large_image">
  6. <meta name="twitter:site" content="@threejs">
  7. <meta name="twitter:title" content="Three.js - 动画系统">
  8. <meta property="og:image" content="https://threejs.org/files/share.png">
  9. <link rel="shortcut icon" href="../../files/favicon_white.ico" media="(prefers-color-scheme: dark)">
  10. <link rel="shortcut icon" href="../../files/favicon.ico" media="(prefers-color-scheme: light)">
  11. <link rel="stylesheet" href="../resources/lesson.css">
  12. <link rel="stylesheet" href="../resources/lang.css">
  13. <link rel="stylesheet" href="/manual/zh/lang.css">
  14. <script type="importmap">
  15. {
  16. "imports": {
  17. "three": "../../build/three.module.js"
  18. }
  19. }
  20. </script>
  21. </head>
  22. <body>
  23. <div class="container">
  24. <div class="lesson-title">
  25. <h1>动画系统</h1>
  26. </div>
  27. <div class="lesson">
  28. <div class="lesson-main">
  29. <h2>概述</h2>
  30. <p class="desc">
  31. 在 three.js 的动画系统中,你可以为模型的多种属性制作动画:
  32. 例如蒙皮绑定模型的骨骼、形态目标(morph targets)、不同材质属性
  33. (颜色、不透明度、布尔值)、可见性与变换。动画属性可以淡入、
  34. 淡出、交叉淡化(crossfade)和变速。即使是同一对象上的多个动画,
  35. 或不同对象上的多个动画,也可以独立调整权重和时间缩放,
  36. 并进行同步。<br /><br />
  37. 为了在一个统一系统中实现这些功能,three.js 动画系统在
  38. 2015 年[link:https://github.com/mrdoob/three.js/issues/6881 发生了彻底重构]
  39. (注意甄别过时资料)。当前架构与 Unity / Unreal Engine 4
  40. 更接近。本页将简要介绍该系统的核心组件,以及它们如何协同工作。
  41. </p>
  42. <h3>动画片段(Animation Clips)</h3>
  43. <p class="desc">
  44. 当你成功导入一个带动画的 3D 对象后(无论它使用骨骼、形态目标,或两者兼有),
  45. 比如通过 [link:https://github.com/KhronosGroup/glTF-Blender-IO glTF Blender 导出器]
  46. 从 Blender 导出,再使用 `GLTFLoader` 加载到 three.js 场景中,
  47. 返回结果中通常会有一个名为 "animations" 的数组字段,
  48. 其中包含该模型的动画片段(下文会列出支持此能力的加载器)。<br /><br />
  49. 每个 `AnimationClip` 一般表示对象的一种动作数据。以角色模型为例,
  50. 可以有一个片段表示走路,第二个表示跳跃,第三个表示侧移,等等。
  51. </p>
  52. <h3>关键帧轨道(Keyframe Tracks)</h3>
  53. <p class="desc">
  54. 在 `AnimationClip` 内部,每个被动画驱动的属性都会存储在独立的
  55. `KeyframeTrack` 中。假设角色有骨架,那么一条轨道可以记录前臂骨骼
  56. 随时间变化的位置数据,另一条记录同一骨骼的旋转变化,第三条记录
  57. 其他骨骼的位置、旋转或缩放,依此类推。也就是说,
  58. 一个 AnimationClip 通常由大量此类轨道组成。<br /><br />
  59. 如果模型有形态目标(比如一个表示微笑,另一个表示愤怒),
  60. 每条相关轨道会描述某个形态目标在该片段播放过程中,
  61. 其影响权重如何随时间变化。
  62. </p>
  63. <h3>动画混合器(Animation Mixer)</h3>
  64. <p class="desc">
  65. 这些存储的数据只是动画基础,真正的播放控制由 `AnimationMixer` 完成。
  66. 你可以把它理解成不只是一个“播放器”,更像一台真实的混音台:
  67. 能够同时控制多个动画,并对它们进行混合与融合。
  68. </p>
  69. <h3>动画动作(Animation Actions)</h3>
  70. <p class="desc">
  71. `AnimationMixer` 本身只有少量通用属性和方法,
  72. 因为它主要通过动画动作来驱动。通过配置 `AnimationAction`,
  73. 你可以决定某个 `AnimationClip` 在某个 mixer 上何时播放、暂停或停止,
  74. 是否循环、循环次数、是否淡入淡出、是否进行时间缩放,
  75. 以及更多高级控制(如交叉淡化与同步)。
  76. </p>
  77. <h3>动画对象组(Animation Object Groups)</h3>
  78. <p class="desc">
  79. 如果你希望一组对象共享同一套动画状态,
  80. 可以使用 `AnimationObjectGroup`。
  81. </p>
  82. <h3>支持的格式与加载器</h3>
  83. <p class="desc">
  84. 请注意,并非所有模型格式都包含动画(例如 OBJ 就不包含),
  85. 而且只有部分 three.js 加载器支持 `AnimationClip` 序列。
  86. 下面这些加载器<i>支持</i>这种动画数据:
  87. </p>
  88. <ul>
  89. <li>THREE.ObjectLoader</li>
  90. <li>THREE.BVHLoader</li>
  91. <li>THREE.ColladaLoader</li>
  92. <li>THREE.FBXLoader</li>
  93. <li>THREE.GLTFLoader</li>
  94. </ul>
  95. <p class="desc">
  96. 另外,3ds Max 和 Maya 目前还不能直接将多个动画
  97. (即不在同一时间轴上的动画)导出到同一个文件中。
  98. </p>
  99. <h2>示例</h2>
  100. <pre class="prettyprint notranslate lang-js" translate="no">
  101. let mesh;
  102. // 创建 AnimationMixer,并获取 AnimationClip 列表
  103. const mixer = new THREE.AnimationMixer( mesh );
  104. const clips = mesh.animations;
  105. // 每帧更新 mixer
  106. function update () {
  107. mixer.update( deltaSeconds );
  108. }
  109. // 播放指定动画
  110. const clip = THREE.AnimationClip.findByName( clips, 'dance' );
  111. const action = mixer.clipAction( clip );
  112. action.play();
  113. // 播放全部动画
  114. clips.forEach( function ( clip ) {
  115. mixer.clipAction( clip ).play();
  116. } );
  117. </pre>
  118. </div>
  119. </div>
  120. </div>
  121. <script src="../resources/prettify.js"></script>
  122. <script src="../resources/lesson.js"></script>
  123. </body></html>
粤ICP备19079148号