[Cocos2d-x] 3D関連機能のまとめ:v3.6現在
基本
以前から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に使うといいだろう。
ただ、完全なオープンソースで無償というのはかなり大きい。また、最近はかなりのペースで開発が進められているので、今後にも期待できる。














