Cocos2d-x中3D相机的使用

转载自:http://cn.cocos2d-x.org/tutorial/show?id=2019

本教程是讲Cocos2d-x中相机的使用,在Cocos2d-x 3.2版本中加入了相机这个类,这个类在3D游戏中是必不可少的,因为3D游戏是一个立体的世界,在3D游戏中的摄像机就相当于是我们的眼睛,通过它我们可以观察整个的游戏世界。相机相当于人的眼睛,人在用眼睛看物体的时候,可以从理论上的任意位置,以任意的角度观察物体,所以物体的形状会受到相机的位置、旋转角度的影响而影响。

上图就是在3D游戏中使用相机的原理,当然这是一个透视投影的相机,我们在游戏中的相机就是根据图中的原理实现的。在游戏中一般有两种类型的相机:一种就是上图中介绍的透视相机,它在3D游戏中是很常见的。还有一种是正交投影相机,它没有像透视投影一样的近大远小的效果而是在相机内任何位置的物体的大小都是一样的,通常这种类型的相机都用在角色属性面板中显示的角色模型。说完了相机的两种类型,下面我们来看看在Cocos2d-x中我们是如何来创建相机的:

上面的代码就是创建了一个透视投影的相机,下面我来说明下参数的意义:第一个参数是FOV,即视场角(field of view),它可以理解为你的视线左右能看多宽(以角度计)第二个就是上述所有的宽高比,最后两个是相机的近裁面和远裁面,这个也很好理解,距离相机比近裁面还要近的,比远裁面还要远的,都不会被渲染到。

上图是正交相机的原理。

上面的代码就是创建了一个正交投影的相机,下面我来说明下参数的意义:第一个参数是相机的宽度,第二个就是相机的高度,最后两个是相机的近裁面和远裁面,这个也很好理解,距离相机比近裁面还要近的,比远裁面还要远的,都不会被渲染到。这个和透视相机是一样的。接下来,我们需要对相机设置一个标记位(FLAG),这样可以让相机与其他的相机区分开来--在一些游戏的应用中,通常不仅仅只有一个相机,如果有多个相机的话,那么我们要标记一个物体,到底是要被哪一个相机所"看到",这时候,我们就需要设置它的CameraMask来与相机的Flag对应:

如果同时存在多个相机,怎么标记某个物体被那些相机看到呢?


注意到Camera中有个_cameraFlag属性,为枚举类型,定义如下

1
2
3
4
5
6
7
8
9
10
11
12
enum class CameraFlag
{
DEFAULT=1,
USER1=1<<1,
USER2=1<<2,
USER3=1<<3,
USER4=1<<4,
USER5=1<<5,
USER6=1<<6,
USER7=1<<7,
USER8=1<<8,
};

Node中有个_cameraMask的属性,当相机的_cameraFlag & _cameraMask为true时,该Node可以被该相机看到。所以在上述相机的创建代码中,camera的CameraFlag设置为CameraFlag::USER1,并且该layer的CameraMask为2,则表示该layer只能被CameraFlag::USER1相机看到。如果你设置的精灵的cameraMask是3的话,它也是能被cameraFlag为CameraFlag::USER1和CameraFlag::USER2的相机看到的。我们还要注意如果你的精灵是在layer设置cameraMask之后添加的,它是不会被看到的,还需要手动再设置精灵的cameraMask。不要以为这样就可以了,最后我们还要把相机添加到场景中,不然我们还是看不到效果的,一定要记住呀,下图就是把相机加到场景中的代码:

这样一来我们就算是创建好相机啦,这只还是第一部哟,下面我来说下相机在游戏中是如何使用的。

一般来说在3D游戏中相机有三种使用方式:

  • 第一种就是自由相机

  • 第二种是第一人称相机

  • 第三种是第三人称相机

下面我们先来说第一种自由相机,这种类型的相机一般都多用在即时战略类型的游戏中,比如魔兽争霸3用的就是自由相机,这类相机可以随着鼠标的移动而移动,能够看到游戏场景中的任何位置,下图就是自由相机在Cocos2d-x中的使用方法:

怎么样是不是很简单,我们其实只要在移动函数中把在屏幕移动的距离赋值给相机,让相机跟随移动就可以了,需要注意的是我们在屏幕上上下移动相对于相机是前后移动,所以我们要把在屏幕移动的y值赋给相机的z,而且方向是反的因为我们向下滑屏幕相机是向前移动下上滑相机是向后移动。那么大家会问,我们既然是3D相机那么y轴怎么移动呐?下图就是相机拉近和拉远的实现:

第一张图是拉近,第二张图是拉远。这样我们也可以用Cocos2d-x来制作魔兽争霸3这样的游戏啦。

接下来我们来看第二种类型的相机,那就是第一人称的相机,这种相机其实很好理解,它就相当于是我们的眼睛看到的东西,这种相机多用在FPS类型的游戏中,像是使命的召唤就是这类相机,那么它能不能在Cocos2d-x中实现呐?答案是肯定的,我们来看下图:

其实就是把相机的位置绑在你在游戏中控制的角色上就可以啦,我们使用sprite3d的移动来代替在屏幕上滑动,也就是说我们在屏幕上滑动不是控制相机而是控制sprite3d,再把sprite3d的移动赋给相机,大家可能会问FPS游戏还可以旋转视角呀?咱们的相机可以实现,下面让我们来看代码:

这个是向左旋转。

这个是向右旋转。

通过这样的设置我们就能实现FPS游戏的效果了。

最后再来介绍下第三人称的相机,这类的相机多应用在MMORPG类型游戏中,这种类型的游戏是我们最最常见的游戏类型,现在大多数的网游都是这样的相机,它其实就是把第一人称的相机的位置设定在我们控制的角色身后一定距离的位置上,以便我们能看清自己操控的游戏角色,在Cocos2d-x中的实现和第一人称相机类似,相同的部分我们就不再说明了就是在得到角色位置赋值给相机后再把相机的位置加上个偏移量就可以了,偏移量我们用offset表示,如下图:

其他的像移动和旋转和第一人称相机是一样的,我就不在这里赘述了,这样就可以实现第三人称的相机了。

好了,今天的教程就先讲到这里,通过这篇教程,我们就可以在Cocos2d-x中创建属于我们自己的相机啦,通过创建相机来制作我们自己的3D游戏,以上讲的三种相机的实现以及使用方法都是非常简单的入门级介绍,可能大家觉得不太完整,没关系大家可以参考CppTest中的Camera Test这个代码,我的教程就是基于它写的,在Camera Test中有详细的代码实现供大家参考,希望大家能过制作出比肩大作的游戏,谢谢!

本文主要汇总Cocos引擎中文站以及Cocos2d-x论坛中的关于Cocos2d-x 3D相关的教程,帮助大家更快地了解Cocos2d-x中的3D功能。

看了这么多篇的3D教程,是否对Cocos2d-x的3D功能有了更多更好的了解了呢?也把你的开发经验或者实战项目分享给大家吧!

http://blog.csdn.net/minsenwu/article/details/17120495

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


    本文实践自 RayWenderlich、Ali Hafizji 的文章《How To Create Dynamic Textures with CCRenderTexture in Cocos2D 2.X》,文中使用Cocos2D,我在这里使用Cocos2D-x 2.1.4进行学习和移植。在这篇文章,将会学习到如何创建实时纹理、如何用Gimp创建无缝拼接纹
Cocos-code-ide使用入门学习地点:杭州滨江邮箱:appdevzw@163.com微信公众号:HopToad 欢迎转载,转载标注出处:http://blog.csdn.netotbaron/article/details/424343991.  软件准备 下载地址:http://cn.cocos2d-x.org/download 2.  简介2.1         引用C
第一次開始用手游引擎挺激动!!!进入正题。下载资源1:从Cocos2D-x官网上下载,进入网页http://www.cocos2d-x.org/download,点击Cocos2d-x以下的Download  v3.0,保存到自定义的文件夹2:从python官网上下载。进入网页https://www.python.org/downloads/,我当前下载的是3.4.0(当前最新
    Cocos2d-x是一款强大的基于OpenGLES的跨平台游戏开发引擎,易学易用,支持多种智能移动平台。官网地址:http://cocos2d-x.org/当前版本:2.0    有很多的学习资料,在这里我只做为自己的笔记记录下来,错误之处还请指出。在VisualStudio2008平台的编译:1.下载当前稳
1.  来源 QuickV3sample项目中的2048样例游戏,以及最近《最强大脑》娱乐节目。将2048改造成一款挑战玩家对数字记忆的小游戏。邮箱:appdevzw@163.com微信公众号:HopToadAPK下载地址:http://download.csdn.net/detailotbaron/8446223源码下载地址:http://download.csdn.net/
   Cocos2d-x3.x已经支持使用CMake来进行构建了,这里尝试以QtCreatorIDE来进行CMake构建。Cocos2d-x3.X地址:https://github.com/cocos2d/cocos2d-x1.打开QtCreator,菜单栏→"打开文件或项目...",打开cocos2d-x目录下的CMakeLists.txt文件;2.弹出CMake向导,如下图所示:设置
 下载地址:链接:https://pan.baidu.com/s/1IkQsMU6NoERAAQLcCUMcXQ提取码:p1pb下载完成后,解压进入build目录使用vs2013打开工程设置平台工具集,打开设置界面设置: 点击开始编译等待编译结束编译成功在build文件下会出现一个新文件夹Debug.win32,里面就是编译
分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!http://www.captainbed.net前言上次用象棋演示了cocos2dx的基本用法,但是对cocos2dx并没有作深入的讨论,这次以超级马里奥的源代码为线索,我们一起来学习超级马里奥的实
1. 圆形音量button事实上作者的本意应该是叫做“电位计button”。可是我觉得它和我们的圆形音量button非常像,所以就这么叫它吧~先看效果:好了,不多解释,本篇到此为止。(旁白: 噗。就这样结束了?)啊才怪~我们来看看代码:[cpp] viewplaincopyprint?CCContro
原文链接:http://www.cnblogs.com/physwf/archive/2013/04/26/3043912.html为了进一步深入学习贯彻Cocos2d,我们将自己写一个场景类,但我们不会走的太远,凡是都要循序渐进,哪怕只前进一点点,那也至少是前进了,总比贪多嚼不烂一头雾水的好。在上一节中我们建
2019独角兽企业重金招聘Python工程师标准>>>cocos2d2.0之后加入了一种九宫格的实现,主要作用是用来拉伸图片,这样的好处在于保留图片四个角不变形的同时,对图片中间部分进行拉伸,来满足一些控件的自适应(PS: 比如包括按钮,对话框,最直观的形象就是ios里的短信气泡了),这就要求图
原文链接:http://www.cnblogs.com/linji/p/3599478.html1.环境和工具准备Win7VS2010/2012,至于2008v2版本之后似乎就不支持了。 2.安装pythonv.2.0版本之前是用vs模板创建工程的,到vs2.2之后就改用python创建了。到python官网下载版本2.7.5的,然后
环境:ubuntu14.04adt-bundle-linux-x86_64android-ndk-r9d-linux-x86_64cocos2d-x-3.0正式版apache-ant1.9.3python2.7(ubuntu自带)加入环境变量exportANDROID_SDK_ROOT=/home/yangming/adt-bundle-linux/sdkexportPATH=${PATH}:/$ANDROID_SDK_ROOTools/export
1开发背景游戏程序设计涉及了学科中的各个方面,鉴于目的在于学习与进步,本游戏《FlappyBird》采用了两个不同的开发方式来开发本款游戏,一类直接采用win32底层API来实现,另一类采用当前火热的cocos2d-x游戏引擎来开发本游戏。2需求分析2.1数据分析本项目要开发的是一款游
原文链接:http://www.cnblogs.com/linji/p/3599912.html//纯色色块控件(锚点默认左下角)CCLayerColor*ccc=CCLayerColor::create(ccc4(255,0,0,128),200,100);//渐变色块控件CCLayerGradient*ccc=CCLayerGradient::create(ccc4(255,0,0,
原文链接:http://www.cnblogs.com/linji/p/3599488.html//载入一张图片CCSprite*leftDoor=CCSprite::create("loading/door.png");leftDoor->setAnchorPoint(ccp(1,0.5));//设置锚点为右边中心点leftDoor->setPosition(ccp(240,160));/
为了答谢广大学员对智捷课堂以及关老师的支持,现购买51CTO学院关老师的Cocos2d-x课程之一可以送智捷课堂编写图书一本(专题可以送3本)。一、Cocos2d-x课程列表:1、Cocos2d-x入门与提高视频教程__Part22、Cocos2d-x数据持久化与网络通信__Part33、Cocos2d-x架构设计与性能优化内存优
Spawn让多个action同时执行。Spawn有多种不同的create方法,最终都调用了createWithTwoActions(FiniteTimeAction*action1,FiniteTimeAction*action2)方法。createWithTwoActions调用initWithTwoActions方法:对两个action变量初始化:_one=action1;_two=action2;如果两个a
需要环境:php,luajit.昨天在cygwin上安装php和luajit环境,这真特么是一个坑。建议不要用虚拟环境安装打包环境,否则可能会出现各种莫名问题。折腾了一下午,最终将环境转向linux。其中,luajit的安装脚本已经在quick-cocos2d-x-develop/bin/中,直接luajit_install.sh即可。我的lin
v3.0相对v2.2来说,最引人注意的。应该是对触摸层级的优化。和lambda回调函数的引入(嗯嗯,不枉我改了那么多类名。话说,每次cocos2dx大更新。总要改掉一堆类名函数名)。这些特性应该有不少人研究了,所以今天说点跟图片有关的东西。v3.0在载入图片方面也有了非常大改变,仅仅只是