`
jgsj
  • 浏览: 990325 次
文章分类
社区版块
存档分类
最新评论

骨骼动画初步完成

 
阅读更多

骨骼动画初步完成

演示程序下载地址:这里

骨骼动画是角色动画的重要组成部分,因为只有把骨骼的位置摆准确了才能正确反映角色地姿势,后面的蒙皮动画就好做了。花了我十多天的时间,一直在琢磨着如何顺利地进行骨骼位置的变换,以达到MikuMikuDance中的样子。我做了很多实验,这回也算是有一定的成果吧,虽然关于反向运动学(Inverse Kinematics,IK)的部分我还没有吃透,不过做出一个东西,想分享分享。

关于骨骼的实现,一开始使用的是多叉树,后面发现使用多叉树进行遍历并不是那么好,因为要求的是层序遍历,我写过二叉树,发现层序遍历比较难实现,而先序遍历需要一个栈数据结构来保存父骨骼的变换,显得有些多余。我从PMD格式中读取骨骼数据,在PMD中骨骼数据是线性存储的,于是我想能不能也用线性存储这些数据,再辅以一些数据结构实现多叉树的功能?

最终我发现了多值散列表(MultiHash),我是这么做的,在骨骼读入后不久做一次遍历,以每个骨骼的索引为键,骨骼的层次关系(Hierachy)为值来建立多值散列表。因为模型的骨骼旋转和平移数据都是相对于父骨骼,考虑到要使用VBO,无法像以前那样push和pop模型矩阵,因此有必要将相对的旋转和平移转为绝对的旋转和平移。这个时候只需要对散列表中某一骨骼的层次关系进行遍历然后累加即可。下面是实现上述功能的关键代码:

voidMMDAnimationPrivate::InitBoneHierarchy( void )// 初始化骨骼的层次(孩子在尾端,祖先在首端)
{
   // 需要MMDRenderHandler的骨骼列表
   QVector<MMDRenderHandler::Bone>& bones = m_pRenderHandler->Bones();
 
   for ( int i = 0; i < bones.size( ); ++i )
    {
       quint16 parent = bones[i].parent;
 
       m_BoneHierarchy.insert( i, i );// 先将自己压入层次中
       while ( parent != quint16( -1 ) )
       {
           m_BoneHierarchy.insert( i, parent );// 将父骨骼压入层次中
           parent = bones[parent].parent;
       }
    }
}

……

// 旋转进行叠加
for ( int i = 0; i < bones.size( ); ++i)
{
   Quaternion absRotation;
   foreach ( quint16 index, m_BoneHierarchy.values( i ) )
    {
       absRotation *= bones[index].rotation;
    }
   bones[i].rotation = absRotation;
}

这里给出运行程序截图:


分享到:
评论

相关推荐

    一步一步的使用C++和OPENGL实现COLLADA骨骼动画

    ### 使用C++与OpenGL实现COLLADA骨骼动画详解 #### 一、引言 随着计算机图形学的发展,3D模型的复杂性和表现力不断提高。骨骼动画作为一种常见的技术,被广泛应用于游戏开发、电影制作等领域。COLLADA...

    动画修改工具

    它的核心特性在于对LTA文件的深入支持,使得用户能够轻松调整和优化模型的骨骼动画,提高整体的视觉效果和流畅性。对于游戏设计师和3D艺术家来说,这样的工具无疑是一个强大的助手。 首先,我们要了解LTA文件的结构...

    三维骷髅人体骨骼模型3DsMax制造

    1. **基础构建**:首先,你需要创建基础的几何形状,如立方体或圆柱体,作为骨骼结构的初步框架。 2. **编辑网格**:使用3DsMax的“Edit Mesh”工具调整这些几何形状,使其更符合人体骨骼的形态,例如长骨、扁骨等。...

    计算机图形学.三维模型处理算法初步.理论与实现.C#版

    6. **骨骼动画**:通过连接模型的各个部分形成骨架,通过改变骨骼位置驱动模型运动。 C#版实现意味着我们将使用面向对象的编程思想,创建类和方法来封装这些算法。例如,可以定义一个Mesh类来存储多边形数据,一个...

    [案例及素材]Flash+CS5二维动画制作案例教程

    模块6和模块7则可能涉及到更复杂的动画技巧和实际项目应用,如遮罩技术、骨骼动画、声音处理和视频集成。这部分内容将帮助学习者提高作品的专业度,使得动画更具动态表现力和视觉吸引力。 每个模块后的“素材.rar”...

    骨骼边缘提取所有图片

    标题"骨骼边缘提取所有图片"指的是一个包含了一系列经过特定算法处理后的图像集合,这些图像可能已经完成了初步的骨骼轮廓检测。通过这样的图像集,我们可以观察到活动论廓方法在骨骼边缘提取上的应用效果。活动轮廓...

    3D动画案例

    1. **概念设计**:这是项目开始时的创意阶段,设计师会根据客户的需求和目标,绘制草图或概念艺术,为动画设计初步的视觉风格和场景设定。 2. **建模**:使用3D建模软件(如Maya、3ds Max或Blender)创建场景中的...

    [2D动画绘制专业软件

    6. 输出与导出:完成动画后,根据需要导出为不同格式,如MP4、GIF或动画序列,以便于在网络上传播或进行进一步的后期处理。 2D动画绘制软件的不断发展为创作者提供了无限的可能性,无论是独立艺术家还是大型工作室...

    第一课动画原理(第1课时).pdf

    课堂中,通过欣赏动画作品和动手实践,使学生初步掌握使用Flash软件制作简单逐帧动画的方法。课堂小结鼓励学生运用所学知识,创作属于自己的动画作品。 【教学目标与重点难点】 教学目标旨在使学生了解动漫基本概念...

    FLASH矢量猫走路动画

    6. **测试与优化**:完成初步的动画后,要反复播放并进行微调,确保动作自然、连贯。可能需要调整帧速率、添加缓动效果或者修改关键帧的位置,以达到最佳视觉效果。 总结来说,“FLASH矢量猫走路动画”不仅展示了...

    虚拟人体骨骼模型构建方法

    ### 虚拟人体骨骼模型构建方法 #### 引言 在现代计算机图形学与虚拟现实技术领域中,虚拟人体的构建与应用日益广泛。为了真实地模拟人体运动,不仅需要构建逼真的表面模型,还需要设计合理的骨架模型作为支撑。...

    三维动画报价单借鉴.pdf

    - **动画绑定权重**:设置骨骼系统,使角色能够做出各种动态表演,这个阶段还包括测试动画。 - **材质灯光**:通过调整材质和灯光设置,创造不同场景的氛围和质感。 - **分层渲染合成**:根据合成师的指导,将...

    Fbx Exporter

    例如,在Unity中完成基础模型搭建和初步动画设定后,可以通过Fbx Exporter导出到Maya或3Dmax,利用这些软件的强大功能进行高级的建模和动画编辑,然后再导入回Unity进行实时渲染和游戏测试。 值得注意的是,Fbx格式...

    南京农业大学毕业设计说明书,Flash 动画制作.doc

    6. **测试与优化**:完成初步制作后,需要在不同平台和浏览器上进行测试,确保动画的兼容性和流畅性。根据反馈调整动画内容,优化文件大小,以适应快速加载和播放。 7. **发布与分发**:最后,将Flash动画导出为SWF...

    【Spine学习11】之 战士攻击动作 思路总结(手动调整贝塞尔曲线实现前快后慢)

    Spine是一款2D骨骼动画软件,通过将图形绑定到骨骼上,我们可以创建出灵活多变的角色动画。它的核心在于骨骼、关节、插槽以及蒙皮权重,这些元素共同构成了动态的角色模型。 2. **角色设定与预设计** 在制作战士的...

    flash教程-共12章

    同时,讲解骨骼动画系统(Animate CC新增功能)的使用。 第七章:声音与视频 讲解如何导入和处理声音文件,以及嵌入和控制视频。讨论如何实现声音和视频的交互性,提升用户体验。 第八章:组件与库 介绍Flash中的...

    UE4定序器场景导出fbx参考K动作插件

    FBX(Filmbox)是一种通用的3D模型格式,支持模型、纹理、骨骼动画等多种数据类型,广泛用于不同软件之间的数据交换。在UE4中,将定序器场景导出为FBX文件,可以方便地与其它3D软件如Autodesk 3ds Max进行协作。例如...

    一款三维动物、人体造型和三维人体动画制作的极品软件

    用户可以在Poser中完成初步的建模和动画设计,然后将作品导入到更专业的软件中进行细化处理。 Poser_Pro_2012是该软件的一个专业版本,相较于基础版,它通常会包含更多的高级功能,如更精细的渲染设置、增强的物理...

    [游戏道具]_MAX9做的皮箱 白模

    在游戏开发中,白模(White Model)是指初步完成几何结构,但还未添加任何材质、纹理和细节的模型。白模阶段主要是为了检验模型的形状、比例和结构是否准确,确保其符合设计需求和游戏引擎的性能要求。在这个阶段,...

    用OgreOde创建一个会走动的角色

    通过创建一个 SceneNode 附加忍者模型的 Entity,我们可以初步构建角色的基础。在这个例子中,我们使用了两个 SceneNodes:一个父节点(ninjaNode)用于整体控制,另一个子节点(modelNode)用于放置模型并保持其相...

Global site tag (gtag.js) - Google Analytics