メッシュ
メッシュは、変更できない共有リソースであり、モデル変換でのみ作成できます。 メッシュはレンダリングに使用されますが、レイ キャスト クエリの物理表現も提供します。 3D 空間にメッシュを配置するには、エンティティに MeshComponent を追加します。
メッシュの種類
ARR には、三角形メッシュとポイント クラウドの 2 種類のメッシュ リソースがあります。 どちらの型も同じ API クラス Mesh
で表されます。 異なるメッシュ タイプの動作のわずかな違い以外は、公開されている API 機能は同じです。
変換サービスは、ソース ファイル拡張子によって適切なメッシュの種類を自動的に決定します。 たとえば、FBX ファイルは常に三角形のメッシュとして変換されますが、PLY はポイント クラウドとして扱われます。 サポートされているファイル形式の完全な一覧については、「ソース ファイル形式」の一覧を参照してください。
ポイント クラウドと三角形メッシュの変換には、ユーザーにとって 2 つの大きな違いがあります。
- ポイント クラウド メッシュでは、素材は公開されません。 ポイントの視覚的な外観は、ポイントごとの色でのみ定義されています。
- ポイント クラウドではシーン グラフは公開されません。 代わりに、すべてのポイントがルート ノード エンティティにアタッチされます。
メッシュ リソースのプロパティ
Mesh
クラスのプロパティは次のとおりです。
Materials: 素材の配列。 各素材は、異なるサブメッシュによって使用されます。 配列内の複数のエントリが、同じ素材を参照している場合があります。 この配列内のエントリは実行時に変更することはできませんが、素材プロパティは変更できます。 ポイント クラウドの場合、この配列は空です。
Bounds: メッシュの頂点のローカル空間の軸平行境界ボックス (AABB)。
MeshComponent
MeshComponent
クラスは、メッシュ リソースのインスタンスを配置するために使用されます。 各 MeshComponent は単一のメッシュを参照します。 これは、各サブメッシュのレンダリングに使用される素材をオーバーライドできます。
MeshComponent のプロパティ
Mesh: このコンポーネントによって使用されるメッシュ リソース。
Materials: メッシュ コンポーネント自体に指定されている素材の配列。 配列は、メッシュ リソースの素材配列と常に同じ長さになります。 メッシュの既定値からオーバーライドされない素材は、この配列で null 値に設定されます。
UsedMaterials: 各サブメッシュで実際に使用される素材の配列。 null 以外の値の場合、素材配列のデータと同じになります。 それ以外の場合は、メッシュ インスタンス内の素材配列の値を格納します。 この配列は読み取り専用です。
メッシュの共有
Mesh
リソースはメッシュ コンポーネントの複数のインスタンス間で共有できます。 また、メッシュ コンポーネントに割り当てられている Mesh
リソースはいつでもプログラムを利用して変更できます。 下のコードはメッシュの複製方法を示しています。
Entity CloneEntityWithModel(RenderingConnection api, Entity sourceEntity)
{
MeshComponent meshComp = sourceEntity.FindComponentOfType<MeshComponent>();
if (meshComp != null)
{
Entity newEntity = api.CreateEntity();
MeshComponent newMeshComp = api.CreateComponent(ObjectType.MeshComponent, newEntity) as MeshComponent;
newMeshComp.Mesh = meshComp.Mesh; // share the mesh
return newEntity;
}
return null;
}
ApiHandle<Entity> CloneEntityWithModel(ApiHandle<RenderingConnection> api, ApiHandle<Entity> sourceEntity)
{
if (ApiHandle<MeshComponent> meshComp = sourceEntity->FindComponentOfType<MeshComponent>())
{
ApiHandle<Entity> newEntity = *api->CreateEntity();
ApiHandle<MeshComponent> newMeshComp = api->CreateComponent(ObjectType::MeshComponent, newEntity)->as<RemoteRendering::MeshComponent>();
newMeshComp->SetMesh(meshComp->GetMesh()); // share the mesh
return newEntity;
}
return nullptr;
}