lumino trail

ゲームエンジン作ってます。Github:https://github.com/lriki/Lumino Twitter:https://twitter.com/lriki8

師走と作業報告の候

一年の振り返りとかやろうとしたけど、意外と予定が詰まってしまいました。 あとでちゃんとやろう。・・・とか言いつつ積んでる記事が4つくらいあった気がします。

ひとまず、いつもの報告です。

イチからシーンを構築してレンダリングし、png に保存できるようにしました

ゲームじゃなくてツール開発向けの機能です。

ゲーム用のレンダリングは Engine クラスにいろいろ隠蔽されていますが、それを使わないでレンダリングできるようにしています。

コードはこんなイメージ。

auto world = newObject<World3D>();

// スキンメッシュのコンポーネントを作る。
auto skinnedMeshComponent = SkinnedMeshComponent::create("3Dモデルファイル");

// スキンメッシュを表示するためのオブジェクトを作り、コンポーネントを追加した後ワールドに追加する。これでレンダリングされるようになる。
auto skinnedMeshObj = newObject<WorldObject>();
skinnedMeshObj->addComponent(skinnedMeshComponent);
world->add(skinnedMeshObj);

// メッシュの境界ボックスを取得しておく。
Box aabb = skinnedMeshComponent->getSkinnedMeshModel()->getBoundingBox();

// 平行投影カメラを作る。境界ボックス全体を視界とする。
auto camera = OrthographicCamera::create();
camera->setOrthographicSize(aabb.height);
camera->setNearClip(0);
camera->setFarClip(aabb.depth);
camera->setPosition(Vector3(aabb.center.x, aabb.center.y, aabb.center.z - (aabb.depth / 2)));
camera->lookAt(aabb.center);
world->add(camera);

// 描画先レンダーターゲットを作る。
auto renderTarget = RenderTargetTexture::create(512, 512, TextureFormat::R8G8B8A8);

// OffscreenWorldRenderView を作り、レンダーターゲットと、そこへ描画するワールド、視点(カメラ) をひとつにまとめる。
auto ofs = newObject<OffscreenWorldRenderView>(world, camera->getCameraComponent());
ofs->setRenderTarget(renderTarget);
ofs->setBackgroundColor(Color::White);

// レンダリングして画像に保存
ofs->render();
ofs->getRenderTarget()->readSurface()->save("img.png");

f:id:lriki:20171231233710p:plain

シェーダがスフィアマップ対応してないとか、ちょっとまだレンダリングおかしい。

2Dイラストからドット絵アニメを自動生成したい

企画中のゲームで、パターン多めのドット絵アニメを作ろうとしています。

そんなところで、前々からディープラーニング勉強してみたかったのでこんなプランを考えました。

  1. 2Dイラストをディープラーニングで3Dボクセルマップに変換
  2. 3Dボクセルマップからメッシュモデル作成
  3. メッシュモデルにボーン入れ
  4. 必要に応じてSD化
  5. 普通にスキンメッシュアニメーション
  6. フレームをキャプチャ
  7. 手動で仕上げ(あるいは画風変換)

フォトスキャンのイラスト版みたいなイメージ。 あらゆる形状のモデルを、ってのは多分ものすごく難しいから、まずは人型で行ってみます。

んで第1版。

f:id:lriki:20171231233731p:plain

前途多難。