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