* 简易骨骼动画:

Mesh当前帧顶点 = Mesh绑定时顶点 * 绑定时骨骼的变换到本帧骨骼的变换的改变量。

= Mesh绑定时顶点 * 绑定时骨骼的变换的逆矩阵 * 本帧的骨骼变换。

= Mesh绑定时顶点 * 绑定时骨骼的变换的逆矩阵 * 本帧的骨骼相对父节点的变换 * 本帧父骨骼的变换。

其中,

Mesh绑定时顶点:由Max导出。

绑定时骨骼的变换的逆矩阵:从Max的Skin Modifier的GetBoneInitTM中取得(或者Physique Modifier的GetInitNodeTM中取得)矩阵。

本帧的骨骼相对父节点的变换:从Max的骨骼的NodeTM和父骨骼的NodeTM得到,注意对于行矩阵,矩阵顺序是 ParentToChild = ChildToWorld * Inverse(ParentToWorld)。列矩阵则相反,根节点则直接保存NodeTM即可。帧之间的插值也主要是对这些数据做插值,在两帧之间没有很大变化的时候,四元数加向量和矩阵视觉上并没有很大差别。

本帧父骨骼的变换:由前面从根节点累加。

(摘自:http://www.cnblogs.com/linyizsh/archive/2011/03/22/1991343.html)

相信大家如果在使用或者看别人使用3Ds Max做骨骼动画的时候,多多少少应该见过美术做模型的时候,在没有绑定骨骼之前,角色蒙皮的手通常都是平举着的。加上Skin或者Physique修改器后,蒙皮的姿势通常就是第0帧了。那么在Max导出骨骼动画的时候,这个手平举着的姿势是算是第几帧呢?又是对应具体哪些数据呢?这个问题,在我开始做骨骼动画前,问过老宋,不过不知道当时是我稀里糊涂还是老宋稀里糊涂,反正没弄明白,折腾了好久,终于在2005年下半年弄明白了。不过过了这么多年,感觉自己很健忘,今天收拾那个古老而庞大的3Ds Max Exporter,终于又逼我整理了一遍思路,笔记如下。
  我们知道,3Ds Max 的骨骼动画修改器常用的有两个: Skin和Physique。 
  在Physique里的IPhyBlendedRigidVertex通过IPhyBlendedRigidVertex::GetOffsetVector能拿到该顶点相对于某块骨骼的偏移位置,通常,我们把这个偏移乘上GetInitNodeTM获得的骨骼矩阵再乘上骨骼权重,并累加,就能得到初始位置。 
  在Skin修改器里,我们并没有这样的GetOffsetVector,而是只能通过Mesh获得第0帧的数据。

  那么他们的区别在哪里呢?
  实际上,Physique GetOffsetVector获得的就是角色手平举的时候的蒙皮位置,称为Init Pose。Skin只能直接获得第0帧数据(跟获取Static Mesh一样的方法).
  但是,在Physique里我们完全也可以采用跟Skin里同样的方法来提取数据而不需要使用GetOffsetVector。在Skin里也可以计算出Init Pose.那么这个计算过程是怎么样的呢?
  其实,这个过程跟我们计算骨骼动画的任意一帧的过程是完全一样的,我们假设Init Pose是第i帧。
  假设,第0帧的时候:位置是v0, 骨骼变换矩阵是TM(0,k)
  手平举着的时候,    位置是vi, 骨骼变换矩阵式TM(i,k). 
  TM(i,k) 就是Bone InitTM ,通过Physique::GetBoneInitTM()来获取
  四个权重对应位置为 W(k);
  在第0帧的时候,顶点相对四个骨骼的的位移应该为 v0 * invTM(0,k). 
  (这个值在Physique里取出来的就是vtxBlend->GetOffsetVector(j), Skin则只能计算了)
  所以。其实我们并不需要这个Offset,从第0帧,加上i帧的Bone InitTM就可以算出这个offset)
  那么从第0帧,算到第i帧(初始帧), 根据骨骼动画公式。
  vi = SIGMA【 v0 * invTM(0,k) * TM(i,k) 】 (k = 0, 4).

  那么同理,在Physique里,也可以用同样的方法,得到Init Pose的第i帧的position数据。用这个方法跟通过vtxBlend->GetOffsetVector(j)获取的Init Pose结果基本是一样的(不一样是因为浮点误差)

  对于顶点Position如上处理,那么对于法向量呢?我们知道不管是Physique也好,Skin也好,直接都是无法取到Init Pose的Normal的,如果是Skin,Position取第0帧,Normal也取第0帧,那么刚好。但是如果你用的是Physique,而又是通过vtxBlend->GetOffsetVector(j)来获取Init Pose的Position的,那么对不起,Init Pose的Normal肯定要你自己算了。 这个过程我就不重复了。将 vi的计算公式中的矩阵改成 Inv后再转置就好了,因为法向量的变换矩阵跟顶点变换矩阵的关系就是逆+转置。

   
   补充说明一点,在导出数据后,顶点Position有两种保存方法:
   1. 一个顶点保存一个值,比如保存第0帧数据。那么计算第t帧的时候的公式应该是
       vt = SIGMA【 v0 * invTM(0,k) * TM(t,k) 】 (k = 0, 4)  
     跟前面的一样的哈。 就是说你还需要把骨骼的InvTM(0,k)给保存下来,并且每次把 TM(t,k)插值好了后乘上去。这个无疑增加了骨骼矩阵混合的计算量。但是它允许你只保存一份顶点数据。
   2. 一个顶点相对于四个骨骼各保存一份,也就是保存vtxBlend->GetOffsetVector(j)获取回来的值,或者是v0 * invTM(0,k) k=(0,4)。 假设保存下去的这个值是v(0,k), 0就是第0帧啦,k当然是第k根骨头啦。 那么这个时候,你做混合的时候只要
      vt = SIGMA【 v(0,k) *  TM(t,k) 】 (k = 0, 4) 。
     计算减少了。但是你要保存的数据多了。嘿嘿,四个顶点位置,还有四个法向量哦,还有四个Tangent呢?哇哈哈。疯了。
   
     鉴于保存四个顶点位置开销实在太大,我宁愿在骨架混合的时候多计算,只保存一份顶点位置就好了。

    说明:
    v0 : 第0帧,顶点位置
    vi : 第i帧,顶点位置
    vt : t时刻,顶点位置
    TM(t,k)     : t时刻,影响这个顶点的第k个骨骼的变换矩阵
    TM(i,k)     : 第i帧,影响这个顶点的第k个骨骼的变换矩阵
    invTM(0,k)  : 第0帧,影响这个顶点的第k个骨骼的变换矩阵的逆矩

(摘自:http://blog.csdn.net/yaokang522/article/details/7311745)

转载于:https://www.cnblogs.com/davelink/p/8353991.html

3DsMax动画插件相关推荐

  1. 探讨3DSMAX 中的CS骨骼动画插件

    3D 图形引擎中角色动画是一个重要的组成部分,它在虚拟现实.电子游戏,甚至是传统的动画制作中均扮演着极其重要的角色.如何实现一个良好的角色动画以引起越来越多的研究者的关注.目前的许多建模软件都可以快速 ...

  2. Lazy Line Painter – 很有趣的 jQuery 路径动画插件

    Lazy Line Painter 是基于 Raphaël(一个用于在网页中绘制矢量图形的 Javascript 库)的 jQuery 路径动画插件,能够把线条图案转换为吸引眼球的路径动画模式. 您可 ...

  3. velocity.js 动画插件

    1. velocity.js 插件介绍 Velocity 是独立于jQuery的,但两者可以结合使用的动画插件.用法类似 jq 的 animate ,但是支持更高级动画. ( 颜色动画.转换动画(tr ...

  4. html数字变换插件,轻量级jquery数字动画插件

    jquery.countup.js是一款轻量级jquery数字动画插件.该数字动画插件可以在页面滚动时,将指定的数字从0开始计数增加动画. 该数字动画插件可以控制动画的延迟时间和动画过渡时间.它依赖于 ...

  5. Siki_Unity_2-5_DOTween动画插件(未学)

    Unity 2-5 DOTween动画插件 转载于:https://www.cnblogs.com/FudgeBear/p/8717925.html

  6. html5波浪线条,HTML5 svg炫酷波浪线条动画插件

    这是一款HTML5 svg炫酷波浪线条动画插件.该波浪动画插件基于tweenMax和SVG,也可以作为jQuery插件来使用,可以制作出漂亮的波浪线条动画特效. 使用方法 在页面中引入jquery和T ...

  7. 【完成发布】Lazy Line Painter – 非常有趣的 jQuery 路径动画插件

    Lazy Line Painter 是基于 Raphaël(一个用于在网页中绘制矢量图形的 Javascript 库)的 jQuery 路径动画插件,能够把线条图案转换为吸引眼球的路径动画模式. 您可 ...

  8. AE一键快速生成MG爆炸图形动画插件:Burst Box for Mac

    Burst Box for Mac是一款安装在ae中使用的一键快速生成MG爆炸图形动画插件,使用 BurstBox,可以在一秒钟内制作精美的爆裂动画!每个动画都很容易定制(颜色和样式). BurstB ...

  9. jquery背景动画插件使用

    在网页制作动画特效的时候,有时候想通过背景插入图片,然后通过控制背景显示的位置来实现一些动画效果,这样就不用使用绝对定位控制left和top来实现动画效果!但是jquery本身的动画函数是不支持背景动 ...

最新文章

  1. java 支付宝h5网页支付接口,移动端h5网页调用支付宝支付接口
  2. Python数据分析与挖掘
  3. Chrome remote debugging protocol在自动化测试中的应用和实践
  4. union 和 union all 有什么不同?
  5. EasyUI实现两个列表联动
  6. (王道408考研数据结构)第六章图-第四节4:最短路径之迪杰斯特拉算法(思想、代码、演示、答题规范)
  7. SQL2K数据库开发二十一之索引操作创建索引
  8. C++安全方向:openssl,剧场版,一个字节多少位
  9. destoon的如何显示tag生成的sql语句
  10. 51单片机lcd1602显示(模块)
  11. Blender的常用快捷键,学习必备
  12. 测量网页元素的大小和间距的利器
  13. JS | 涉及字符串的内置函数的一些题目
  14. 【软路由安装(PVE+ikuai)】
  15. 菜鸡解析CSS(cascading style sheet)
  16. PPT里面的背景音乐找不到?
  17. 第一行代码:知晓当前是哪个界面
  18. ps奥顿柔焦效果+提取线稿
  19. 33-Figma-数据采集器使用方式-后裔采集器
  20. [手机分享]黑莓手机8系列分享之——黑莓88XX系列

热门文章

  1. java asynctask完成_使用 AsyncTask实现异步处理
  2. 【数据分析与挖掘系列】基于基站定位数据的商圈分析(全数据集和代码)
  3. JavaSE查漏补缺1
  4. 2019养站提权利器2.0升级帖-全自动静态泛目录提权程序
  5. mikumikudance中的骨骼追踪有什么用
  6. 木马防线:一切木马都是纸老虎(中)(转)
  7. 九度 1341 艾薇儿的演唱会
  8. 真香警告:即使不用饿了么订餐,也请务必收藏好该库!
  9. 华为 MateView USB-C接口显示器,究竟有什么妙用?
  10. Unable to load dll 应用程序配置不正确,程序无法启动 的解决方法