转载自: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功能。

  • Cocos2d-x的3D特性

  • Earth Warrior 3D 大揭秘

  • 分析《FantasyWarrior3D》结构

  • Cocos2d-x 3D 模型抗锯齿方法

  • Cocos2d-x 3.3 的3D开发功能介绍

  • Cocos2d-x 3D 建模规范及注意事项

  • Cocos2d-x 3.x 3D跑酷游戏系列教程

  • Cocos2d-x 3D《捕鱼达人3》系列教程

  • Cocos2d-x 3D 模型查看器(Mac & Win)

  • Cocos2d-x 3D fbx-conv 批量转换脚本

  • Cocos2d-x 塔防游戏贼来了加入3D特性

  • Cocos2d-x Sprite3D用法和相关特性详解

  • Cocos2d-x 3D FantasyWarrior3D 项目开源

  • Cocos2d-x 3D战斗类游戏制作【模块一】-- 数据库(1)

  • Cocos2dx 3D战斗类游戏制作【模块一】-- 数据库(2)

  • 【Cocos2d-x 3.2】总结Grid3DAction 几种常用3D特效

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

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

Cocos2d-x中3D相机的使用相关推荐

  1. Unity3D 中 3D 相机和 UI 相机的融合

    项目中需要一个界面成像摄像头画面,如果采用UI 元素进行显示,如:RawImage 进行显示,但会出现摄像机画面太大问题,即看着像相机的焦距放的很大. RawImage 是UI 元素,无法通过缩放或者 ...

  2. 3D中的相机 - 投影矩阵和视图矩阵

    3D中的相机 - 投影矩阵和视图矩阵 3d游戏中,一般通过相机的设置来计算投影矩阵和视图矩阵,比如untiy和cocos,一般情况下我们不用关注如何计算, 可以直接在可视化的编辑器中调整参数就可以了, ...

  3. Unity场景中的双相机设置,3D相机和2D相机设置

    unity场景中需要双相机,其中3D相机专摄场景物体3D显示,2D相机则专用于显示屏幕的UI元素. 3D设置: 2D设置:(别忘了给Canvas拖一下相机路径) 注意相机的Clipping Plane ...

  4. 3D相机(1):1、了解

    前言:随着机器视觉, 自动驾驶等颠覆性的技术逐步发展, 采用 3D 相机进行物体识别, 行为识别, 场景建模的相关应用越来越多, 可以说 3D 相机就是终端和机器人的眼睛. 那什么是 3D 相机呢? ...

  5. 3D相机的数据处理方式

    在上一篇中,我们介绍了什么是3D相机.但是对于初次接触3D相机的同学,可能首先面临的问题是如何处理3D相机得到的数据.3D相机的数据分为两种方式:三维点云数据方式,二维数据方式.其中,三维数据保存的格 ...

  6. opencv运动目标跟踪预测_浅谈多目标跟踪中的相机运动

    ©PaperWeekly 原创 · 作者|黄飘 学校|华中科技大学硕士生 研究方向|多目标跟踪 之前的文章中我介绍了 Kalman 滤波器,这个算法被广泛用于多目标跟踪任务中的行人运动模型.然而实际场 ...

  7. 浅谈多目标跟踪中的相机运动

    ©PaperWeekly 原创 · 作者|黄飘 学校|华中科技大学硕士生 研究方向|多目标跟踪 之前的文章中我介绍了 Kalman 滤波器,这个算法被广泛用于多目标跟踪任务中的行人运动模型.然而实际场 ...

  8. OpenCV使用Orbbec Astra 3D相机

    OpenCV使用Orbbec Astra 3D相机 使用Orbbec Astra 3D相机 介绍 安装说明 代码 使用Orbbec Astra 3D相机 介绍 本教程专门针对Orbbec 3D相机的A ...

  9. Halcon|读取3D相机点云数据

    Halcon|读取3D相机点云数据 最近发现很多小伙伴在使用Halcon处理3D工业相机扫描结果的时候遇到了"如何读取"的问题.一般的3D工业相机储存数据的格式有txt格式.tif ...

最新文章

  1. Android环境搭建和Android HelloWorld—Android开发环境搭建
  2. java大string排序_java中字符串排序,String 转化为int比较大小
  3. linux下,redis 3.2.1双节点集群安装部署
  4. Altium_Designer-PCB的覆铜步骤
  5. 更改span标签样式_CSS 内嵌样式
  6. 二叉树的一些leetcode题目+python(c++)
  7. ieee754浮点数转换工具_关于JS浮点数运算不精确的原因和解决方案
  8. python简单爬虫入门一_Python爬虫快速入门:基本结构简单实例
  9. C# 事务提交(非数据库)
  10. canvas 压缩图片上传
  11. HTML5页面播放音乐
  12. 初学用于华为鸿蒙系统(HarmonyOS)的编程开发工具HUAWEI DevEco Studio
  13. Xshell 5下载详细教程
  14. python操作模拟器多开操作_窗口多开模拟器同步操作器▲按键精灵脚本▲
  15. 一文教会你使用 Neo4j 快速构建明星关系图谱
  16. android开发便签实验报告,什么是艾宾浩斯遗忘曲线?利用这一记忆规律可以提升孩子记忆力...
  17. 私有云基础架构设计:存储、网络、计算、安全和应用的设计最佳实践及案例
  18. 北京大学计算机科学技术研究所研究员万小军:机器写稿技术与应用 | CCF-GAIR 2017...
  19. 中国100句绝美爱情诗
  20. ModelSim: Module is not defined

热门文章

  1. SQLsever创建作业步骤
  2. python字符串转换为整数_PYthon如何把一个字符串类型转换为整数类型?
  3. 16条思想精华之《人性的弱点》读书笔记
  4. java 工具类-去除字符串中特殊字符、全角转为半脚、获取字符串中姓名/电话、姓名重复后追加a.b.c...aa,ab..
  5. 聊一聊如何用C#轻松完成一个SAGA分布式事务
  6. 医疗网络营销之如何提升对话转化率
  7. A-level Computer Science Review
  8. 基于JAVA的课程设计《智能捡火柴小程序》
  9. 如何在Word文档中插入一条分隔线?
  10. matlab泊松回归程序,如何实现泊松回归?