3D跑酷教程 —— 相机的使用
在这章教程中,我们将重点讲解相机在3D游戏中的使用。相机是3D游戏里一个常用的概念,但在2D游戏中相对少见,不过也有一些例外,例如类似于《超级马里奥》那样的滚屏游戏。而在3D游戏里,相机的使用则非常普遍,像第一人称的相机跟随,或者第三人称的角色跟随等。
当引入相机后,屏幕中显示的内容会受到相机位置的影响。通常意义上的屏幕坐标作为全局坐标,在相机介入时就不再适用了。相机就如同人的眼睛,人在观察物体时,可以从理论上的任意位置、以任意角度进行观察,物体的形状会因相机的位置和旋转角度而改变,这就产生了“横看成岭侧成峰”的效果。
如下图所示,相机“侧身”观察一个物体,该物体最终的显示效果是一个横着摆放而非立起来的长方体,这就是一个很好的例子。
从Cocos2d - x 3.2版本开始,我们可以轻松创建一个相机。以下是创建透视相机的代码:
auto camera = Camera::createPerspective(60, visibleSize.width / visibleSize.height, 0.1, 100);
上述代码创建了一个透视相机。透视相机模拟了人眼看物体的规律:远小近大,平行的物体在极远处会交汇于一点(可以想象我们站在火车铁轨上瞭望的情景),这是我们最常用的相机形式。
接下来,我们需要为相机设置一个标记位(FLAG),目的是将该相机与其他相机区分开来。在一些游戏应用中,通常不止有一个相机。当存在多个相机时,我们需要标记一个物体究竟要被哪个相机“看到”,此时就需要设置物体的cameraMask,使其与相机的Flag相对应。
调用node->setCameraMask(CameraFlag::USER1, true),这样该Node及其所有子节点都会被对应Flag的相机“看到”。如果不想作用于子节点,可以将第二个默认参数设为false。需要特别注意的是,这个函数只对当前节点已存在的子节点有效,对于之后添加的节点,该函数无效,所以每次添加新节点时,请重新设置cameraMask。
相机和Node一样,可以进行位移、旋转、缩放等操作。
此外,相机还有一些特殊操作。我们可以将相机挂载在物体上,实现类似跟踪的效果;反之,也可以将物体挂载在相机上,实现物体跟随镜头的效果。例如,在FPS游戏中,屏幕上显示的枪支或手臂,就是采用类似的方法实现的。