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