美文网首页
骨骼动画原理

骨骼动画原理

作者: 核桃啊 | 来源:发表于2017-05-16 11:20 被阅读1333次

    3D动画

    提供一种机制,描述各定点位置随时间的变化

    骨骼动画简介

    • 顶点动画
      早期的3D模型动画,就是把每帧的顶点数据输出到文件中,所以3D模型的一个动作就是一系列的模型,这样做的目的主要是硬件资源有限,没有多余的时间去计算顶点。


    • 骨骼动画
      随着动画越来越精细,将每帧的顶点数据输出到文件数据量太大。人们想出一种办法,将3D模型抽象为一些关键点的集合,整个模型的运动可以当做是这些关键点的运动,而模型的顶点只是受这些关键点的影响而已。这些关键点就称为骨骼

    skinned mesh

    利用vertex blend(顶点混合),对于关节附近的点,由多段骨骼影响,对不同骨骼赋予不同的权值。目前我们所使用的最大受骨骼影响数为4.

    • 更加真实,灵活

    • 制作效率高

    • 运行时交互

    • 共享动画

    • 要求一定的性能

    • 骨架父子关系,父骨骼带动子骨骼运动

    • 骨骼带动顶点运动

    程序层面

    • 肘关节动->手臂动
    • 肩关节动->手臂动
    • 身体的肉动是由一系列关节的运动所影响,但影响的程度不同
    class Point
    {
    
      float x,y,z;     //顶点的位置
    
          int  Bone[n];  //影响肌肉的骨头
    
          float Weight[n]  //每一个骨头对顶点的影响度,例如 肘关节的影响度对手臂很多,而肩关节要少。
    
    }
    

    那么一个顶点的位置就是:

    for( int i = 0 ;i < n ; ++ i)
    {
    
       (x,y,z) += 骨头[i] * 骨头的影响度[i];
    
    }
    

    骨头在程序上的意义是什么,其可以旋转,有位移,有缩放,其实就是矩阵

    制作过程

    rigging:创建骨骼的过程
    skinning : 把点映射到骨骼的过程

    static 3D model -> rigging - skinning -> animation

    数据格式

    解析过程

    • 顶点数据中要有骨头信息和骨头权重
    • c3t文件中要有完整的骨架信息
    • nodes数据中要有网格对应的骨头信息,骨头的坐标空间转换的逆矩阵

    关键帧

    • Sprite3D draw

    • skeleton->updateBoneMatrix

    • meshSkin getMatrixPalette world matrix * invPos

    • 将palette矩阵传到shader

    • animation信息改变Bone‘s local Matrix

    相关文章

      网友评论

          本文标题:骨骼动画原理

          本文链接:https://www.haomeiwen.com/subject/kssaittx.html