LuminoEngine / Lumino

Lumino is a framework for building real-time graphics applications.
https://luminoengine.github.io
MIT License
207 stars 14 forks source link

MeshModel 再設計 #156

Open lriki opened 4 years ago

lriki commented 4 years ago

Proposal

Instantiate

WorldObject を作るときは次のようにできるようにする。

auto model = MeshModel::load(u"model.gltf");
auto obj1 = StaticMesh::create(model);
auto obj2 = SkinnedMesh::create(model);

現行↓

auto model1 = StaticMeshModel::load(u"model.gltf");
auto model2 = SkinnedMeshModel::load(u"model.gltf");
auto obj1 = StaticMesh::create(model1);
auto obj2 = SkinnedMesh::create(model2);

動的データの操作

WorldObject(Component) からアクセスする。

auto obj2 = SkinnedMesh::create(model);

// フォーマルな方法
SkinnedMeshBone* bone = obj2->skinnedMeshComponent()->findBone(u"腕");
bone->setRotation(...);

// ユーティリティ
SkinnedMeshBone* bone = obj2->findBone(u"腕");
bone->setRotation(...);

SkinnedMeshBone は Transform の派生とし、Editor 上からアクセスできるようにする。 (Unity と同じ仕組み)

Motivation

データの分離

MeshModel(StaticMeshModel と SkinnedMeshModel) は静的なデータと動的なデータが統合されていて、リソースの共有が難しい。 これを分離したい。

静的なデータは次の通り。

動的なデータは次の通り。

継承関係の廃止

SkinnedMeshModel は StaticMeshModel の派生クラスとなっているが、 例えば .gltf をインポートしただけではどちらのインスタンスを作るべきか判断できないことがある。 そのため MeshModel クラスに統合し、Bone の有無などはコンポーネント志向の考え方で持たせたい。

Note

Model:Instance の対応関係は次のようなイメージ

*: ユーザープログラムに積極的に公開することになるクラス。