热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Cocos2d-x中3D相机的使用

本教程是讲Cocos2d-x中相机的使用,在Cocos2d-x3.2版本中加入了相机这个类,这个类在3D游戏中是必不可少的,因为3D游戏是一个立体的世界,在3D游戏中的摄像机就相当于是我们的睛,通过它我们可以观察整个的游戏世界。相机相当于人的睛,人在用睛看物体的时

本教程是讲Cocos2d-x中相机的使用,在Cocos2d-x 3.2版本中加入了相机这个类,这个类在3D游戏中是必不可少的,因为3D游戏是一个立体的世界,在3D游戏中的摄像机就相当于是我们的睛,通过它我们可以观察整个的游戏世界。相机相当于人的睛,人在用睛看物体的时

本教程是讲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中的使用方法:

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

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


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

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

这个是向左旋转。

这个是向右旋转。

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


最后再来介绍下第三人称的相机,这类的相机多应用在MMORPG类型游戏中,这种类型的游戏是我们最最常见的游戏类型,现在大多数的网游都是这样的相机,它其实就是把第一人称的相机的位置设定在我们控制的角色身后一定距离的位置上,以便我们能看清自己操控的游戏角色,在Cocos2d-x中的实现和第一人称相机类&#20284;,相同的部分我们就不再说明了就是在得到角色位置赋&#20540;给相机后再把相机的位置加上个偏移量就可以了,偏移量我们用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 塔防游戏&#36156;来了加入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
推荐阅读
  • 本文介绍了如何通过安装 sqlacodegen 和 pymysql 来根据现有的 MySQL 数据库自动生成 ORM 的模型文件(model.py)。此方法适用于需要快速搭建项目模型层的情况。 ... [详细]
  • 本文将探讨面试过程中常见的八大问题,并提供有效的应对策略,帮助求职者更好地准备面试,避免落入陷阱。通过本文的指导,求职者可以在面对类似问题时更加自信地展现自己。 ... [详细]
  • 本文探讨了Windows 10 64位系统的实际使用体验,并与Windows 7进行了详细对比,旨在帮助用户了解两者之间的主要差异及选择合适的操作系统。 ... [详细]
  • HBase 数据复制与灾备同步策略
    本文探讨了HBase在企业级应用中的数据复制与灾备同步解决方案,包括存量数据迁移及增量数据实时同步的方法。 ... [详细]
  • 如何更改Win10本地管理员账户名称
    本文详细介绍了更改Windows 10操作系统中本地管理员账户名称的方法,包括通过计算机管理界面进行操作的具体步骤。 ... [详细]
  • 本文探讨了程序员这一职业的本质,认为他们是专注于问题解决的专业人士。文章深入分析了他们的日常工作状态、个人品质以及面对挑战时的态度,强调了编程不仅是一项技术活动,更是个人成长和精神修炼的过程。 ... [详细]
  • TCP协议中的可靠传输机制分析
    本文深入探讨了TCP协议如何通过滑动窗口和超时重传来确保数据传输的可靠性,同时介绍了流量控制和拥塞控制的基本原理及其在实际网络通信中的应用。 ... [详细]
  • 在1995年,Simon Plouffe 发现了一种特殊的求和方法来表示某些常数。两年后,Bailey 和 Borwein 在他们的论文中发表了这一发现,这种方法被命名为 Bailey-Borwein-Plouffe (BBP) 公式。该问题要求计算圆周率 π 的第 n 个十六进制数字。 ... [详细]
  • 本文详细介绍了如何在Oracle VM VirtualBox中实现主机与虚拟机之间的数据交换,包括安装Guest Additions增强功能,以及如何利用这些功能进行文件传输、屏幕调整等操作。 ... [详细]
  • CSS Border 属性:solid 边框的使用详解
    本文详细介绍了如何在CSS中使用solid边框属性,包括其基本语法、应用场景及高级技巧,适合初学者和进阶用户参考。 ... [详细]
  • 2023年,Android开发前景如何?25岁还能转行吗?
    近期,关于Android开发行业的讨论在多个平台上热度不减,许多人担忧其未来发展。本文将探讨当前Android开发市场的现状、薪资水平及职业选择建议。 ... [详细]
  • 本文介绍了SIP(Session Initiation Protocol,会话发起协议)的基本概念、功能、消息格式及其实现机制。SIP是一种在IP网络上用于建立、管理和终止多媒体通信会话的应用层协议。 ... [详细]
  • 二维码的实现与应用
    本文介绍了二维码的基本概念、分类及其优缺点,并详细描述了如何使用Java编程语言结合第三方库(如ZXing和qrcode.jar)来实现二维码的生成与解析。 ... [详细]
  • 在日常生活中,支付宝已成为不可或缺的支付工具之一。本文将详细介绍如何通过支付宝实现免费提现,帮助用户更好地管理个人财务,避免不必要的手续费支出。 ... [详细]
  • 解决Win10系统显示模糊问题的方法
    Windows 10作为一款深受用户喜爱的操作系统,提供了丰富的个性化设置选项,让每位用户都能根据个人偏好定制系统界面。然而,在进行个性化设置的过程中,有时会出现显示模糊的情况,影响用户体验。本文将详细介绍如何有效解决Win10系统显示模糊的问题。 ... [详细]
author-avatar
鲁小姐就不用围脖
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有