3.3.1 3D 精灵

优质
小牛编辑
123浏览
2023-12-01

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

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

创建并加载:

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

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

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

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

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

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

模型附加

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

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

效果如下:

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

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

网格替换

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

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

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

auto sprite = Sprite3D::create("ReskinGirl.c3b");

// display the first coat
auto girlTop0 = sprite->getMeshByName("Girl_UpperBody01");
girlTop0->setVisible(true);

auto girlTop1 = sprite->getMeshByName("Girl_UpperBody02");
girlTop1->setVisible(false);

// swap to the second coat
girlTop0->setVisible(false);
girlTop1->setVisible(true);

效果: