[Cocos2d-x] 3D関連機能のまとめ:v3.6現在

2015 年 6 月 12 日

基本

以前から3D機能はあったが、基本的に2.5D=3Dのオブジェクトを2D的に扱うためのものだった。

v3.4くらいから、本格的な3D機能が増えはじめた。

3Dオブジェクトの表示:Sprite3d

対応ファイルフォーマット

対応形式 拡張子 アニメーション対応
Wavefront Object .obj なし
Cocos2d-x 3d ad-hoc format(バイナリ形式) .c3b あり
Cocos2d-x 3d ad-hoc format(テキスト形式) .c3t あり

.c3tファイルは、基本的にデバッグのために使うだけ。

fbx-conv command-line tool

独自形式のCocos2d-x 3d ad-hoc formatは、ライブラリ付属の「fbx-conv command-line tool」を使って変換する。

fbx-conv [-a|-b|-t] FBXFile

コマンドのスイッチは以下のとおり。

  • -?: ヘルプの表示
  • -a: .c3t、.c3bの両方を出力
  • -b: .c3bのみ出力
  • -t: .c3tのみ出力

* FBXファイルの制限

  • テクスチャはひとつのみ
  • アニメーションはスケルトンアニメーションのみ
  • スケルトンはひとつのみ
  • 頂点の最大数は32767

読み込み

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

// 2D(2.5D)の場合
sprite->setPosition(Vec2(200,200));

// 3Dの場合
sprite->setPosition3D(Vec2(200,200,200));

scene->addChild(sprite);

その他

現状、Cube(立方体)やSphere(円錐形)といったシンプルなプリミティブのモデルは存在しないので、自分でモデリングツールでつくって読み込むしかない。

アニメーション:Animation3D

アニメーションの情報をまとめたクラス 実際にアニメーションさせるクラス
(Actionクラスのサブクラス)
3D Animatiton3D Animate3D
2D Animation Animate

基本は2D向けの機能と同じ。Animatiton3Dを元にAnimate3Dをつくり、Sprite3D#runAction()で実行する。

// アニメーション情報は、.c3b/.c3tファイルから取得する
auto animation = Animation3D::create("sample.c3b");

// Animation3Dインスタンスを元にAnimate3Dインスタンスを生成
auto animate = Animate3D::create(animation);

// Sprite3D#runAction()で実行
sprite->runAction(RepeatForever::create(animate));

カメラ:Camera

CameraオブジェクトもひとつのNodeとして扱う。そのため、SceneにaddChild()する必要がある。

インスタンス生成関数

perspective(透視投影) Camera::createPerspective()
orthographic(正投影) Camera::createOrthographic()
auto s = Director::getInstance()->getWinSize();

// 透視投影の場合
auto camera = Camera::createPerspective(60, (GLfloat)s.width/s.height, 1, 1000);

// 正投影の場合
// auto camera = Camera::createOrthographic(s.width, s.height, 1, 1000);

camera->setPosition3D(Vec3(0, 100, 100));
camera->lookAt(Vec3(0, 0, 0), Vec3(0, 1, 0));

scene->addChild(camera);

ライト

全部で4種類。

AmbientLight 環境光:間接光
DirectionalLight 平行光源:日光など
PointLight 点光源:電球など
SpotLight スポットライト

サンプル:DirectionalLightの場合

auto light = DirectionLight::create(Vec3(-1.0f, -1.0f, 0.0f), Color3B::RED);
scene->addChild(light);

ビルボード:BillBoard

ビルボードとは、常にカメラと正対するオブジェクト。基本的にUIなどに使う。

auto billboard = BillBoard::create("Blue_Front1.png", BillBoard::Mode::VIEW_POINT_ORIENTED);
scene->addChild(billboard);

スカイボックス:SkyBox

スカイボックスは、3Dワールドの背景に使うもの。

関連クラス

TextureCube 6面からなる立方体。スカイボックスや環境マッピングのために使う。
SkyBox スカイボックスのオブジェクト。Nodeのひとつ。

基本的に、TextureCubeをSkyBoxにセットして使う。

auto textureCube = TextureCube::create(
		"left.jpg", "right.jpg",
		"top.jpg", "bottom.jpg",
		"front.jpg", "back.jpg");

auto skyBox = Skybox::create();
skyBox->retain();

skyBox->setTexture(textureCube);
scene->addChild(_skyBox);

地形:Terrain

  • 基本的にheight mapを使う
  • テクスチャを4つまでブレンドに使える
  • ブレンド用のテクスチャは、Terrain::DetailMapのインスタンスを使って生成
  • ブレンドの重み付けのためにalpha mapを使う

関連クラス

Terrain::DetailMap ブレンド用のテクスチャ
Terrain::TerrainData 地形データ
Terrain 地形データの表示用オブジェクト

基本的に、TerrainDataを元にTerrainを

// ブレンド用テクスチャの生成
Terrain::DetailMap	dirt("TerrainTest/dirt.jpg"),
					grass("TerrainTest/Grass2.jpg"),
					road("TerrainTest/road.jpg"),
					green("TerrainTest/GreenSkin.jpg");
 
// 地形用データの生成
Terrain::TerrainData data(
		"TerrainTest/heightmap16.jpg",	// height map
		"TerrainTest/alphamap.png",		// alpha map
		dirt, grass, road, green);		// ブレンド用テクスチャ
 
// NodeとしてのTerrainを生成
_terrain = Terrain::create(data, Terrain::CrackFixedType::SKIRT);

// LODの距離を設定
_terrain->setLODDistance(3.2, 6.4, 9.6);

// LODのレベルを設定:4以下
_terrain->setMaxDetailMapAmount(4);

scene->addChild(_terrain);

所感

とりあえず3Dゲームをつくるために必要な機能は、一通りそろっている印象。

逆を言えばこの程度の機能しかなく、UnityやUnreal Engeneに比べると明らかに物足りない。カジュアルゲームなどのちょっとした3Dに使うといいだろう。

ただ、完全なオープンソースで無償というのはかなり大きい。また、最近はかなりのペースで開発が進められているので、今後にも期待できる。