一直以来Cocos2d-x游戏引擎留给大家的印象是一款纯2D游戏引擎,它在2D手机游戏开发方面有很出色的表现,不过现在我要告诉大家,今天的Cocos2d-x已经不再是一款只能开发2D游戏的游戏引擎了,从v3.1版本开始,Cocos2d-x已经支持obj格式的3D静态模型的显示,在v3.2 版本中支持3D骨骼动画,不过在这两个版本中3D模型还不支持submesh,这个不用担心,在未来的v3.3版本中我们将全面支持submesh及子模型绑定到骨骼的功能,接下来我会详细的向大家介绍关于Sprite3D的用法和相关特性。

如果你已经是Cocos2d-x引擎的用户,那么你一定对Sprite类非常熟悉,使用这个类你可以创建你想要的2D精灵。Cocos2d-x 在3.1版本中添加了Sprite3D类,从字面上你可能已经猜到,Sprite3D是一个创建3D精灵的类,通过这个类,你可以创建3D精灵对象。

目前,我们可以支持3种模型格式,分别是obj,c3t,c3b,其中c3t和c3b是通过FBX模型文件进行二次转换后得到的,FBX是一种通用导出格式,可以通过maya或max进行导出,接下来向大家介绍一下这几种文件格式:

* obj:obj是max或maya默认可以导出的格式,不需要任何转换,但是它有一个缺点就是不支持动画的导出。

* c3t:c3t文件是通过FBX模型文件转换后生成的Json格式的文件,使用c3t格式的目的是方便用户进行模型数据的查看和版本比较,由于c3t文件是Json格式的,所以它的文件体积比较大,载入速度也比较慢,通常在实际游戏中不提倡使用。

* c3b:c3b是二进制文件,数据的内容与c3t文件是一样的,不同的是c3b文件体积小,加载速度快,提倡在实际游戏开发中使用。

以上是关于模型文件的介绍,接下来我们将具体介绍如何在Cocos2d-x应用程序中去添加3D精灵对象。

第一步:建模并导出模型

直接有fbx模型文件的同学可直接忽略此步骤。

3D模型往往是由复杂的网格数据构成的,所以不可能通过代码来生成模型,这时你需要让3D美术同学为你在Max或Maya中构建一个你想要的模型,Max和Maya的版本建议是2012或2013版本。如果你的模型需要有动画,那么还要完成骨骼动画的创建,建好模型后将模型导出,在这里我们导出FBX格式,以Max导出过程为例:选择 文件->导出->导出FBX格式,确定后弹出FBX导出界面 如图:

如果有骨骼动画,记得要勾选Animation选项,其他选型参考上面截图,在这里需要注意的是目前一个模型只能有一个material,如图:

不支持multi-object或sub-object,而且模型只能有一个骨架,不能有多个父节点,如下图:

第二步:使用转换插件将FBX文件转换为c3b或c3t

首先,把fbx文件复制到转换工具的同一级目录下。

然后,通过命令行进入到Cocos2d-x/tools/ 目录下并输入命令:FBX_CONV_DIR -a xx.fbx (FBX_CONV_DIR 是转换插件的完整路径xx/xx/fbx-conv),命令中的-a表示同时输出c3b和c3t文件,你还可以使用-b或-t来单独输出c3b或-c3t文件,转换后的文件会生成到当前目录下。

第三步:创建新项目

  1. $ cd cocos2d-x

  2. $ ./setup.py //(输入上面命令后,你需要设置一些环境变量,当然如果你不想发布到真机也可以直接按“回车”忽略)

  3. $ source FILE_TO_SAVE_SYSTEM_VARIABLE //(按照提示输入即可,目的是保存系统变量的修改)

  4. $ cocos new MyGame -p com.your_company.mygame -l cpp -d NEW_PROJECTS_DIR $ cd NEW_PROJECTS_DIR/MyGame //(生成新工程,并输入工程相关的信息,按照提示输入即可)

完成上面的操作后你将会在你指定的目录下找到这个新创建的工程文件夹,如果你不指定生成的路径,默认会生成到cocos2d-x/目录下。

第三步:创建3D精灵

打开新创建的工程,在Class目录下找到HelloWorldScene.cpp文件,打开后找到 bool HelloWorld::init() 函数,在函数的下方你会看到如面代码

auto sprite = Sprite::create("HelloWorld.png”);

这段代码创建了一个2D精灵,下面我来教大家如何创建3D精灵。

首先,在文件的头部添加

#include "3d/CCSPrite3D.h"

然后,修改创建精灵的代码为:

auto sprite = Sprite3D::create(“tortoise.c3b”);

通过这段代码可以看出,我们用Sprite3D代替了Sprite来创建精灵对象,使用它我们可以像创建2D精灵一样去创建3D精灵,接下来你会发现Sprite3D的用法与Sprite几乎是相同的,这样以来使用Sprite3D是不是变的更简单了呢?

在这里我们需要注意一点,tortoise.c3b 是我们之前导出的模型文件,你需要将它和它对应的贴图拷贝到Resources目录下,否则运行时会找不到资源,接下来编译运行,你可以看到一只巨大的3D海龟出现在屏幕上,如图:

现在我想让它缩小一些,根据以往使用Sprite的经验,我需要调用精灵的setScale(float)函数,然后传入一个缩放比例,相同的方法对于3D精灵同样适用,我在创建精灵代码的下方添加如下代码:

sprite->setScale(0.3);

运行如图:

这样看起来是不是自然很多呢?

第四步:播放动画

目前看到的效果好像跟我们想像的不太一样,为什么这个乌龟只是静静的在那却没有任何动作呢?这是因为你还赋予它动画,接下来我们需要添加下面代码:

在文件头部添加

  1. #include "3d/CCAnimation3D.h"

  2. #include "3d/CCAnimate3D.h”

或者直接包含cocos2d.h引入所有的3d头文件

然后在创建精灵的后面添加创建动画代码,如下:

  1. auto animation =Animation3D::getOrCreate(“tortoise.c3b”);

  2. if (animation)

  3. {

  4. auto animate = Animate3D::create(animation);

  5. sprite->runAction(RepeatForever::create(animate));

  6. }

这段代码的意思是使用tortoise.c3b来创建Animation3D然后再通过它去创建Animate3D对象,Animate3D是派生自ActionInterval类的,也就是说3D部分的动作与原有Cocos2d-x动作是兼容的,在这里我们通过RepeatForever::create()

函数去创建一个循环动作,然后再通过3D精灵去调用runAction()函数来播放这个动作,再次运行你会发现海龟动起来了,如果你对播放速度不满意,可以调用动画的setSpeed(float)传入一个浮点值来改变播放速度,如下:

animate->setSpeed(2.f);

通过这种方式让播放速度变为原来的两倍,当然你还可以创建 MoveTo,RotateBy 等动作来控制海龟的移动。

以上就是今天我要告诉大家的关于3D精灵的一些使用方法,更多应用可以参考cpp-tests中的3D:Sprite3D实例,熟悉了3D精灵以后,你便可以自己动手创造属于你的3D游戏啦!!

推荐阅读:

Cocos2d-x的3D特性

Sprite 3D用法和相关特性详解相关推荐

  1. 学习笔记(一):Java中Stream的基本用法和相关API详解

    目录 引言 一.什么是Stream 二.Stream有什么用 三.Stream的分类 四.常用的Stream创建方法 1. Stream.of()方法 2. Arrays.stream() 3. 集合 ...

  2. CSS3新特性详解(三):CSS3 2D转换和3D转换 transform 变形使用详解

      关于CSS3新特性,在上篇博文中"CSS3新特性详解(二):CSS3 字体@font-face详解.如何创建和修改woff字体文件及text-shadow等文本效果",讨论了C ...

  3. 4.6 W 字总结!Java 11—Java 17特性详解

    作者 | 民工哥技术之路 来源 | https://mp.weixin.qq.com/s/SVleHYFQeePNT7q67UoL4Q Java 11 特性详解 基于嵌套的访问控制 与 Java 语言 ...

  4. java11 新特性 详解

    为什么80%的码农都做不了架构师?>>>    引言: 点击-->java10 新特性 详解 点击-->java9 新特性 详解 点击-->java8 新特性 详解 ...

  5. 【干货】PMcaff干货课程学习精彩分享:Apple Watch 技术特性详解

    昨天PMcaff给大家推荐了Apple Watch的发布会,好多小伙伴们在后台留言,所以PMcaff小咖今天给大家找来一篇干货,看完感觉还不错,在这里分享给大家. 作为苹果主推的智能穿戴产品,Appl ...

  6. linux 子域dns,linux下搭建DNS子域及相关授权详解

    linux下搭建DNS子域及相关授权详解forward功能是本地无法解析的域名,转发给指定DNS服务器 forward only; 所有无法解析的域名,都转发给指定DNS服务器,必须有解析结果 for ...

  7. linux下搭建DNS子域及相关授权详解

    linux下搭建DNS子域及相关授权详解 forward功能是本地无法解析的域名,转发给指定DNS服务器 forward only; 所有无法解析的域名,都转发给指定DNS服务器,必须有解析结果 fo ...

  8. UE5 官方案例Lyra 全特性详解 9.蓝图消息系统

    UE5 官方案例Lyra 全特性详解 0.前言 1.消息监听蓝图节点 1.1 监听限定 1.2 消息输出 2. 广播消息蓝图节点 3.其他相关蓝图节点 4. 后续更新 0.前言 最近在和三个小伙伴一起 ...

  9. Android群英传笔记——第十二章:Android5.X 新特性详解,Material Design UI的新体验

    Android群英传笔记--第十二章:Android5.X 新特性详解,Material Design UI的新体验 第十一章为什么不写,因为我很早之前就已经写过了,有需要的可以去看 Android高 ...

最新文章

  1. Python实现打印螺旋矩阵功能的方法
  2. Flutter全局悬浮按钮
  3. [Leetcode][第24题][JAVA][两两交还的链表中的节点][递归][三指针]
  4. Xml转换成html表格代码,如何用C++代码将XML文件转换为HTML表格?
  5. Python学习汇总,做数据采集的一些小技巧,收获满满
  6. [转]微软代码示例:ASP.NET 2.0 三层架构应用程序教程系列
  7. Qt Creator 自动补齐变慢的解决
  8. linux i o端口编程,linux 操作 I/O 端口
  9. AOL架构原则.优秀API设计.Yeoman工具
  10. 最经典的大数据案例解析(附代码)
  11. Android 常用炫酷控件(开源项目)git地址汇总
  12. Ubuntu安装、更新显卡驱动
  13. matlab画进化树分析图,教你用ggtree绘制高颜值进化树
  14. linux中wine文件夹在哪,linux下wine的使用
  15. 2021 BNU Winter Training 9 (2020CCPC东北四省赛)
  16. 這是一位女生寫的 - 男生如何追求女生
  17. 射极跟随器负载过重引起的失真问题(摘抄)
  18. 提取FBX文件中mesh的信息
  19. 解决Windows10电脑时间不同步或无法更新问题
  20. 浅析项目工作量估算方法

热门文章

  1. mac(苹果)电脑终端使用技巧
  2. CSAPP实验记录(三):Attack lab
  3. api 二次 开发 禅道_禅道 Rest API 开发
  4. 3分钟搭建一个网站?腾讯云Serverless开发体验
  5. 处理RCV_TRANSACTIONS_INTERFACE的数据
  6. 双活数据中心概念及优缺点介绍
  7. 阿里云盾AliYunDun服务IO超高
  8. 未分配虚拟网络-清理注册表
  9. radeon r600 hpd中断处理
  10. Tic-Tac-Toe:基于Minimax算法的人机对弈程序(python实现)