骨骼 skeleton就是表示其物体支架的向量。它提供了网格(meshes)分级,方便驱动一个角色的动画系统。骨骼的表面由皮肤包围,就成为一个立体模型了。这些皮肤是由向量和几何图形组成的。各个骨骼相互影响,以此达到模拟真实动作的效果,如人手运动。

与前面一般动画不同的是 root坐标不一定是世界坐标,比如是人的躯干坐标。

顶点混合( Vertex Blending)

关节处的皮肤在实际世界中是会邹起来的,如下图:

要模拟这个效果就需要用到vertex blending这个技术了。

关节处的vertex是会由两个甚至是多个骨骼影响的,那么就需要利用加权的方法,确定关节处的vertex受骨骼影响的程度。这些权一般是由美术确定的(利用maya等软件),然后保存到3d模型文件,如.x文件。设置好的话,就会产生平滑的动画,而不会像之前的机械手那么生硬的动作。

一般一个顶点最多只需要受4个骨骼影响就可以产生平滑的动画了。

毫无意外的,这些骨骼的信息都应该由一个结构体来表示,如下:

利用这样的结构体代表顶点信息,渲染这些顶点就是vertex blending了。

计算顶点v的最终位置的公式是:

v = w0*v*F0 + w1*v*F1……wn-1*v*Fn-1

等于把这些v受影响的因素都加起来了。其中w0,w1...wn-1是权重,加起来应该是1; F0,F1,...Fn-1是转换矩阵

如果有单位法向量的话,也需要转换单位法向量:

n = w0*n*F0 + w1*n*F1……wn-1*n*Fn-1

这个可以自己编程在shader中计算,shader很灵活的,这也是为什么shader要成为主流的原因之一吧。

下面是vertex shader的代码片段,假设影响vertex blending的是两个骨骼:

uniform extern float4x4 gWorld;
uniform extern float4x4 gWorldInvTrans;
uniform extern float4x4 gWVP;// The matrix palette.
uniform extern float4x4 gFinalXForms[35];OutputVS VBlend2VS(float3 posL    : POSITION0,float3 normalL : NORMAL0,float2 tex0    : TEXCOORD0,float weight0  : BLENDWEIGHT0,int4 boneIndex : BLENDINDICES0)
{// Zero out our output.OutputVS outVS = (OutputVS)0;// 计算顶点的公式算法.这个是本章重点float weight1 = 1.0f - weight0;//因为权重加起来是1的,所以weight1+weight0 = 1;float4 p = weight0 * mul(float4(posL, 1.0f),gFinalXForms[boneIndex[0]]);p       += weight1 * mul(float4(posL, 1.0f),gFinalXForms[boneIndex[1]]);p.w = 1.0f;//表示顶点,所以w值为1// 计算单位法向量的公式算法,这个也是本章重点float4 n = weight0 * mul(float4(normalL, 0.0f),gFinalXForms[boneIndex[0]]);n       += weight1 * mul(float4(normalL, 0.0f),gFinalXForms[boneIndex[1]]);n.w = 0.0f;//表示方向,所以为值0// Transform normal to world space.outVS.normalW = mul(n, gWorldInvTrans).xyz;// Transform vertex position to world space.float3 posW  = mul(p, gWorld).xyz;// Transform to homogeneous clip space.outVS.posH = mul(p, gWVP);.. // 其他代码与本章无关..
}

骨骼Bone的数据结构可以自己写,但是D3DX提供了一个方便的类:D3DXFRAME

这个是D3DX的一个类,表示一个bone,但是为什么不直接叫bone呢?因为这个类也可以代表非bone的架构,比如房子的各个部分的表示等。

typedef struct _D3DXFRAME {LPSTR Name;D3DXMATRIX TransformationMatrix;LPD3DXMESHCONTAINER pMeshContainer;struct _D3DXFRAME *pFrameSibling;struct _D3DXFRAME *pFrameFirstChild;
} D3DXFRAME, *LPD3DXFRAME;

但是这个数据结构没有带根节点,那么我们只好自己定义了。再次看的出来“数据结构和算法”的基本功夫是多么重要的。

struct FrameEx : public D3DXFRAME
{D3DXMATRIX toRoot;
};

然后我们可以循环所有D3DXFRAME类,建造到根节点的变换矩阵。(又是数据结构和算法的知识了)

void SkinnedMesh::buildToRootXForms(FrameEx* frame,D3DXMATRIX& parentsToRoot)
{// 这里使用C++的同名变量节省一点空间.D3DXMATRIX& toParent = frame->TransformationMatrix;D3DXMATRIX& toRoot   = frame->toRoot;toRoot = toParent * parentsToRoot;//相当于frame->toRoot = toParent * parentsToRoot;FrameEx* sibling    = (FrameEx*)frame->pFrameSibling;FrameEx* firstChild = (FrameEx*)frame->pFrameFirstChild;// Recurse down siblings.if( sibling )buildToRootXForms(sibling, parentsToRoot);// Recurse to first child.if( firstChild )buildToRootXForms(firstChild, toRoot);
}

然后如下调用:

D3DXMATRIX identity;
D3DXMatrixIdentity(&identity);
buildToRootXForms((FrameEx*)mRoot, identity);

identity表示是对角单位矩阵,也就相当于数学的1,不过这里的是矩阵的1,任何数乘以对角单位矩阵都等于1.

因为我们本来就把根节点放置到世界坐标中,所以不需要转移或者变形。

3D模型动画技术 - 皮肤变形计算(skinned meshes)相关推荐

  1. Unity 3D模型动画导出为帧序列

    问题:将用于Unity的3D模型改成2D图片. 思路:把3D动画播放一遍,逐帧对模型截图. 代码说明: 1.要引用的命名空间 using System.IO; using UnityEngine; u ...

  2. 3D模型动画素材来源

    Unity Asset Store (模型.动画.插件,最推荐,因为几乎不会有格式.纹理适配问题) https://www.mixamo.com/#/ (人物模型.动画) 3D侠: https://w ...

  3. 【Web】使用Three.js制作有数据源控制的3D模型动画

    懒得写了,大概记录下步骤. 1. 使用开源软件Blender制作3D模型 1.1 Blender Blender类似于3DMax.Maya,是制作3D模型的工具软件,是开源软件,但较难使用,无法制作精 ...

  4. Unity(三十七):3D模型动画、脚本控制模型骨骼IK动画

    效果(左侧模型动画,右侧模型IK控制) 模型动画下载及导入 推荐模型动画下载链接地址 https://actorcore.reallusion.com/ Unity导入教程参见以下链接地址(需要科学上 ...

  5. 3D模型“换皮肤”有多简单?也就一句话的事

    丰色 发自 凹非寺 量子位 报道 | 公众号 QbitAI 给灰突突的3D模型加"新皮肤",这事儿能有多简单? 现在,只需要一句话就能搞定. 看! 一个普通小台灯,给个" ...

  6. 从零开始学习3D可视化之模型动画

    获取模型动画 播放模型动画 停止播放模型动画 在搭建3D可视化场景的过程中,我发现很多模型都有内置动画,很多模型在制作阶段就内置了动画,如果模型有内置动画,可以在 ThingJS 中利用 API 调用 ...

  7. Games104 Lecture 8 游戏引擎的动画技术基础

    游戏引擎的动画技术基础 动画技术的基础 2D游戏动画技术 3D游戏动画技术 Rigid Hierarchical Animation Per-vertex Animation 顶点动画 Morph T ...

  8. Unity快速入门之四 - Unity模型动画相关

    最近要给公司的小伙伴做Unity入门,针对几个常用的知识进行快速入门介绍. Unity快速入门之一 3D基础概念.Camera.Canvas RenderMode的几种方式对比_翕翕堂 Unity快速 ...

  9. 简述3D角色动画的应用及三大类型

    一.概述3D角色动画的应用 3D角色动画是计算机动画技术的一个重要组成部分,也是计算机图形学的一个分支.无论是在离 线渲染环境下,还是在实时渲染环境下,3D角色动画都得到了广泛的应用.在离线渲染环境下 ...

最新文章

  1. ASIFormDataRequest实现post的代码示例
  2. 深度学习 dns tunnel检测 使用统计特征 全连接网络——精度99.8%
  3. 利用ListView实现新闻客户端的新闻内容图文混排
  4. [NOIP2012提高组]国王游戏
  5. 使用工具分析 SAP UI5 应用前端执行的性能问题
  6. MySQL数据步骤管控_数据管理的发展过程分为哪三个阶段
  7. tinymce vue 部分工具不显示_工具栏图标未在tinymce(4.0.1)文本编辑器中显示
  8. 数电渣渣的一点学习感想(更新中)
  9. LDAP认证-ldap搭建
  10. 换个角度理解Android的AIDL原理
  11. @Transaction注解详解
  12. 《大数据时代》(维克托·迈尔·舍恩伯格)读书笔记
  13. 基于stm32的四轴无人机和智能车编程实践目录
  14. Brain:临床前和早期阿尔茨海默病的睡眠和纵向认知表现
  15. 中文转换为拼音工具类(很全)
  16. 说话人识别中的数据预处理和数据增强
  17. Latex排版技巧汇总
  18. Oracle常用函数总结
  19. 腾讯云服务器如何重装系统
  20. np.mat如何使用

热门文章

  1. PHPStrom2018最新版软件汉化教程,绝对靠谱
  2. 四川汶川发生7.6级地震
  3. untiy强制刷新UI
  4. 寂寞是灵魂深处的空虚
  5. 【报告分享】2022中国化妆品行业发展趋势洞察-易观分析(附下载)
  6. 量子计算遇见深度学习(下篇)
  7. mysql: [ERROR] unknown variable ‘sql_mode=STRICT_TRANS_TABLES
  8. 东莞数控机床上加工模具
  9. 创建vue脚手架 以及 图标不显示的解决
  10. 周末杂想-记一个普通周末