制作骨骼动画

我们看看这几步操作后,我们得到了那些数据:

1.每个皮肤顶点的初始世界坐标。

2.每个骨骼关节顶点的初始世界坐标。

3.每个顶点被骨骼顶点的影响信息。

4.骨骼如何移动。

骨骼动画原理

核心: 通过骨骼带动皮肤运动,也就是通过骨骼的移动动态计算mesh上的点的位置

过程:

1.将mesh上的点转换为骨骼空间上的点。

骨骼空间就是以关节为原点确定的空间,并不是一个实体。

2.通过缩放、旋转、平移将骨骼移动到新的位置。

3.根据骨骼的新位置计算mesh顶点新世界坐标(骨骼移动,但mesh顶点与骨骼的相对位置不变,所以产生了顶点随骨骼移动的感觉),若一个顶点被多个骨骼影响,则要进行顶点混合计算新世界坐标。

举例

初始位置(绑定姿势):

骨骼移动后的位置:

1.计算小臂上一点S在小臂空间中的位置。

这个就要根据初始的骨骼位置和mesh上顶点的位置来计算了,也就是常说的绑定姿势状态。

先说一下该例中每个坐标的意义:

(x1,y1,z1):左肩关节SL的世界坐标。

(x2,y2,z2):左肘关节在以左肩关节为原点的坐标系本地坐标。

(x3,y3,z3):附着于左小臂上的皮肤上的一点S的世界坐标。

这里为了简单,假设所有的关节都没有经过旋转和缩放。

先将S转换到通过SL确定的空间中,也就是大臂UAL空间,直接减去SL的坐标即可(x3-x1,y3-y1,z3-z1)。

再将S点在大臂UAL空间中的坐标转换到小臂LA空间中,直接减去EL的坐标即可(x3-x1-x2,y3-y1-y2,z3-z1-z2)。

以上只是一个简单的说明,而实际的使用中,初始的骨骼位置可能是通过缩放、旋转、平移后得到的,一般会通过矩阵的方式来表示这一系列变换。

关于OpenGL中的坐标转换可以参考这个链接的说明LearnOpenGL CN。

看完这个我们就应该知道如何将一个子坐标空间的点转化为世界坐标了。下面再使用该例子进行举例。

先计算模型矩阵再求模型矩阵的逆矩阵:

或者直接将求模型矩阵的运算反过来也可以:

得到World→EL矩阵后就可应直接通过矩阵运算直接将世界坐标上的一点转化为EL空间上的一点了。

注意:

1.注意矩阵的运算顺序,因为矩阵运算是不满足交换率的,如果顺序错了,结果很可能也就错了。

2.矩阵EL→World一般叫做EL空间的模型(model)矩阵,矩阵World→EL一般叫做EL空间的绑定姿势矩阵(bindpose)

3.有时存储的Mesh顶点信息不是直接的世界坐标,而是一个有层次结构的mesh,但这并不影响流程,只要在运算时增加一步将这些顶点转化为世界坐标的操作即可。

2.计算EL顺时针旋转90°后S点的位置。

直接通过左肩SL,左肘关节EL的缩放、旋转、平移信息计算小臂LA空间的模型矩阵,使用上一步算出的小臂LA空间坐标乘以该模型矩阵即算出了该点收到骨骼移动的影响后的位置。

3.顶点混合

有一些顶点不一定只受一个骨骼的影响,可能受多个骨骼的影响,此时就要通过顶点混合计算该点的新坐标。

现在假设点S同时受SL,EL的影响且影响权重分别为0.4,0.6。

①分别计算点S在SL、EL空间中的本地坐标。

②分别计算点S在SL、EL移动后的世界坐标。

③根据SL、EL对点S的影响权重混合坐标,获得新的世界坐标。

这里举例的是受两个骨骼影响的情况,受3个、4个时原理也是相同的,只不过运算量会更大一些。

小结

1.空间的平移、旋转、缩放都可以用矩阵来表示,而且这些矩阵也可以结合在一起成为一个矩阵,多层空间结构的变换也一样可以组合为一个矩阵。

2.现在看来骨骼动画的核心其实就是几个矩阵乘法的问题,大概就是这样:

其中model矩阵随着动画的播放不停的变化,也就实现了骨骼带动皮肤的功能。

假设一个顶点受多个骨骼影响,那么就再根据权重混合一下。

3.mesh的初始位置、bindpose、影响因素都是通过制作该骨骼动画模型时确定的,可以参考第一小节制作骨骼动画的过程。

Unity中的骨骼动画

我们这里以一个Mixamo上的免费资源Samba Dancing为例。

资源下载

资源导入

直接将资源拖入Unity中即可,可以看到在Unity中生成了一个文件夹和一个预制件。

加入动画

1.把模型prefab拖入场景中。

2.然后将mixamo.com动画拖到场景中的Samba Dancing中,Unity会自动生成对应的Animator Controller。

运行场景,查看动画效果

直接点击运行即可。

数据说明

动画数据说明:

左边是每一帧变化的骨骼,右边是每个骨骼关键帧的平移,旋转,缩放信息。

模型信息说明

Skinned Mesh Renderer属性详解

Cast Shadows:是否投射阴影。

Receive Shadows:是否接收阴影。

Materials:材质。

Use Light Probes:是否使用光探针。

Reflection Probes:反射探针设置。

Anchor Override:网格锚点。

Lightmap Parameters:光照烘培参数。

Quality:每个顶点最多收到的骨骼影响数量。

Update When Offscreen:当mesh在屏幕外时是否更新,依据RootBone和Bounds判断。

Mesh:Mesh信息。

mesh信息包含了每个顶点的位置信息,受骨骼影响的权重信息、切线、法线、UV映射信息。

RootBone:根骨骼,有两个作用。

1.作为mesh在屏幕外时是否更新的依据。

2.进行坐标计算时的Root空间。

在Unity中计算mesh上一点位置的流程大概是这样的:

先通过上述一系列计算得到点在RootBone空间中的位置,上述过程对开发者时不可见的。然后将接下来的步骤交给Material中的Shader解决。查看Shader文件可以看到,在顶点着色其中第一步会给输入的点乘以一个MVP矩阵获取该点在屏幕上的位置,其中的M就是RootBone的模型矩阵。

以Unity 5.37的Standard Shader为例,截取其使用的顶点着色器的一部分

VertexOutputForwardBase vertForwardBase (VertexInput v)

{

UNITY_SETUP_INSTANCE_ID(v);

VertexOutputForwardBase o;

UNITY_INITIALIZE_OUTPUT(VertexOutputForwardBase, o);

UNITY_TRANSFER_INSTANCE_ID(v, o);

UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);

float4 posWorld = mul(unity_ObjectToWorld, v.vertex);

#if UNITY_REQUIRE_FRAG_WORLDPOS

#if UNITY_PACK_WORLDPOS_WITH_TANGENT

o.tangentToWorldAndPackedData[0].w = posWorld.x;

o.tangentToWorldAndPackedData[1].w = posWorld.y;

o.tangentToWorldAndPackedData[2].w = posWorld.z;

#else

o.posWorld = posWorld.xyz;

#endif

#endif

可以看到,通过posWorld = mul(unity_ObjectToWorld, v.vertex);对顶点以RootBone空间为基础做了转换。

Bounds:根骨骼的边界。

如果有什么错误,希望各位在博客下留言指正,我会尽快改正。

unity怎么显示骨骼_骨骼动画的原理及在Unity中的使用相关推荐

  1. unity判断鼠标移动方向_【反向元气骑士】用unity实现俯视角射击是一种怎样的体验...

    哈喽大家好我是yumir. 最近沉迷元气骑士,自从官方把各种"bug"修复之后,这个游戏对我这种手残玩家来说实在是太难了.既然打不过,那我就自己写一个,不就是俯视角射击吗,分分钟给 ...

  2. unity角色移动代码_教你3个步骤实现Unity小地图

    一.前言 小地图功能在很多游戏中都有,特别是RPG游戏,在Unity中如何实现小地图功能呢,我来教你. 二.思路 专门创建一个顶视角的摄像机,然后摄像机有个Target Texture属性,可以将渲染 ...

  3. unity镜头边缘羽化_【后期修图】如何利用Ps中的自适应广角滤波器校正镜头失真?...

    当用广角镜头拍摄对象时,透视问题通常以线条的形式出现,这应该是直的,但看起来是弯曲的和扭曲的.这通常被称为桶形失真,其主要发生在广角镜头中,因为图像的放大率越远,主体离镜头的光轴越远.简单来说,这意味 ...

  4. easyui中的datetimebox 只显示年月日_云计算自动化运维之linux-工作中常用命令总结(中)...

    ***想看完整版请看(上).(中).(下)三篇文章*** date命令,显示系统时间 直接输入date 2.date 命令打印年月日,使用命令date +%F或者是date +%Y-%m-%d 3.d ...

  5. unity项目是啥_黑曜石的“永恒项目”是使用Unity的最新Kickstarter项目

    unity项目是啥 We're getting a lot of attention lately and we're not going to lie, it feels pretty good. ...

  6. unity怎么显示骨骼_浅谈Unity3D 骨骼动画

    最近研究了一下游戏中模型的骨骼动画的原理,做一个学习笔记,便于大家共同学习探讨. ps:最近改bug改的要死要活,博客写的吭哧吭哧的~ 首先列出学习参考的前人的文章,本文较多的参考了其中的表述: 一. ...

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

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

  8. unity怎么显示骨骼_Unity骨骼优化(转)

    用Unity做游戏经常会用到3D角色,也就会用到骨骼动画.骨骼动画对性能的影响其实非常大的,在说这个问题之前,先来说说骨骼动画的原理. 我之前做过多种骨骼动画,包括写过2D的骨骼动画系统(类似于现在比 ...

  9. Unity学习笔记(7) Unity2D骨骼动画制作流程

    用骨骼动画最大的好处就是方便之后做换装系统. 无论对3Dor2D游戏都是这样的. 这篇博文记录一下2D骨骼动画的制作流程,参考b站麦扣的系列教程: https://space.bilibili.com ...

最新文章

  1. 未来计算机体系结构,华中科大金海:未来是计算机体系结构的“黄金十年” 要培养大量创新人才...
  2. 在centos上,oracle数据库更改IP后无法启动监听,解决方法
  3. Python基本语法(基于3.x)
  4. .net bitmap rgb数据_在3D空间,用点云数据学行人重识别特征
  5. 在centos6中安装2.4版本的HTTPd
  6. windows下python 使用CRF++ python接口的配置
  7. Python机器学习:梯度下降法005梯度下降法和数据标准化
  8. 20-30-010-安装-kafka-manager
  9. mysql_real_connect阻塞_mysql_real_connect 参数注意-阿里云开发者社区
  10. python3入门代码-Python3入门(三)——Python基础语法
  11. Ubuntu 16.04编译Android 7.1.2
  12. Flutter进阶第14篇:支付宝支付【上】
  13. 用户体验测试(UX测试)
  14. nodejs代码将word转成图片
  15. 第一份BI分析项目总结
  16. 转:影视娱乐站推广的几个方法
  17. 离散数学期末复习知识点(不挂科系列)
  18. 字号、pt、px、inch、cm 之间的关系及对照表
  19. Oracle常用函数总结
  20. 中学生计算机制作大赛,【崇德尚学 和雅金中】热烈祝贺金沙中学在2019年南海区中学生电脑制作活动中硕果累累!...

热门文章

  1. 用latex排版电磁场课程报告
  2. centos下安装apache+mysql5.7.13+php5.3.3+phpmyadmin4.0.10
  3. 封装对MongoDB数据库的增删改查访问方法(基于MongoDB官方发布的C#驱动)
  4. MVCWebForm对照学习:传值方式
  5. (剑指Offer)面试题1:赋值运算符函数
  6. UA OPTI570 量子力学3 单个自由粒子的薛定谔方程
  7. UA MATH523A 实分析3 积分理论16 截口与单调类、特征函数的Fubini定理
  8. UA SIE545 优化理论基础4 对偶理论简介1 松弛问题与Lagrange对偶
  9. java单元测试总结
  10. C#访问SQLServer增删改查代码实例