3D骨骼系统的几种用例的配置方案

我前面已经总结了两篇文章来研究3D骨骼系统的底层实现原理运作机制。本文来探索一下3D骨骼系统的实际应用问题。这里提出几种实际的应用情况与3D骨骼系统的配置方案。

对所有的实际3D骨骼应用情况,我们分两种情况,第一,骨骼与被控对象位置重和的情况。第二,骨骼与被控对象分离的情况。第一种情况对应着three.js系统中skinnedMesh.bindMode === 'attached', 第二种情况对应skinnedMesh.bindMode === 'detached'。看下图示例:

其中,红色的线条代表骨骼,黑色的代表SkinnedMesh。在attached模式下,被控对象通过bindMatrix移动到骨骼所在位置,然后骨骼的运动直接控制几何顶点的运动。在实际应用中为了实现这种方案,我们有两种方案。

  1. 把受控对象的位置直接调整到骨骼所在的位置,然后只需要运行skinnedMesh.bind(skeleton)绑定起来即可。或者先把受控对象初始位置摆好,然后再配置好骨骼的位置来匹配这些受控对象。
  2. 先把骨骼摆好,然后每一个受控对象通过配置一个bindMatrix,将受控对象移动到骨骼的相应位置。此时,需要skinnedMesh.bind(skeleton, bindMatrix)

在有的情况,被控对象与骨骼在位置上是不直接影响的。我们希望骨骼的运动在跨越一段空间后再同步的去影响受控对象。此时就需要detached模式了。如上图右边所示,如果我们希望骨骼绕自己转30度,受控对象也绕自己的某个点转30度。假设,受控对象的该点到骨骼的转移矩阵为M,那么我们就需要这样来配置骨骼系统了:

skinnedMesh.bind(skeleton, M)
skinnedMesh.bindMode = 'detached'

需要注意的是,这里的M是不考虑skinnedMesh的matrixWorld在内的转移矩阵。detached模式下,matrixWorld是自由的,能够完全决定skinnedMesh所在的位置。

detach的绑定模式下,可以轻松的实现一个骨架控制多个处于不同位置的受控对象做同步运动。

发表评论

邮箱地址不会被公开。 必填项已用*标注