Skip to content

Latest commit

 

History

History
71 lines (47 loc) · 2.82 KB

10.md

File metadata and controls

71 lines (47 loc) · 2.82 KB

Chapter 10: 3D

3D Sprite

3D Actions

3D Animations

Placeholders for: Lights, Shadows, Cameras

#Camera ##介绍 相机概念自从3.3引入,相机用来观察场景中的物体。相机从Node继承,可以支持大部分Action。

cocos2d-x支持两种类型的相机,透视相机和正交相机。透视相机看的物体有近大远小的效果,正交相机看到的物体远近一样大。

透视相机示意图

正交相机示意图

##Camera的使用 每个Scene中会自动创建一个默认相机,默认相机的类型由Director::_projection来决定。如果需要多个相机或者对相机有更高级的操作要求,用户可以根据需要创建自己的相机,例如子定义的Layer的onEnter或者init中可以增加如下相机创建代码,

// create a perspective camera
auto s = Director::getInstance()->getWinSize();
Camera* camera = Camera::createPerspective(60, (GLfloat)s.width/s.height, 1, 1000);

// set parameter for camera
camera->setPosition3D(Vec3(0, 100, 100));
camera->lookAt(Vec3(0, 0, 0), Vec3(0, 1, 0));
camera->setCameraFlag(CameraFlag::USER1);
// you can also create a orthographic camera if you like
addChild(camera); //add  camera to the scene
setCameraMask(2);

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

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

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相机看到。

Camera从Node继承,所以可以支持大部分Action,可以对相机进行任意的平移旋转操作。

##常用相机介绍 一般游戏中都会有主角的概念,根据相机与主角的关系,我们将相机分成三种类型,第一人称相机,第三人称相机和自由相机。

第一人称相机,所看见的场景就是主角自己所看到的场景,相机位置大概在主角的头部,并且随着主角进行移动和旋转。

第三人称相机,以第三者的视角观察主角,并且跟随主角移动,有的也会跟随主角旋转。

自由相机,顾名思义,相机可以自由移动,不跟随主角的移动而移动。

三种相机的实现及使用方法参考CppTest中的Camera Test。