[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」を使って変換する。
[bash]
fbx-conv [-a|-b|-t] FBXFile
[/bash]
コマンドのスイッチは以下のとおり。
- -?: ヘルプの表示
- -a: .c3t、.c3bの両方を出力
- -b: .c3bのみ出力
- -t: .c3tのみ出力
* FBXファイルの制限
- テクスチャはひとつのみ
- アニメーションはスケルトンアニメーションのみ
- スケルトンはひとつのみ
- 頂点の最大数は32767
読み込み
[cpp]
auto sprite = Sprite3D::create(“sample.c3b");
// 2D(2.5D)の場合
sprite->setPosition(Vec2(200,200));
// 3Dの場合
sprite->setPosition3D(Vec2(200,200,200));
scene->addChild(sprite);
[/cpp]
その他
現状、Cube(立方体)やSphere(円錐形)といったシンプルなプリミティブのモデルは存在しないので、自分でモデリングツールでつくって読み込むしかない。
アニメーション:Animation3D
アニメーションの情報をまとめたクラス | 実際にアニメーションさせるクラス (Actionクラスのサブクラス) |
|
3D | Animatiton3D | Animate3D |
2D | Animation | Animate |
基本は2D向けの機能と同じ。Animatiton3Dを元にAnimate3Dをつくり、Sprite3D#runAction()で実行する。
[cpp]
// アニメーション情報は、.c3b/.c3tファイルから取得する
auto animation = Animation3D::create(“sample.c3b");
// Animation3Dインスタンスを元にAnimate3Dインスタンスを生成
auto animate = Animate3D::create(animation);
// Sprite3D#runAction()で実行
sprite->runAction(RepeatForever::create(animate));
[/cpp]
カメラ:Camera
CameraオブジェクトもひとつのNodeとして扱う。そのため、SceneにaddChild()する必要がある。
インスタンス生成関数
perspective(透視投影) | Camera::createPerspective() |
orthographic(正投影) | Camera::createOrthographic() |
[cpp]
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);
[/cpp]
ライト
全部で4種類。
AmbientLight | 環境光:間接光 |
DirectionalLight | 平行光源:日光など |
PointLight | 点光源:電球など |
SpotLight | スポットライト |
サンプル:DirectionalLightの場合
[cpp]
auto light = DirectionLight::create(Vec3(-1.0f, -1.0f, 0.0f), Color3B::RED);
scene->addChild(light);
[/cpp]
ビルボード:BillBoard
ビルボードとは、常にカメラと正対するオブジェクト。基本的にUIなどに使う。
[cpp]
auto billboard = BillBoard::create(“Blue_Front1.png", BillBoard::Mode::VIEW_POINT_ORIENTED);
scene->addChild(billboard);
[/cpp]
スカイボックス:SkyBox
スカイボックスは、3Dワールドの背景に使うもの。
関連クラス
TextureCube | 6面からなる立方体。スカイボックスや環境マッピングのために使う。 |
SkyBox | スカイボックスのオブジェクト。Nodeのひとつ。 |
基本的に、TextureCubeをSkyBoxにセットして使う。
[cpp]
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);
[/cpp]
地形:Terrain
- 基本的にheight mapを使う
- テクスチャを4つまでブレンドに使える
- ブレンド用のテクスチャは、Terrain::DetailMapのインスタンスを使って生成
- ブレンドの重み付けのためにalpha mapを使う
関連クラス
Terrain::DetailMap | ブレンド用のテクスチャ |
Terrain::TerrainData | 地形データ |
Terrain | 地形データの表示用オブジェクト |
基本的に、TerrainDataを元にTerrainを
[cpp]
// ブレンド用テクスチャの生成
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);
[/cpp]
所感
とりあえず3Dゲームをつくるために必要な機能は、一通りそろっている印象。
逆を言えばこの程度の機能しかなく、UnityやUnreal Engeneに比べると明らかに物足りない。カジュアルゲームなどのちょっとした3Dに使うといいだろう。
ただ、完全なオープンソースで無償というのはかなり大きい。また、最近はかなりのペースで開発が進められているので、今後にも期待できる。