Cocos2d-x 3.x 图形学渲染系列十一
笔者介绍:姜雪伟。IT公司技术合伙人,IT高级讲师,CSDN社区专家,特邀编辑,畅销书作者,国家专利发明人;已出版书籍:《手把手教你架构3D游戏引擎》电子工业出版社和《Unity3D实战核心技术具体解释》电子工业出版社等。
Avatar换装系统又称为纸娃娃系统。在游戏开发中是使用很广泛的技术。特别是在MMOARPG或者是MMORPG等网络游戏中,玩家创建的3D角色都具有Avatar换装功能,在游戏开发中常常须要对角色更换装备。比方角色在战斗过程中获取到新的盔甲要穿戴在身上或者新的武器要更换等等。
要实现该技术所使用的引擎都必须具有支持Avatar换装系统的骨骼挂节点,比方市面上的Unity引擎,UE4引擎等都提供了这样的挂接骨骼方法。获取到骨骼挂节点后,能够直接将武器挂接到须要绑定的骨骼上。实现的效果例如以下图:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvanh3MTY3/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />
场景中的三个角色採用了Avatar换装技术。它们採用的是同一套骨架,将须要更换的各个Mesh模型都挂接到相应的骨架上,从而形成了Avatar换装系统。而本书介绍的Cocos2d-x引擎也不例外,该引擎也提供了支持Avatar技术的功能,实现该功能的类是AttachNode。
以下介绍实现挂接结点的步骤,不论是挂接Mesh还是在角色身上挂接武器都须要依据骨骼挂接。这就要用到AttachNode类实现的功能。实现的函数例如以下所看到的:
AttachNode* AttachNode::create(Bone3D* attachBone)
{
auto attachnode = new (std::nothrow) AttachNode();
attachnode->_attachBone = attachBone;
attachnode->autorelease();
return attachnode;
}
首先是创建须要挂接的骨骼,骨骼动画是须要矩阵支撑的。骨骼动画它在世界坐标系中的变换都须要转换到世界变换矩阵,这些实现过程也须要引擎提供,以下把接口的函数给读者展演示样例如以下:
Mat4 AttachNode::getWorldToNodeTransform() const
{
static Mat4 mat;
mat.setIdentity();
auto parent = getParent();
if (parent)
{
mat=parent->getWorldToNodeTransform() * _attachBone->getWorldMat() * Node::getNodeToParentTransform();
}
else
{
mat=_attachBone->getWorldMat() * Node::getNodeToParentTransform();
}
return mat;
}
getWorldToNodeTransform函数的实现原理是把模型挂接到骨骼上,该骨骼是须要挂接模型的父结点,父结点运动会带动所绑的模型运动,从而保证挂接到骨骼结点的武器能够与骨骼动画一致。这个实现过程是与矩阵相关的,通过案例把实现的代码片段给读者展演示样例如以下:
//Girl.c3b里保存了女角色所运行动画的全部零件(姑且这么叫吧)包含衣服,鞋子等等
std::string fileName = "Sprite3DTest/Girl.c3b";
auto sprite = Sprite3D::create(fileName);
sprite->setScale(4);
sprite->setRotation3D(Vec3(0,0,0));
addChild(sprite);
sprite->setPosition( Vec2( p.x, p.y-60) );
auto animation = Animation3D::create(fileName);
if (animation)
{
auto animate = Animate3D::create(animation);
sprite->runAction(RepeatForever::create(animate));
}
_sprite = sprite; _curSkin[SkinType::UPPER_BODY] = "Girl_UpperBody01";
_curSkin[SkinType::PANTS] = "Girl_LowerBody01";
_curSkin[SkinType::SHOES] = "Girl_Shoes01";
_curSkin[SkinType::HAIR] = "Girl_Hair01";
_curSkin[SkinType::FACE] = "Girl_Face01";
_curSkin[SkinType::HAND] = "Girl_Hand01";
_curSkin[SkinType::GLASSES] = "";
上面的代码片段是针对一个模型进行换装操作,首先实现的是对换装的部位进行初始化操作。以下開始遍历获取到骨骼动画挂接的数量,对于挂接的模型,假设是多个通过显示和隐藏将其显示出来。
以下的代码片段函数是ApplySkin,函数内容片段例如以下所看到的:
//函数getMeshCount获取动画全部零件数目
for (ssize_t i = 0; i < _sprite->getMeshCount(); i++) {
auto mesh = _sprite->getMeshByIndex(static_cast<int>(i));
bool isVisible = false;
for (auto& it : _curSkin) {
if (mesh->getName() == it.second)
{
isVisible = true;
break;
}
}
//通过索引来获取零件并设置可见性
_sprite->getMeshByIndex(static_cast<int>(i))->setVisible(isVisible);
}
以下给大家展示应用案例代码例如以下所看到的:
std::string str = _curSkin[SkinType::HAIR];
if (str == "Girl_Hair01")
_curSkin[SkinType::HAIR] = "Girl_Hair02";
else
_curSkin[SkinType::HAIR] = "Girl_Hair01";
同一时候要调用ApplySkin函数就能够完毕换装的要求。实现效果例如以下图:
场景中的角色裤子、头发、鞋子都发生了改变。完毕换装。
关于换装。笔者在CSDN学院出版一个免费的视频讲座《游戏Avatar换装系统》。供开发人员參考。
Cocos2d-x 3.x 图形学渲染系列十一的更多相关文章
- Cocos2d-x 3.x 图形学渲染系列十五
笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,CSDN社区专家.特邀编辑,畅销书作者,国家专利发明人;已出版书籍:<手把手教你架构3D游戏引擎>电子工业出版社和<Unity3D ...
- SQL Server 2008空间数据应用系列十一:提取MapInfo地图数据中的空间数据解决方案
原文:SQL Server 2008空间数据应用系列十一:提取MapInfo地图数据中的空间数据解决方案 友情提示,您阅读本篇博文的先决条件如下: 1.本文示例基于Microsoft SQL Serv ...
- java基础解析系列(十一)---equals、==和hashcode方法
java基础解析系列(十一)---equals.==和hashcode方法 目录 java基础解析系列(一)---String.StringBuffer.StringBuilder java基础解析系 ...
- 新书《Cocos2dx 3.x 3D图形学渲染技术讲解》问世
笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,CSDN社区专家,特邀编辑,畅销书作者,已出版书籍:<手把手教你架构3D游戏引擎>电子工业出版社和<Unity3D实战核心技术详解 ...
- struts2官方 中文教程 系列十一:使用XML进行表单验证
在本教程中,我们将讨论如何使用Struts 2的XML验证方法来验证表单字段中用户的输入.在前面的教程中,我们讨论了在Action类中使用validate方法验证用户的输入.使用单独的XML验证文件让 ...
- 爬虫系列(十一) 用requests和xpath爬取豆瓣电影评论
这篇文章,我们继续利用 requests 和 xpath 爬取豆瓣电影的短评,下面还是先贴上效果图: 1.网页分析 (1)翻页 我们还是使用 Chrome 浏览器打开豆瓣电影中某一部电影的评论进行分析 ...
- JBoss 系列十一:JBoss Cluster Framework Demo 介绍
内容概要 JBoss Cluster Framework Demo包括JGruops.JBossCache.Infinispan,我们在随后的系列中会使用和运行这些示例来说明JGroups.JBoss ...
- BootStrap 智能表单系列 十一 级联下拉的支持
像省市县选择的这种,但凡是个人肯定都见过,实现方式有很多种 1.有在第一级选择的时候去加载或者从本地对象中拿第一级对应的数据源显示到列表中,第二级以此类推 2.也有将所有的项都加载到select中,然 ...
- Alamofire源码解读系列(十一)之多表单(MultipartFormData)
本篇讲解跟上传数据相关的多表单 前言 我相信应该有不少的开发者不明白多表单是怎么一回事,然而事实上,多表单确实很简单.试想一下,如果有多个不同类型的文件(png/txt/mp3/pdf等等)需要上传给 ...
随机推荐
- 300 Longest Increasing Subsequence 最长上升子序列
给出一个无序的整形数组,找到最长上升子序列的长度.例如,给出 [10, 9, 2, 5, 3, 7, 101, 18],最长的上升子序列是 [2, 3, 7, 101],因此它的长度是4.因为可能会有 ...
- 299 Bulls and Cows 猜数字游戏
你正在和你的朋友玩猜数字(Bulls and Cows)游戏:你写下一个数字让你的朋友猜.每次他猜测后,你给他一个提示,告诉他有多少位数字和确切位置都猜对了(称为”Bulls“, 公牛),有多少位数字 ...
- Spring-security配置代码
@Configuration public static class WebSecurityConfigurer extends WebSecurityConfigurerAdapter{ @Over ...
- Dojo - 操作Dom的函数
DOM Manipulation You might be seeing a trend here if you have gotten this far in the tutorial, in th ...
- UVM基础之---------uvm factory机制base
从名字上面就知道,uvm_factory用来制造uvm_objects和component.在一个仿真过程中,只有一个factory的例化存在. 用户定义的object和component types ...
- Redis系列(五)--主从复制
单机环境存在的问题: 1.机器故障,直接凉凉 2.容量瓶颈 3.QPS瓶颈 主从复制 对于可拓展平台来说,复制(replication)是必不可少的.replication可以让其他服务器slave拥 ...
- Android studio开发-第一个应用
Android studio开发-第一个应用 上效果图 1.先创建布局文件 firstbutton.xml 代码 <?xml version="1.0" encoding=& ...
- ibatis常用16条SQL语句
(1) 输入参数为单个值 <delete id="com.fashionfree.stat.accesslog.deleteMemberAccessLogsBefore" p ...
- C++ 迭代器运算符 箭头运算符->
所有标准库容器都支持迭代器,只有少数几种才支持下标运算 迭代器运算符 运算符 作用 *iter 返回迭代器iter所指元素的引用 iter -> mem 解引用iter,并获取元素名为mem的成 ...
- [Luogu] P4254 [JSOI2008]Blue Mary开公司
题目背景 Blue Mary 最近在筹备开一家自己的网络公司.由于他缺乏经济头脑,所以先后聘请了若干个金融顾问为他设计经营方案. 题目描述 万事开头难,经营公司更是如此.开始的收益往往是很低的,不过随 ...