• 3D 精灵
    • 模型附加
    • 网格替换

    3D 精灵

    就像 2D 游戏一样,3D 游戏也有精灵对象,Cocos2d-x 提供的 3D 精灵对象是 Sprite3D,3D 空间位置有三个方向的自由度,类似的 Sprite3D 的位置由 (x, y, z) 三个坐标值决定。

    Sprite3D 在许多方面都和普通的 Sprite 一样。

    创建并加载:

    1. auto sprite = Sprite3D::create("boss.c3b"); //c3b file, created with the FBX-converter
    2. sprite->setScale(5.f); //sets the object scale in float
    3. sprite->setPosition(Vec2(200,200)); //sets sprite position
    4. scene->addChild(sprite,1); //adds sprite to scene, z-index: 1

    这个对象是通过 .c3b 文件创建的,效果是这样:

    3D 精灵  - 图1

    创建一个动作使这个模型不断旋转:

    1. //rotate around the X axis
    2. auto rotation = RotateBy::create(15, Vec3(0, 360, 0));
    3. //our sprite object runs the action
    4. sprite->runAction(RepeatForever::create(rotation));

    设置锚点,与 Sprite 方法一样:

    1. sprite->setAnchorPoint(Point(0.0f,0.0f));

    模型附加

    回想一下,3D 模型是网格的集合,网格可以再组合,所以为了创建丰富的效果,你可以将 3D 模型附加到其它 3D 模型。

    一个例子是向一个角色添加一把武器。 首先使用 getAttachNode(attachment_point_name) 获取到附加点,然后使用 addChild() 方法把武器模型添加上去。

    效果如下:

    1. auto sp = Sprite3D::create("axe.c3b");
    2. sprite->getAttachNode("Bip001 R Hand")->addChild(sp);

    3D 精灵  - 图2

    以此为例,结合多个简单的模型,你就能创建复杂的模型。

    网格替换

    进行 3D 游戏开发时,你可能需要对模型进行动态更改。 如果创建的模型是由网格组成,那你就能通过 getMeshByIndex() getMeshByName() 访问到网格数据,然后进行一些控制。 比如使用这个功能替换一个角色的武器或者衣服。

    以一个穿着外套的角色为例:

    3D 精灵  - 图3

    我们通过使用网格对象,替换掉外套,下面是演示代码:

    1. auto sprite = Sprite3D::create("ReskinGirl.c3b");
    2. // display the first coat
    3. auto girlTop0 = sprite->getMeshByName("Girl_UpperBody01");
    4. girlTop0->setVisible(true);
    5. auto girlTop1 = sprite->getMeshByName("Girl_UpperBody02");
    6. girlTop1->setVisible(false);
    7. // swap to the second coat
    8. girlTop0->setVisible(false);
    9. girlTop1->setVisible(true);

    效果:

    3D 精灵  - 图4