메시

메시는 모델 변환을 통해서만 만들 수 있는 변경 불가능한 공유 리소스입니다. 메시는 렌더링에 사용되지만, 광선 캐스팅 쿼리에 대한 물리학적 표현을 제공하는 데에도 사용됩니다. 3D 공간에 메시를 배치하려면 EntityMeshComponent를 추가합니다.

메시 유형

ARR에는 삼각형 메시포인트 클라우드라는 두 가지 유형의 메시 리소스가 있습니다. 두 가지 유형 모두 동일한 API 클래스 Mesh로 표시됩니다. 고유한 메시 유형에 대한 동작의 사소한 차이를 제외하고, 노출된 API 기능은 동일합니다.

변환 서비스는 원본 파일 확장명별로 적절한 메시 유형을 자동으로 결정합니다. 예를 들어 FBX 파일은 항상 삼각형 메시로 변환되는 반면, PLY는 포인트 클라우드로 처리됩니다. 지원되는 파일 형식의 전체 목록은 원본 파일 형식 목록을 참조하세요.

포인트 클라우드와 삼각형 메시 변환 간에는 사용자에게 중요한 두 가지 차이점이 있습니다.

  • 포인트 클라우드 메시는 재질을 노출하지 않습니다. 포인트의 시각적 모양은 포인트별 색으로만 정의됩니다.
  • 포인트 클라우드는 장면 그래프를 노출하지 않습니다. 대신 모든 포인트가 루트 노드 엔터티에 연결됩니다.

메시 리소스 속성

Mesh 클래스 속성은 다음과 같습니다.

  • 재질: 재질의 배열입니다. 각 재질은 다른 하위 메시에서 사용됩니다. 배열의 여러 항목은 동일한 재질을 참조할 수 있습니다. 런타임 시 이 배열의 항목은 변경할 수 없지만, 재질 속성은 변경할 수 있습니다. 포인트 클라우드의 경우 이 배열이 비어 있습니다.

  • 경계: 메시 꼭짓점의 로컬 공간 AABB(축 정렬 경계 상자)입니다.

MeshComponent

MeshComponent 클래스는 메시 리소스의 인스턴스를 배치하는 데 사용됩니다. 각 MeshComponent는 단일 메시를 참조합니다. 각 하위 메시를 렌더링하는 데 사용되는 재질을 재정의할 수 있습니다.

MeshComponent 속성

  • 메시: 이 구성 요소에서 사용하는 메시 리소스입니다.

  • 재질: 메시 구성 요소 자체에 지정된 재질의 배열입니다. 배열의 길이는 항상 메시 리소스의 재질 배열과 동일합니다. 메시 기본값에서 재정의되지 않아야 하는 재질은 이 배열에서 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;
}

API 설명서

다음 단계