转自:http://blog.csdn.net/notbaron/article/details/38447253
理论介绍
首先我们来看下Orbit是什意思,orbit['ɔ:bɪt][美][ˈɔrbɪt]表示 轨道; 势力范围。
然后我们来看下继承关系,如下图
这个OrbitCamera类是ActionCamera类的唯一孩子。
我们看一下这个类的create函数如下:
static OrbitCamera* create
(float t, float radius, float deltaRadius, float angleZ, float deltaAngleZ, float angleX, float deltaAngleX)
这个函数创建一个带有起始半径、半径差、起始z角、旋转z角的差、起始x角、旋转x角的差这些参数的运动视角动作类
具体步骤
我们还是在HelloWorld.cpp文件中找到
bool HelloWorld::init()函数,加入如下代码。
autoorbit1 =OrbitCamera::create(2,1,0, 0, 180, 0, 0);
auto action =Sequence::create( orbit1, orbit1->reverse(),nullptr);
auto grossini =Sprite::create("grossini.png");
addChild(grossini,0, 2);
grossini->setPosition(Vec2( 50+origin.x, visibleSize.height/2 + origin.y));
grossini->runAction(action);
运行得到图片就不发了,因为截图看不出什么效果。小伙伴们可以自己在电脑里尝试之。
代码解释
下面我们来解释下代码的含义:
autoorbit1 =OrbitCamera::create(2,1,0, 0, 180, 0, 0);//创建一个动作对象,动作完成时间是2秒,起始半径为1、半径差为0、起始z角为0、旋转z角的差为180、起始x角0、旋转x角的差0
auto grossini =Sprite::create("grossini.png");//创建一个动作,sequence表示里面的动作顺序执行。Orbit1->reverse()表示动作安装相反的方向运动。
addChild(grossini,0, 2);//添加精灵
grossini->setPosition(Vec2( 50+origin.x, visibleSize.height/2 + origin.y));//设置精灵位置
grossini->runAction(action);//精灵运行
该动作过程中,会将参数deltaAngleZ, deltaAngleX的角度转变成弧度(比如 deltaAngleZ参数为180,那么转换成弧度就是180*π/180=3.14)。
目前我们这里可以简单的先这样理解,每个精灵都有一个摄像头。然后这个摄像头可以在精灵的外围运动。就像卫星围绕着地球一样旋转一样。当卫星绕这地球运动的时候,从卫星上看到的地球是不一样的,有时候是亚洲,有时候是非洲,而有时候就可能好是美洲了。
起始半径就是卫星和地球的距离,而半径差是卫星和地球距离的变化可正可负。(不过蛤蟆实测发现好像没撒区别)
起始Z角及旋转Z角,我们目前可以理解成摄像机沿着球面的的水平方向旋转。
起始X角及旋转X角,可以理解成摄像机沿着球面的的垂直方向旋转。