简单的骨骼动画、骨骼动画理论
Keep in touch: zpxocivuby@126.com

目的:指导别人使用矩阵
任务:编写教程,编写代码
阅读对象:d3d入门者,c/c++熟练,windows编程熟练,VC IDE熟练
描述:
  这一届我们来做一个简单的骨骼动画(非常简单啊!只有两个线段啊!)并且介绍一下实现思想是什么

在3d世界中,人物的动画过程主要有两种实现方式:
1. key frame animation(关键帧动画)
  a) 是将要播放的关键帧都做好放到存储介质中(文件,内存),播放时一帧帧的调出来
2. (骨骼动画)
  a) 是将动作对象分解成一个个的键(joint),和骨(bone)要使对象动作只要将joint和bone进行矩阵坐标转换就可以了

第一种方式我们暂时不研究(等我写完骨骼动画后我会再介绍的),我们只关心第二种实现方式。
下图就是一个最最基本的骨骼构成模式
   图1

其中键有:A,B,C,D;骨有a,b,c;我们现在假设ABCD的坐标是A(1,0,Z),B(0,0,Z)C(0,1,Z)D(1,1,Z),我们想让a,c骨骼动起来,而b不动

   图2

  经过变换之后我们的图1就变成图2了。现在我们来看看用数学表达是怎样表示上面的转换我们设C>C’转了r度,D>D’在C不变的情况下(什么?为什么C不变?这个……你自己考虑吧)转了t度,则C’的坐标是(x’,y’,Z),D’的坐标是(x’’,y’’,Z)。什么坐标是怎么计算出来的?你可真着急啊当然是通过矩阵变换的啊

计算步骤:
  第一步:我们首先认为C和D点是一起的也就是说当C移动时D也随之移动,这样我们可以计算出C’和D’’的坐标都是绕A点以垂直于AC和CD的平面的向量旋转的,通过转换矩阵我们可以得到C’D’’的向量坐标,
  

  第二步: 再处理D’’向D’转动,这是可以将C”点看成是转点,计算得出D’的向量坐标

好了,我们来看一下代码吧

为了方便操作,我将原本在setup函数中的vertices变量放到了外边,成了全局变量(这样不是一个好的方法,但这只是一时之举,少后我将会改正)

Vertex* vertices;

在程序中我们将键(joint)设成一个点,骨(bone)则是一个线段
其中要注意的代码只有一段,那就是在display()函数中的下列语句

//申明了四个点,其中tempA,tempB,tempC各代表ACD三个点tempD代表了一个临时的数据存放空间,主要是用来放转换之后的C’C’’D’的位置数据
D3DXVECTOR3* tempA = new D3DXVECTOR3(vertices[0]._x,vertices[0]._y,vertices[0]._z); //将ABC复制到temp里面
D3DXVECTOR3* tempB = new D3DXVECTOR3(vertices[1]._x,vertices[1]._y,vertices[1]._z);
D3DXVECTOR3* tempC = new D3DXVECTOR3(vertices[2]._x,vertices[2]._y,vertices[2]._z);
D3DXVECTOR3* tempD =new D3DXVECTOR3() ;

//计算BA
D3DXVECTOR3* BA = &(*tempB-*tempA);//计算出向量BA
//计算CA
D3DXVECTOR3* CA = &(*tempC-*tempA); //计算出向量CA

//将BA在垂直BA方向上旋转ax

D3DXMatrixRotationAxis(&RAba,(D3DXVec3Cross(tempD,BA,CA)),ax);//前面介绍过这个函数
// D3DXVec3Cross函数的功能是将BA向量和CA向量进行X(不能读成”埃克司”啊,应该是“叉乘”)乘,(得到的是一个垂直于BA和CA的向量)
D3DXMatrixRotationAxis(&RAcb,(D3DXVec3Cross(tempD,BA,CA)),ax);
D3DXVec3TransformNormal(BA,BA,&RAba);//该函数的功能是将BA向量通过转换矩阵RAba变成BA’
D3DXVec3TransformNormal(CA,CA,&RAcb);

*tempB = (*BA+*tempA);
//重新对内存中的数据进行复制
vertices[1]._x=tempB->x;
vertices[1]._y=tempB->y;
vertices[1]._z=tempB->z;
*tempC = (*CA+*tempA);

//计算C'B'
D3DXVECTOR3* CB = &(*tempC-*tempB);
//将C'B'在垂直C'B'方向上旋转ax
D3DXMatrixRotationAxis(&RAba,(D3DXVec3Cross(tempD,BA,CA)),-ax);
D3DXVec3TransformNormal(CB,CB,&RAba);
*tempC = (*CB+*tempB);
vertices[2]._x=tempC->x;
vertices[2]._y=tempC->y;
vertices[2]._z=tempC->z;

好了运行一下吧,看看有什么效果!

  怎么样是不是很“裸”(这是我上大学时,我们班人常说的一个字,意思说:很差劲,很白痴,无能,发泄的意思,反正不是个好东西了,是我们班人发明的哦,没有授权你不能使用的啊“^_^”)

  的确这段代码对付这两个线段是可以了,可是要有上百个上千个怎么办啊?没关系了,我们可以将代码重构一下。写的更加复杂一些,并且使用一些OO(面向对象)方法,和design pattern(设计模式),这些将会在下一界中介绍。

备:写这些东西好累啊,白天上班晚上还要回来写东西真的很累啊,所以这个周休息一下下周再写。

下载例程  论坛交流

简单的骨骼动画、骨骼动画理论相关推荐

  1. ue4小白人骨骼定义_动画短片在UE4中的工作流程都有哪些?来看游戏建模师如何分析的...

    CG摄影师兼导演Jeffy Zachariah谈到了他的动画短片WAKE的制作:在UE4中与Sequencer合作,摄像机设置,资产制作等. 想法 将动画视为通过运动说出来的故事或表情,甚至可以只通过 ...

  2. unity怎么显示骨骼_Unity骨骼动画的总结

    欢迎参与讨论,转载请注明出处. 前言 恰逢假期,在家继续推进Demo,骨骼动画相关的调研算是告一段落了,遂以本文记录相关要点. 首先要明确一点,本文所说的骨骼动画皆是3D模型的骨骼动画,与2D精灵的骨 ...

  3. Blender图解教程:马里奥食人花三部曲(二)骨骼绑定和动画(网格丢失的问题已解决 附模型下载)

    书接上文<Blender图解教程:马里奥食人花三部曲(一)建模和贴图>,本文将完成食人花的骨骼绑定和动画工作. 文章目录 模型检查 绑定 搭建骨架 蒙皮 矫正权重 动画 Idle动画 Ho ...

  4. 17.Unity2D 横版 骨骼动画 之 动画中局部骨骼旋转+多层动画共同控制+局部骨骼索敌攻击

    主目录 承接上节课 16.Unity2D 横版 骨骼动画 之 单张PSB图+PS像素画软件_ζั͡ ั͡雾 ั͡狼 ั͡✾的博客-CSDN博客上一节课我们学习了单张的切片图,是最简单的一种骨骼动画,但 ...

  5. 动画骨骼【Visual C++】游戏开发五十二 浅墨DirectX教程二十 骨骼动画来袭(一)...

    间时紧张,先记一笔,后续优化与完善. 本系列文章由zhmxy555(毛星云)编写,载转请注明出处. 文章链接: http://blog.csdn.net/zhmxy555/article/detail ...

  6. UE4源码阅读_骨骼模型与动画系统_Mesh

    写在前面 本文为个人学习的笔记整理,如有错误,望不吝指出. 1. Mesh数据 SkeletalMeshComponent中和骨骼模型相关的代码主要封装在USkeletalMesh类. USkelet ...

  7. Unity模型动画骨骼错位解决办法

    把骨骼动画导入进unity并设置成Humanoid时发现动画的动画有错位 只需要把模型下的Animation里的Motion里的Root Motion Node 设置成Root Transform就行 ...

  8. Unity动态骨骼插件 飘带动画基于bone的实时运算

      嘛 就是这套东西啦 先说效果 他可以省去你K飘带的时间 直接在引擎中运算出动画 你只需架好骨骼 绑定好模型 这个插件相当于max里常见的飘带插件 但是更强大   第一个脚本SpringBone是挂 ...

  9. 一个简单的Python樱花飘落动画代码

    以下是一个简单的Python樱花飘落动画代码示例: import random import time# 定义控制台大小和颜色 WIDTH = 80 HEIGHT = 25 COLORS = ['\0 ...

  10. 【web前端特效源码】使用HTML5+CSS3制作一个会动的不规则斑点边框半径动画的动画效果~~适合初学者~超简单~ |前端开发

    b站视频演示效果: [web前端特效源码]使用HTML5+CSS3制作一个会动的不规则斑点边框半径动画的动画效果~~适合初学者~超简单~ |前端开发|IT软件 效果图: 完整代码: <!DOCT ...

最新文章

  1. SQL -- 是否或推断线相交以在其内部的平面
  2. IDEA的十大快捷键
  3. LetCode-算法-整数反转
  4. python图像标记工具怎么用_一眼看穿的最佳图像标记工具!
  5. springbatch导出mysql数据到外部文件
  6. [转载] python自定义error_Python 自定义异常处理Error函数
  7. JAVA基础知识|进程与线程
  8. 无法加载oracle驱动程序998,无法加载oracle in oradb10g_home2 odbc驱动程序的安装例程,因为存在系统错误代码998 解决方法...
  9. 烟雾传感器的matlab程序,单片机烟雾传感器proteus仿真+程序+PCB原理图
  10. 为什么要从 Microsoft Store 下载 Visual Studio/VS Code?
  11. 软件测试案例|移动APP非功能性测试
  12. 【股票】成交量VOL隐含的交易秘密
  13. 织梦图集php,采集功能的使用方法 --- 图片集(一)
  14. 若干物联网无线技术 - NB-IOT、LoRa、433、GPRS、2.4G、PKE近场通信,基础理论与开发点滴总结
  15. linux mtd 命令,Linux MTD介绍
  16. CDA数据分析师视频教程全套零基础入门excel考试教学课程2022
  17. 好物推荐 | 小明医声家庭健康初体验
  18. 矩阵与矩阵的乘法运算
  19. ABBYY PDF Transformer+ Pro可以支持189种语言
  20. Unity ShaderLab 坐标空间转换及方法

热门文章

  1. 11. 形态学膨胀、腐蚀、开运算、闭运算
  2. 图片怎么加logo水印
  3. 基于网易云音乐API的微信小程序——网愈芸音乐
  4. #Revit二次开发# 创建剖面视图
  5. 2022春秋杯联赛 传说殿堂赛道 sql_debug题目解析
  6. AWS灾难恢复的重要参考指标
  7. 每日学习一个设计模式--观察者模式(发布-订阅模式)
  8. 《Kubernetes证书篇:使用TLS bootstrapping简化kubelet证书制作》
  9. windows下如何安装及使用github
  10. Latex表格线宽修改方法以及内容左对齐。