人物模型动画一直是游戏中最重要的组成部分, 因此这里我们研究骨骼动画是如何实现的.

原理

首先模型通常是由多个三角形形成的网格构成, 每个三角形有三个顶点, 因此动画的根本原理就在于不同时间内为每个顶点分配不同的位置, 这一切都是通过虚拟的骨头(bone)实现的. 其中模型上的每个顶点分配给不同的骨头, 比如说, 手部上的顶点可能分配给前臂, 手部两个不同的骨头, 每个骨头对不同顶点有不同的影响, 这通过权重值来实现的.

而后动画分为多个帧, 每一帧内, 多个骨头位于不同的位置, 就和人体一样. 最重要的是, 骨骼上的骨头是有层次的, 比如一般情况骨椎为根骨头, 而后派生出头部骨头, 手臂骨头, 腿部骨头.

实现

为了实现动画, 我们需要得到骨头在不同帧内变换矩阵, 而后我们模型上的顶点首先要变换至骨头所在的模型空间, 而后再乘以其相应的变换矩阵. 关键实现时需要注意求解每个骨头初始状态其自身模型坐标系的逆矩阵. 这里我是用的是 Ogre 的骨骼动画机制, 发现其骨骼加载的过程需要求解每个骨头逆矩阵, 因此遇到复杂的模型时(例如天龙八部的骨骼), 加载时间就比较长, 因为逆矩阵在动画的过程中是不会变化的, 是否可以考虑将每个骨头的逆矩阵事先求解并保存起来, 以便加快加载速度呢.

效果

原理很简单, 只是实现比较繁琐, 这里是加载天龙八部模型的效果

骨骼动画的实现(OpenGL实现)的更多相关文章

  1. 基于babylon3D模型研究3D骨骼动画(1)

    3D骨骼动画是实现较为复杂3D场景的重要技术,Babylon.js引擎内置了对骨骼动画的支持,但Babylon.js使用的骨骼动画的模型多是从3DsMax.Blender等3D建模工具转换而来,骨骼动 ...

  2. 使用spine骨骼动画制作的libgdx游戏

    (官网:www.libgdx.cn) Super Spineboy是一个使用Spine和libgdx开发的跨平台游戏(Windows,Mac,Linux),Spine是一个2D游戏动画工具.Super ...

  3. CSharpGL(50)使用Assimp加载骨骼动画

    CSharpGL(50)使用Assimp加载骨骼动画 在(http://ogldev.atspace.co.uk/www/tutorial38/tutorial38.html)介绍了C++用Asism ...

  4. 骨骼动画的原理及在Unity中的使用

    制作骨骼动画 我们看看这几步操作后,我们得到了那些数据: 1.每个皮肤顶点的初始世界坐标. 2.每个骨骼关节顶点的初始世界坐标. 3.每个顶点被骨骼顶点的影响信息. 4.骨骼如何移动. 骨骼动画原理 ...

  5. Axiom3D:Ogre动画基本流程与骨骼动画

    在Axiom中,Animation类用于管理动画,在此对象中主要管理着AnimationTrack对象,此对象用于管理动画的各种类型的每一桢.在Axiom中,动画类型主要有变形动画,姿态动画,骨骼动画 ...

  6. 基于Babylon.js编写简单的骨骼动画生成器

    使用骨骼动画技术可以将网格的顶点分配给若干骨头,通过给骨头设定关键帧和父子关系,可以赋予网格高度动态并具有传递性的变形 效果.这里结合之前的相关研究在网页端使用JavaScript实现了一个简单的骨骼 ...

  7. cocos2dx骨骼动画Armature源码分析(三)

    代码目录结构 cocos2dx里骨骼动画代码在cocos -> editor-support -> cocostudio文件夹中,win下通过筛选器,文件结构如下.(mac下没有分,是整个 ...

  8. cocos2dx骨骼动画Armature源码分析(二)

    flash中数据与xml中数据关系 上篇博文从总体上介绍了cocos2dx自带的骨骼动画,这篇介绍一下导出的配置数据各个字段的含义(也解释了DragonBone导出的xml数据每个字段的含义). sk ...

  9. cocos2dx骨骼动画Armature源码分析(一)

    源码分析一body { font-family: Helvetica, arial, sans-serif; font-size: 14px; line-height: 1.6; padding-to ...

随机推荐

  1. JS编写全选,复选按钮

    <!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8&qu ...

  2. Java--使用多线程下载,断点续传技术原理(RandomAccessFile)

    一.基础知识 1.什么是线程?什么是进程?它们之间的关系? 可以参考之前的一篇文章:java核心知识点学习----并发和并行的区别,进程和线程的区别,如何创建线程和线程的四种状态,什么是线程计时器 简 ...

  3. 第七章 springboot + retrofit(转载)

    本篇博客转发自:http://www.cnblogs.com/java-zhao/p/5350861.html retrofit:一套RESTful架构的Android(Java)客户端实现. 好处: ...

  4. freeCodeCamp:Falsy Bouncer

    真假美猴王! 删除数组中的所有假值. 在JavaScript中,假值有false.null.0."".undefined 和 NaN. /*思路 利用布尔值构造filter的测试函 ...

  5. Rails中用CSV导出中文真心有技巧

    require 'csv' class PartRequestsController < ApplicationController def render_csv_header(filename ...

  6. 浅论ViewController的加载 -- 解决 viewDidLoad 被提前加载的问题(pushViewController 前执行)

    一个ViewController,一般通过init或initWithNibName来加载.二者没有什么不同,init最终还是要调用initWithNibName方法(除非这个ViewControlle ...

  7. yii使用createCommand()增删改查

    查询单条数据$sql = "SELECT `name` FROM `table` WHERE id='7'";$users=Yii::$app->db->createC ...

  8. SmartUpload实现文件上传时file和表单文本同时提交的问题

    JSP页面: <%@ page language="java" import="java.util.*" pageEncoding="UTF-8 ...

  9. HTML流动布局各种宽度自适应

    <!DOCTYPE html> <html lang="en"> <style> html,body{ padding: 0;margin: 0 ...

  10. easyUI datagraid的列排序

    在给datagraid做多列排序时请注意: 首先,做的是后台排序,那么需要设置: remoteSort:'true', 然后,不要添加 multiSort:'true',这个是多列一起排序无法实现.. ...